# Änderungen in EXCEL dokumentieren



## josef24 (29. März 2020)

Hallo, in die Runde und einen hoffentlich schönen Sonntag wünsche ich.
Ich hätte da nochmal eine Frage zum Dokumentieren von Änderungen in einer EXCEL Tabelle. Ich habe eine EXCEL Tabelle mit VBA Code der mir Änderungen im gesonderten Tabellenblatt dokumentieren soll. Es geht von Spalte "A" bis "E" auch perfekt. Ab Spalte "F" wird aber nichts mehr dokumentiert was  ich aber noch gerne hätte. Ebenfalls bleibe einige Spalten leer (Datum, Zeit), die wie ich glaubte, auch befüllt werden sollten. Ich bitte mal um Unterstützung, weil ich mit meinen geringen Kenntnissen hier am Ende bin.
Hänge mal eine Beispieldatei hier an. Für mögliche Unterstützung Danke im Voraus. Bleibt alle Gesund und Gruß, Josef


----------



## Zvoni (29. März 2020)

Kann erst Mittwoch wieder (Kurzarbeit wegen Corona, kein Excel zuhause, bin Linuxer), aber ich hab sowas mal für eine Sache bei uns in der Firma implementiert.
Falls es so lange warten kann, schau ich es mir an.


----------



## josef24 (30. März 2020)

Danke, leide bei dem Thema nicht unter Zeitdruck. Gruß Josef


----------



## Zvoni (6. April 2020)

Hallo Josef,

habs mir jetzt mal angeschaut.
Du hast im Prinzip zwei Möglichkeiten, dein Protokoll zu implementieren.
Der Trick besteht darin, den alten Wert vor der Änderung auszulesen, nachdem die "Änderung" abgeschlossen ist, den neuen Wert mit dem alten zu vergleichen, falls ungleich, protokollieren.
In "reinem" Excel geht das über eine Kombination aus "Selection_Change"-Ereignis und "Change"-Ereignis.
Selection_Change feuert, wenn du auf eine andere Zelle springst, und Target steht auf der "neuen" Zelle (In einer UserForm-Textbox wäre das das "Enter"-Ereignis). Hier holst du dir den "alten" (=aktuellen) Wert in eine Variable.
Das "Change"-Ereignis feuert nachdem du etwas in der Zelle geändert hast UND in eine andere Zelle springst (welches wiederum das Selection_Change mit Bezug auf die neue Zelle auslöst).
Hier hast du aber das Problem, dass du den Bezug zur "alten" Zelle verlierst.
Lösung: Speicher im Selection_Change zusätzlich zum Wert auch die Koordinaten der "alten" Zelle (bzw. es ist ja die aktuelle Zelle), oder speicher es halt gleich in einer globalen Range-Variablen.
D.h. im Change-Ereignis kannst du in der allerersten Zeile auf diese "globale" Variable auf die vorhergehende Zelle zugreifen, deine Checks machen, ggf. protokollieren, und dann weiter.
Nachteil des Ganzen: Funktioniert natürlich nur, wenn du im Excel-Blatt selbst hin- und her springst.

In einer UserForm ist es aber noch einfacher: Jedesmal wenn du einen Satz aufrufst, schreibst du alle aktuellen Werte in eine Variable (kann ein UDT sein, ein Array, suchs dir aus), und beim Click auf speichern vergleichst du die Variable( n) mit den neuen Werten, und protokollierst gegebenenfalls.

Falls du noch Fragen hast, nur her damit.


----------



## josef24 (6. April 2020)

Danke erstmal. Ich hab dann noch eine Frage, wo ich nicht weiter weis. Die notwendigen Schritte hatte ich im Netz gefunden. Wenn ich aber den Code ausführen lasse so kommt die Fehlermeldung "Fehler beim Kompilieren. Mehrdeutiger Name, Worhsheet_selectioncange. 
Hier in diesem Schritt komme ich nicht weiter.



```
Private Sub Worksheet_selectionChange(ByVal Target As Range)
Dim wks As Worksheet
Dim lngLast As Long
 
Set wks = Worksheets("Info")
lngLast = wks.Range("A65536").End(xlUp).Row + 1
 
If Target.Count > 1 Then Exit Sub
If Intersect(Range("A2:Z20"), Target) Is Nothing Then Exit Sub
 
With wks
    .Range("A" & lngLast).Value = Target.Address(0, 0)
    .Range("B" & lngLast).Value = mvntWert
    .Range("C" & lngLast).Value = Target.Value
    .Range("D" & lngLast).Value = VBA.Environ("Username")
    .Range("E" & lngLast).Value = Now
End With
End Sub
 
Private Sub Worksheet_selectionChange(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
If Intersect(Range("A2:Z20"), Target) Is Nothing Then Exit Sub
mvntWert = Target.Value
End Sub
```


----------



## Zvoni (6. April 2020)

Du hast zweimal Private Sub Worksheet_SelectionChange (im gleichen Blatt?)
Das geht nicht.
Ich geh mal davon aus, dass mvntWert eine (globale) Variable ist, welche Target.Value aufnimmt.
Setz das als erste Zeile im oberen SelectionChange ein (bzw. füge es unter die Intersect-Zeile in der ersten Prozedur ein), und schmeiss die zweite Prozedur komplett raus


----------



## josef24 (6. April 2020)

Danke, aber kann das nicht umsetzten, versuch fehlgeschlagen. Gruß


----------

