Live-Forum - Die aktuellen Beiträge
Datum
Titel
02.12.2024 13:15:39
02.12.2024 12:41:41
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender Navigationstipps
Inhaltsverzeichnis

Ä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

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
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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige
Archiv - Verwandte Themen
Forumthread
Beiträge