Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1208to1212
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Änderungsverfolgung

Änderungsverfolgung
Hans
Hallo,
ich versuche als VBA-Unkundiger mir im Internet VBA-Codes zusammenzustellen, um in Excel eine Änderungsverfolgung zu dokumentieren. Nun habe ich 2 Codes gefunden, die jeder Einzelne für sich laufen:
1. Dieser Code schreibt eine Logdatei in einen anzulegenden Unterordner Archiv:
-------------------------
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Const Logfilename = "\Archiv\\Aenderungen_log.csv"
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 = Environ("Username")    '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, Now & ", " & 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, Now & ", " & 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 Range)
AlterWert = ActiveCell.Value
End Sub

---------------------------------
2. Dieser Code schreibt mir Datum und Uhrzeit der letzten Sicherung in eine Zelle:
---------------------------------
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Sheets(2).Cells(1, 1) = Application.UserName
Sheets(2).Cells(1, 2) = Date
Sheets(2).Cells(1, 3) = Time
End Sub

---------------------------------
Nun möchte ich erstens beide Codes in eine Excel-Mappe integrieren. Jeder Code alleine funktioniert in einer Exceldatei. Wenn ich aber bspw. den 2.Code versuche, in die Mappe zu integrieren, in der der erste Code läuft, wird der 2. Code nicht ausgeführt.
Zusätzlich benötige ich noch folgendes Feature:
Wenn der erste Code eine Zeile in die Logdatei schreibt, hat es eine Änderung gegeben. Damit soll ein Flag gesetzt werden. Beim 2. Code soll beim Speichern nur das neue Datum genommen werden, wenn dieser Flag gesetzt ist, also nur wenn tatsächlich eine Änderung war. Ein reines Speichern ohne Inhaltsänderung soll nicht zu einem geänderten Datum führen.
Es wäre prima, wenn mir jemand die beiden Codes zusammenführen könnte - für einen Experten sicherlich ein Kinderspiel, für einen VBA-Ahnungslosen eine unlösbare Aufgabe :-)
Freundliche Grüße
Hans

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Änderungsverfolgung
25.04.2011 19:51:20
mpb
Hallo Hans,
wohin hast Du denn die Codes kopiert. Der erste gehört in das Klassenmodul der entsprechenden Tabelle, der zweite in das Klassenmodul der Datei selbst (DieseArbeitsmappe im Projektexplorer).
Gruß
Martin
AW: Änderungsverfolgung
25.04.2011 19:57:45
Hans
Hallo Martin,
danke, das war der erste Schritt, nun funktionieren beide Makros in der gleichen Datei.
Kannst Du ach beim Zusatzfeature helfen?
Idealerweise würde dann in der Datei sowohl die letzte Änderung stehen (zusätzlich zum Eintrag in der Logdatei) und das letzte datum der Änderung nicht des Speicherns.
Gruß Hans
AW: Änderungsverfolgung
25.04.2011 20:19:33
fcs
Hallo Hans,
hier eine Beispieldatei, in der ich deine Prozeduren eingebaut und angepasst. Wichtig ist dabei, dass die SaveFlag-Variable als Public in einem Modul deklariert wird und die Ereignismakros vor dem Eintragen von User und Speicherzeit deaktiviert werden, da sich sonst ggf. das Makro in einer Endlosschleife festlaufen kann. Dein 1. Code muss im VBA-Editor und dem Tabellenblatt eingefügt sein, dessen Änderungen verfolgt werden sollen. Der 2. Code unter DieseArbeitsmappe.
https://www.herber.de/bbs/user/74544.xls
Außerdem hab ich die Anweisungen zum Ermitteln der Zelladresse der geänderten Zelle(n) optimiert. Dein Weg war unnötig kompliziert.
Gruß
Franz
Anzeige
AW: Änderungsverfolgung
25.04.2011 20:25:11
Hans
Hallo Franz,
beim Testen Deiner Datei erscheint "aufzeitfehler 91", "Objektvariable oder With-Blockvariable nicht festgelegt". Ich hatte nur den Eintrag in Zelle D8 mit xxx überschrieben.
Gruß
Hans
AW: Änderungsverfolgung
25.04.2011 20:33:25
fcs
Hallo Hans,
ersetze im Folgenden Zelle durch Target
  If Target.Cells.Count = 1 Then
