Excel Änderungsprotokoll mit VBA
#1
Moin allerseits, an meinen Tabellen arbeiten mehrere Menschen, was oft dazu führt, dass etwas (vielleicht unabsichtlich) geändert wird  :33:  Das möchte ich gerne mithilfe von Makros im Hintergrund protokollieren und den Großteil hab ich bereits geschafft. Trotzdem gibt's jetzt Probleme, falls ich damit arbeite:
1. Wenn ich etwas ausschneide und wieder einfüge wird nichts eingefügt (im selben Arbeitsblatt) und in einem anderen stimmt der Wert nicht mehr (zum Beispiel wird im Blatt1 die '54' zu einer '9' im Blatt 2). Ich möchte allerdings nicht auf das Ausschneiden verzichten und somit fällt selection.cut weg. 
2. Sollte ich mehrere Zellen auf einmal bearbeiten, z.B. in einer Spalte immer den Wert 15000 stehen haben will und den runter ziehe, wird das nicht dokumentiert
3. Es wird ebenfalls nicht dokumentiert, falls der Blattname geändert wird. Brauchbar wäre eine Zelle mit "alter Blattname" und "neuer Blattname" falls er geändert wird

Hier ist schon mal mein Code, vielleicht findet sich ja jemand der mit weiter helfen möchte? 
 
Vielen Dank schonmal, wer das lösen kann kriegt ein Bier ausgegeben!  :15:  Gruß 


Code:
Private Sub Workbook_SheetChange(ByVal Sh as Object, ByVal Target As Range)

 Sheets("Protokoll").Unprotect 123



 Dim FirstFreeRow As Long

 Dim OldVal As Variant

 Dim NewVal As Variant

 Dim rngNewSel As Range





User = Application.UserName



 If Target.Count > 1 Then Exit Sub

 If Sh.Name = "Protokoll" Then Exit Sub

 If Intersect(Target, Sh.Range("A1:Z999")) Is Nothing Then Exit Sub



 Application.EnableEvents = False



 NewVal = Target.Value

 Set rngNewSel = Selection



 Application.Undo



 OldVal = Target.Value



 Target.Value = NewVal



 On Error Resume Next

 rngNewSel.Activate

 On Error GoTo 0

 With Sheets("Protokoll")

   FirstFreeRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1

   .Cells(FirstFreeRow, 1) = Sh.Name

   .Cells(FirstFreeRow, 2) = Target.Address(0, 0)

   .Cells(FirstFreeRow, 3) = OldVal

   .Cells(FirstFreeRow, 4) = Target.Value

   .Cells(FirstFreeRow, 5) = Date

   .Cells(FirstFreeRow, 6) = Time

   .Cells(FirstFreeRow, 7) = User

 End With



 Application.EnableEvents = True



 Sheets("Protokoll").Protect 123



End Sub

  
Top
#2
Moin!
Code:
If Target.Count > 1 Then Exit Sub
Geiles Protokoll! :19:
Dann drücke ich doch glatt Strg+a und direkt danach Entf
(mal ganz davon abgesehen, dass man seit 2007 .CountLarge nehmen sollte, um nicht gleich in einen Überlauf zu hoppeln)

Anyway:
Weiß der Betriebsrat Bescheid?
Haben alle Mitarbeiter unterschrieben, dass sie über die (mit Verlaub) stümperhafte Protokollierung informiert wurden?

Fragt sich Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#3
Zitat:(mal ganz davon abgesehen, dass man seit 2007 .CountLarge nehmen sollte, um nicht gleich in einen Überlauf zu hoppeln)

Gut zu wissen, aber meinen VBA-Künsten würde ich nicht trauen, die sind nicht aktuell  :19: und so wie sich das bei dir anhört bin ich also definitiv an der richtigen Adresse; oder du bist ein genauso erfahrener Hobbyprogrammierer wie ich  Tongue was würdest du umschreiben, um zu vermeiden in einen Überlauf zu hoppeln? Und hast du eine Idee wie du mir mit meinem Problem helfen kannst?

Die Mitarbeiter, die damit arbeiten dürfen, wissen Bescheid von einer Dokumentation, trotz allem kann jeder auf diese Listen zugreifen, wer Zugang auf dieses Laufwerk hat. Weshalb der Betriebsrat informiert werden soll ist mir unklar, aber das spielt für mich keine Rolle.


Hoffe deine Fragen konnten beantwortet werden, Ralf

Gruß

Roger
Top
#4
Schau mal, wie man so etwas professionell macht:
http://www.office-loesung.de/ftopic599975_0_0_asc.php
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#5
Cooles Ding, Ralf! Soweit ich das lesen kann zeigt mir das aber nicht an, falls der Blattname geändert wird, dennoch werde ich dieses Programm (Version 1) erstmal nutzen.
Allerdings fängt es gleich mit folgender Fehlermeldung an:

Laufzeitfehler '76': Pfad nicht gefunden
Open LOGFILE_PATH & LOGFILE_NAME For Append As #mintFileNumber (Zeile 323)

Das heißt folgendes?
Top
#6
Du hast kein Laufwerk D:\

Nimm es mir nicht übel, aber ich werde kaum die Zeit finden, die folgenden 567 Fragen zu beantworten.

Isis Code ist natürlich nichts für Novizen.
Wenn man ihn lesen (heißt verstehen) will, braucht man schon fortgeschrittene VBA-Kenntnisse.

Die Besonderheit ist ja, dass das Protokoll nicht in ein Tabellenblatt, sondern in eine ausgelagerte Textdatei (.csv) geschrieben wird.

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top
#7
Hi Roger,

nichts für ungut, aber wenn du den Fehler nicht selber beheben kannst, solltest du bei VBA mit etwas Einfacherem anfangen. Wie Ralf geschrieben hat, ist der verlinkte Code nichts für Einsteiger.

Es gibt meines Wissens bei Excel kein "Ereigneis" für das Ändern eines Tabellenblattnamens, das man abfangen und darauf reagieren könnte. Man bekommt das aber über Umwege hin, z.B. wenn in der Tabelle Formeln vorhanden sind und die Berechnung in den Optionen auf "automatisch" eingestellt ist, dann ließe sich über das Ereignis "Calculate" reagieren.
Herzliche Grüße aus dem Rheinland
Jörg

[Windows 10, Microsoft 365]
Top
#8
Hallöchen,

da wäre schon mal von Vorteil wenn man Constanze und Variabell gut kennt  :15:

Laufzeitfehler '76': Pfad nicht gefunden
Open LOGFILE_PATH & LOGFILE_NAME For Append As #mintFileNumber (Zeile 323)


Private Const LOGFILE_PATH = "D:\"
Private Const LOGFILE_NAME = "LogFile1.csv"
Private Const TEMP_PREFIX = "Temp_"

--> Gibt es bei Dir D:\
--> Darfst Du direkt in D:\ eine Datei schreiben?

… jetzt kommen noch 566 Fragen  :17:
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#9
Angel :19:
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste