Änderungen aus Tabellenblättern protokollieren

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Änderungen aus Tabellenblättern protokollieren
von: Silvio
Geschrieben am: 05.11.2003 12:02:25

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

Bild


Betrifft: AW: Änderungen aus Tabellenblättern protokollieren
von: Harald Kapp
Geschrieben am: 05.11.2003 12:40:17

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


Bild


Betrifft: AW: Änderungen aus Tabellenblättern protokollieren
von: Silvio
Geschrieben am: 05.11.2003 13:28:56

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


Bild


Betrifft: AW: Änderungen aus Tabellenblättern protokollieren
von: Harald Kapp
Geschrieben am: 05.11.2003 13:46:20

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


Bild


Betrifft: AW: Änderungen aus Tabellenblättern protokollieren
von: Silvio
Geschrieben am: 05.11.2003 13:52:38

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


Bild


Betrifft: AW: Änderungen aus Tabellenblättern protokollieren
von: Harald Kapp
Geschrieben am: 05.11.2003 14:15:46

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


Bild


Betrifft: AW: Änderungen aus Tabellenblättern protokollieren
von: Silvio
Geschrieben am: 05.11.2003 14:42:54

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ß


Bild


Betrifft: AW: zu guter Letzt
von: Harald Kapp
Geschrieben am: 06.11.2003 08:19:06

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


Bild


Betrifft: Dankeschön! :o)
von: Silvio
Geschrieben am: 06.11.2003 09:20:18

Hallo Harald,

vielen Dank für deine Erklärungen.

Schönen Tag noch

Silvio


Bild

Beiträge aus den Excel-Beispielen zum Thema " Änderungen aus Tabellenblättern protokollieren"