Print #1, Now & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & _
Replace(Zelle.Address(ReferenceStyle:=xlA1), "$", "") & Chr(13) & _
"alter Wert = """ & AlterWert & """" & Chr(13) & _
"neuer Wert = """ & Target.Text & """" & Chr(13)
Else
ändern in
If Target.Cells.Count = 1 Then
Print #1, Now & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & _
Replace(Target.Address(ReferenceStyle:=xlA1), "$", "") & Chr(13) & _
"alter Wert = """ & AlterWert & """" & Chr(13) & _
"neuer Wert = """ & Target.Text & """" & Chr(13)
Else
Gruß
Franz
Anzeige
AW: Änderungsverfolgung
25.04.2011 20:41:14
Hans
Hallo Franz,
danke, auch das funktioniert jetzt prima ohne Fehlermeldung
Bleibt der letzte Punkt:
Im Tabellenblatt2 in der zweiten Zeile den kompletten Text hinschreiben, der als letzter Eintrag im Logfile eingetragen wurde.
Gruß
Hans
AW: Änderungsverfolgung
25.04.2011 21:22:22
fcs
Hallo Hans,
dann ist es am zweckmäßigsten, wenn der Änderungstext in eine Variable geschrieben wird und nach dem speichern in der Textdatei im Tabellenblatt eingetragen wird.
Für eine leserfreundlichere Darstellung solltest du im 2. Tabellenblatt die Ausrichtung der Zellen A2:F2 wie folgt anpassen:
horizontale Ausrichtung: zentriert über Auswahl
Zeilenumbruch: aktivieren
Gruß
Franz
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Const Logfilename = "\Archiv\\Aenderungen_log.csv"
Dim User As String
Dim Protokoll As Long
Dim Logfile As String
Dim Zelle As Range
Dim sText As String
SaveFlag = True
User = Environ("Username")    'UserName()
Logfile = ActiveWorkbook.Path & Logfilename ' Logfile im gleichen Pfad ablegen, wie die Excel- _
_
Datei.
Open Logfile For Append As #1
' 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
sText = Now & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name & ", " & _
Replace(Target.Address(ReferenceStyle:=xlA1), "$", "") & Chr(13) & _
"alter Wert = """ & AlterWert & """" & Chr(13) & _
"neuer Wert = """ & Target.Text & """" & Chr(13)
Print #1, sText
Else
For Each Zelle In Target
sText = sText & Now & ", " & User & ": " & "geänderter Bereich = " & ActiveSheet.Name _
& ", " & _
Replace(Zelle.Address(ReferenceStyle:=xlA1), "$", "") & Chr(13) & _
"alter Wert = """ & "nicht zu ermitteln" & """" & Chr(13) & _
"neuer Wert = """ & Zelle.Text & """" & Chr(13)
Next Zelle
Print #1, sText
End If
Close #1
Application.EnableEvents = False
'Änderungstext in Blatt 2 eintragen, dabei Absatzschaltung durch Zeilenschaltung ersetzen
Sheets(2).Cells(2, 1).Value = Replace(sText, Chr(13), Chr(10))
Application.EnableEvents = True
End Sub

Anzeige
AW: Änderungsverfolgung
25.04.2011 21:40:27
Hans
Hallo Franz,
danke, jetzt funktioniert alles, wie gewünscht. Danke an Dich und Martin für die Hilfestellung.
Gruß
Hans
AW: Änderungsverfolgung
26.04.2011 12:39:12
Hans
Hallo,
bitte doch noch eine Hilfestellung:
In den Makros steht bspw.:
Sheets(2).Cells(2,1)
Damit wird der Text immer in das an 2. Stelle gesetzte Tabellenblatt geschrieben. Sobald jemand das Blatt verschiebt, funktioniert es nicht mehr.
Wie kann ich statt der (2) für das 2. Tabellenblatt den Namen des Tabellenblatts im Makro angeben und damit sollte es funktionieren, auch wenn die reihenfolge der Tabellenblätter geändert wird?
Gruß
Hans
Anzeige
AW: Änderungsverfolgung
26.04.2011 12:47:53
hary
Hallo Hans
versuchs mal statt mit

Sheets(2).Cells(2,1)

mit Tabellenblattname

Sheets("hier Name").Cells(2,1)

den Tabellennamen in Gaensefuesse.
gruss hary

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige