Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Änderungen aus Tabellenblättern protokollieren

Forumthread: Änderungen aus Tabellenblättern protokollieren

Änderungen aus Tabellenblättern protokollieren
05.11.2003 12:02:25
Silvio
Hallo alle zusammen!

Habe userform mit der ich die verschiedensten Dinge erledigen kann. Unter anderen werden auf Excel-Tabellen geöffnet (auch welche mit mehreren Tabellenblättern) in denen der Benutzer Änderungen vornehmen kann. Ich möchte aber diese Änderungen überwachen. Würde also gern per Makro aus der Userform herraus die Änderungen der einzelnen Tabellen/Tabellenblätter anzeigen lassen. Die Dateien stehen im Netzwerk. Läßt sich auch anzeigen, welcher Nutzer die Änderungen vorgenommen hat?

Danke schonmal allen, die mithelfen
Mahlzeit, Silvio
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Änderungen aus Tabellenblättern protokollieren
05.11.2003 12:40:17
Harald Kapp
Hallo Silvio,
mit Vorsicht zu genießen wäre z.B. folgende Implementierung (jeweils im Codemodul des dazu gehörigen Arbeitsblattes einzugeben):

' Protokollierung von Änderungen in dem zugehörigen Arbeitsblatt.
' Es werden Wertänderungen einzelner Zellen protokolliert mit altem und neuem Wert.
' Änderungen in der Formatierung oder an Kommentaren werden nicht registriert.
'
' 2003-04-14
' Harald Kapp


Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Const Logfilename = "\Archiv\\Aenderungen_log.txt"
Dim User As String
Dim Protokoll As Long
Dim Logfile As String
Dim Zelle As Range
Dim S_Alpha As String
User = UserName()
Logfile = ActiveWorkbook.Path & Logfilename ' Logfile im gleichen Pfad ablegen, wie die Excel-Datei.
Open Logfile For Append As #1
If Target.Column > 26 Then
S_Alpha = Chr(Asc("A") + (Target.Column \ 26) - 1) & Chr(Asc("A") + (Target.Column Mod 26) - 1) '  = div-Operator
Else
S_Alpha = Chr(Asc("A") + Target.Column - 1)
End If
Chr (Asc("A") + Target.Column - 1)
If Target.Cells.Count = 1 Then
Print #1, Date & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & S_Alpha & Target.Row & Chr(13) & _
"alter Wert = """ & AlterWert & """" & Chr(13) & _
"neuer Wert = """ & Target.Text & """" & Chr(13)
Else
For Each Zelle In Target
Print #1, Date & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & S_Alpha & Zelle.Row & Chr(13) & _
"alter Wert = """ & "nicht zu ermitteln" & """" & Chr(13) & _
"neuer Wert = """ & Zelle.Text & """" & Chr(13)
Next Zelle
End If
Close #1
End Sub



Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
AlterWert = Target ' Wert sichern, wenn neue Zelle selektiert wird. Ersatz für ein "Before_Change" Ereignis.
End Sub


Function UserName() As String
Dim B As String * 100
Dim L As Long
L = 100
GetUserName B, L
UserName = Left(B, L - 1)
End Function


Gruß Harald

P.S.: In gewisse Weise werden hier personenbezogene Daten gespeichert (wer hat wann was geändert). Das könnte ggfls. zustimmungspflichtig sein oder gar unzulässig! Verwende den Code auf eigene Verantwortung.

Harald
Anzeige
AW: Änderungen aus Tabellenblättern protokollieren
05.11.2003 13:28:56
Silvio
Hi Harald,

danke für deinen Tipp. Die Bedenken die du hast, sind natürlich gerechtfertigt. Wenn man eine Excel-Datei freigibt und mehrere Nutzer in ihr arbeiten, kann man doch auch Änderungen verfolgen, sehen wer was dazugeschrieben hat. Kann man viell. auch da ansetzen? Ich hab nicht wirkl. viel Plan von Vba, ne einfacheres Makro geht wohl nicht?

Danke für Antwort
Silvio
Anzeige
AW: Änderungen aus Tabellenblättern protokollieren
05.11.2003 13:46:20
Harald Kapp
Hallo Sivio,
ich hab' das Makro schon recht klein gehalten. Du kannst ja mal den gesamten Code probehalber in das Codemodul einer Tabelle kopieren (Auf den Karteireiter der Tabelle mit rechter Maustaste klicken -> Code anzeigen-> im VBA-Editor den obigen Code einfügen).
Im Arbeitspfad der Excel-Tabelle legst Du manuell einen Ordner "Archiv" an (also z.B. Tabelle in c:\Temp\bla.xls, dann Ordner c:\temp\Archiv anlegen).
Dann sollte das Makro schon funktionieren. Es legt im Archivordner ein Logfile an, in dem die Änderungen protokolliert werden.

Mit der Änderungsverfolgung bei freigegebener Excel-Datei geht das nicht ganz so einfach. Die Bedenken bezüglich des Datenschutzes würden aber auch da gelten.

Gruß Harald
Anzeige
AW: Änderungen aus Tabellenblättern protokollieren
05.11.2003 13:52:38
Silvio
Hallo Harald,

erstmal nochmal schönen Dank für deine Mühe. Mal schauen wie ich das nun mache. Um mich weiterzubilden, kennst du event. gute Publikationen zu dem Thema Excel und Vba? Am besten wäre etwas, was es kostenlos und online gibt.

Gruß Silvio
AW: Änderungen aus Tabellenblättern protokollieren
05.11.2003 14:15:46
Harald Kapp
Sorry, Silvio,
das Meiste habe ich mir peu a peu angelernt. Leider kene ich keine entsprechende Literatur.

Zu Access hatte ich mal einen billigen Ratgeber aus dem BHV-Verlag (ca. 20Euro inkl. Demo-CD) geholt, der mir sehr geholfen hat, in ACCESS einzusteigen. Darin wurde meiner Erinnerung nach auch das Thema ACCESS<>EXCEL behandelt. Bei dem Preis kan man wenig falsch machen.

Harald
Anzeige
AW: Änderungen aus Tabellenblättern protokollieren
05.11.2003 14:42:54
Silvio
Danke nochmal!!

Hättest du event. Zeit, mir die einzelnen Dinge aus deinen Makro zu erklären? Muß nicht lang und breit sein. Nur kurz, damit ich viell. weiß, was manches bedeutet und ich so viell. etwas mehr in Vba durchsteige.

Gruß
AW: zu guter Letzt
06.11.2003 08:19:06
Harald Kapp
Hallo Silvio,
siehe Kommentare.


Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Const Logfilename = "\Archiv\\Aenderungen_log.txt"
Dim User As String
Dim Protokoll As Long
Dim Logfile As String
Dim Zelle As Range
Dim S_Alpha As String ' Variable für den String, der der Spalztennummer entspricht (1=A, 2=B, 26=Z, 27=AA...
User = UserName()
Logfile = ActiveWorkbook.Path & Logfilename ' Logfile im gleichen Pfad ablegen, wie die Excel-Datei.
Open Logfile For Append As #1
' Behandlung der Spalten>Z, da dann mit AA, AB etc. weitergemacht wird.
If Target.Column > 26 Then
S_Alpha = Chr(Asc("A") + (Target.Column \ 26) - 1) & Chr(Asc("A") + (Target.Column Mod 26) - 1) '  = div-Operator
Else
S_Alpha = Chr(Asc("A") + Target.Column - 1)
End If
'   Chr (Asc("A") + Target.Column - 1) oops, diese Zeile ist wohl überflüssig. Überbleibsel vom Testen
' Wurde 1 Zelle geändert (count=1) oder mehrere (Else-Zweig) ?
' Die Print-Anweisung schreibt einfach den dahinter mit & gebildeten Stringg in das Logfile
If Target.Cells.Count = 1 Then
Print #1, Date & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & S_Alpha & Target.Row & Chr(13) & _
"alter Wert = """ & AlterWert & """" & Chr(13) & _
"neuer Wert = """ & Target.Text & """" & Chr(13)
Else
For Each Zelle In Target
Print #1, Date & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & S_Alpha & Zelle.Row & Chr(13) & _
"alter Wert = """ & "nicht zu ermitteln" & """" & Chr(13) & _
"neuer Wert = """ & Zelle.Text & """" & Chr(13)
Next Zelle
End If
Close #1
End Sub



' Diese Routine sichert lediglich VOR einer Änderung den bisherigen Wert der Zielzelle
' da nach der Änderung (wenn Sub Worksheet_Change() aufgerufen wird, siehe oben) der alte Wert nicht mehr zur Protokollierung
' zur Verfüguzng steht

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
AlterWert = Target ' Wert sichern, wenn neue Zelle selektiert wird. Ersatz für ein "Before_Change" Ereignis.
End Sub


' Fragt den User Namen vom System ab und begrenzt ihn auf max. 100 Zeichen
Function UserName() As String
Dim B As String * 100
Dim L As Long
L = 100
GetUserName B, L
UserName = Left(B, L - 1)
End Function


Mehr gibt's eigentlich nicht zu erklären.

Harald
Anzeige
Dankeschön! :o)
06.11.2003 09:20:18
Silvio
Hallo Harald,

vielen Dank für deine Erklärungen.

Schönen Tag noch

Silvio
;
Anzeige

Infobox / Tutorial

Änderungen aus Tabellenblättern protokollieren


Schritt-für-Schritt-Anleitung

Um Änderungen in Excel zu protokollieren, kannst du ein einfaches VBA-Makro verwenden. Folge diesen Schritten:

  1. Öffne die Excel-Datei, in der du Änderungen protokollieren möchtest.

  2. Klicke mit der rechten Maustaste auf den Tab des Arbeitsblatts, das du überwachen möchtest, und wähle „Code anzeigen“.

  3. Füge den folgenden VBA-Code in das Codemodul ein:

    Private Sub Worksheet_Change(ByVal Target As Excel.Range)
       Const Logfilename = "\Archiv\\Aenderungen_log.txt"
       Dim User As String
       Dim Logfile As String
       Dim Zelle As Range
       Dim S_Alpha As String
       User = UserName()
       Logfile = ActiveWorkbook.Path & Logfilename
       Open Logfile For Append As #1
       If Target.Column > 26 Then
           S_Alpha = Chr(Asc("A") + (Target.Column \ 26) - 1) & Chr(Asc("A") + (Target.Column Mod 26) - 1)
       Else
           S_Alpha = Chr(Asc("A") + Target.Column - 1)
       End If
       If Target.Cells.Count = 1 Then
           Print #1, Date & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & S_Alpha & Target.Row & Chr(13) & _
           "alter Wert = """ & AlterWert & """" & Chr(13) & _
           "neuer Wert = """ & Target.Text & """" & Chr(13)
       Else
           For Each Zelle In Target
               Print #1, Date & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & S_Alpha & Zelle.Row & Chr(13) & _
               "alter Wert = """ & "nicht zu ermitteln" & """" & Chr(13) & _
               "neuer Wert = """ & Zelle.Text & """" & Chr(13)
           Next Zelle
       End If
       Close #1
    End Sub
    
    Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
       AlterWert = Target
    End Sub
    
    Function UserName() As String
       Dim B As String * 100
       Dim L As Long
       L = 100
       GetUserName B, L
       UserName = Left(B, L - 1)
    End Function
  4. Erstelle manuell einen Ordner „Archiv“ im gleichen Verzeichnis wie die Excel-Datei.

  5. Teste das Makro, indem du Änderungen vornimmst und prüfe das Logfile im Archiv-Ordner.


Häufige Fehler und Lösungen

  • Fehler: Das Logfile wird nicht erstellt.

    • Lösung: Stelle sicher, dass der Ordner „Archiv“ existiert und dass du Schreibrechte für das Verzeichnis hast.
  • Fehler: Die Protokollierung funktioniert nicht bei mehreren Änderungen.

    • Lösung: Der Code ist so konzipiert, dass er mehrere Änderungen erfassen kann. Überprüfe, ob die Zellen korrekt ausgewählt sind.

Alternative Methoden

Neben VBA gibt es auch die Möglichkeit, die „Änderungsverfolgung“ in Excel zu aktivieren, wenn du mit freigegebenen Arbeitsmappen arbeitest. Diese Funktion zeigt dir, wer was geändert hat, jedoch ist sie nicht so detailliert wie die VBA-Lösung.

  1. Aktiviere die Änderungsverfolgung über „Überprüfen“ > „Änderungen nachverfolgen“ > „Änderungen hervorheben“.
  2. Diese Methode ist jedoch nur in bestimmten Excel-Versionen verfügbar.

Praktische Beispiele

Hier sind einige Anwendungsfälle, in denen die Protokollierung von Änderungen nützlich sein kann:

  • Teamarbeit: Wenn mehrere Benutzer an einem Arbeitsblatt arbeiten, kannst du genau sehen, wer welche Änderungen vorgenommen hat.
  • Datenintegrität: Bei sensiblen Daten, wie Finanzen oder Kundeninformationen, hilft das Protokoll dabei, Änderungen nachzuvollziehen und Fehler zu identifizieren.

Verwende das genannte VBA-Makro, um die Änderungen zu protokollieren und die „Änderungshistorie“ zu führen.


Tipps für Profis

  • Erweitere das Makro: Du kannst das Makro anpassen, um auch Formatänderungen oder Kommentare zu protokollieren, wenn du das möchtest.
  • Zugriffsrechte verwalten: Stelle sicher, dass nur autorisierte Benutzer Zugriff auf die Logfiles haben, um Datenschutzprobleme zu vermeiden.
  • Regelmäßige Backups: Erstelle regelmäßige Backups deiner Excel-Datei und der Logfiles, um Datenverlust zu vermeiden.

FAQ: Häufige Fragen

1. Wie kann ich Änderungen in mehreren Arbeitsblättern protokollieren?
Du musst den VBA-Code in jedes Arbeitsblatt einfügen, das du überwachen möchtest.

2. Ist es möglich, die Änderungen in einer Access-Datenbank zu speichern?
Ja, du kannst den VBA-Code anpassen, um Änderungen in eine Access-Datenbank zu protokollieren, anstatt in eine Textdatei.

3. Wo finde ich weitere Informationen über Excel VBA und Protokollierung?
Es gibt viele kostenlose Online-Ressourcen und Foren, in denen du mehr über Excel VBA und das Protokollieren von Änderungen lernen kannst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige