Beim Speichern Datum und Benutzer eintragen

Bild

Betrifft: Beim Speichern Datum und Benutzer eintragen
von: Alexander Bösch
Geschrieben am: 08.07.2015 11:28:32

Hallo miteinander.
Habe bei euch im Forum folgendes gefunden.
Ich benötige das zweite Makro jedoch ein bisschen abgeändert.
Leider kenne ich mich mit Makros gar nicht aus.
Folgendes war im Beitrag:


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim iRow As Integer
  With Worksheets("Logs")
     iRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
    .Cells(iRow, 1).Value = Application.UserName
    .Cells(iRow, 2).Value = Now
    .Columns.AutoFit
  End With
End Sub

UND:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 Dim lngZeile As Long
 Application.EnableEvents = False
 With Worksheets("Änderungen_dokumentieren")
 Worksheets("Änderungen_dokumentieren").Unprotect ("password")  '<-- Password deiner Wahl  _
einsetzen
 lngZeile = .Range("A65536").End(xlUp).Row + 1
 .Cells(lngZeile, 1).Value = Environ("UserName") 'Änderungen_dokumentieren
 .Cells(lngZeile, 2).Value = Date 'Datum
 .Cells(lngZeile, 3).Value = Time 'Zeit
 .Cells(lngZeile, 4).Value = Sh.Name 'Blattname, auf dem geändert wurde
 .Cells(lngZeile, 5).Value = Target.Address 'Zelle der Änderung
 .Cells(lngZeile, 6).Value = oldValue 'vorheriger Wert
 .Cells(lngZeile, 7).Value = Target.Value 'neuer Eintrag
 End With
  Worksheets("Änderungen_dokumentieren").Protect ("password")  '<-- Password wie oben einsetzen
 Application.EnableEvents = True
 End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   oldValue = Target
End Sub

Wäre es jetzt möglich diese zwei Codes zu vereinen?
Ich meine Damit dass der Zweite (Ausführliche) Code nur dann ausgeführt wird wenn gespeichert wird?
Und bei mir wird die Selection der Zelle nach jedem ausführen des Makros verschoben.
d.h. wenn ich was in eine Zelle eintrage,(mit Enter oder Pfeil bestätige) bin ich danach nicht in der nächsten Zelle sondern irgendwo auf dem Arbeitsblatt.
Kann man den Log auf irgendwie 500 Zeilen begrenzen dass dann wieder oben angefangen wird?
Danke euch schon mal im voraus.

Bild

Betrifft: AW: Beim Speichern Datum und Benutzer eintragen
von: Michael
Geschrieben am: 08.07.2015 15:10:27
Hi Alex,
der zweite Code speichert jede einzelne Änderung in irgendwelchen Zellen ab, das muß man entweder laufend mitschreiben oder es steht vor dem Speichern nicht mehr zur Verfügung.
Die obere Geschichte läßt sich ohne großen Aufwand anpassen, es wird nur eine Zeile eingefügt:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim iRow As Integer
  With Worksheets("Logs")
     iRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
     if iRow>499 then iRow = 2  ' oder 1, falls keine Überschrift vorh.
    .Cells(iRow, 1).Value = Application.UserName
    .Cells(iRow, 2).Value = Now
    .Columns.AutoFit
  End With
End Sub
Schöne Grüße,
Michael
P.S.: Ob das Protokollieren *jeder* Änderung sinnvoll ist, ist Ermessenssache - die sinnvollere Alternative ist m.E.s ein Schreibschutz o.ä. mit Passwort. (Wer liest denn die Logs auch?!)
Beim Protokollieren sollten evtl. juristische Fallstricke beachtet werden, siehe http://de.wikipedia.org/wiki/Keylogger

Bild

Betrifft: AW: Beim Speichern Datum und Benutzer eintragen
von: Alexander Bösch
Geschrieben am: 08.07.2015 16:57:12
Hallo Miachael
Naja das ist dann Natürlich nicht nett wenn nur der Name drin steht.
Müsste wissen wer eine Zeile ändert, bzw was er/sie geändert hat. (Jede Zeile)
Allso das Grosse Script ist somit für mich einigermassen i.o.
Das Hauptproblem ist wenn ich was ändere und mit Enter/TAb/Pfeil die Eingabe bestätige bin ich nicht im nächsten Excel Zelle, das hat mit dem passwortschutz zu tun, kann den natürlich entfernen da er für mich nicht sehr wichtig ist.
Eine frage noch, der alte(vorherige) wert
.Cells(lngZeile, 6).Value = oldValue 'vorheriger Wert
funktioniert nicht. Hat dies einen speziellen grund? und kann man diese funktion einbinden?
Danke euch im voraus

Bild

Betrifft: AW: Beim Speichern Datum und Benutzer eintragen
von: Michael
Geschrieben am: 10.07.2015 17:16:30
Hallo Alex,
das liegt schlicht daran, daß oldValue nirgends deklariert ist, d.h. Du hast das Skript wahrscheinlich unvollständig heruntergeladen.
oldValue ist offensichtlich als "globale Variable" (das kannst Du recherchieren) deklariert, also etwa ganz am Anfang, *vor* den einzelnen subs: public oldValue as variant
Übrigens wird so, wie es in

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
   oldValue = Target
End Sub
codiert ist, wird nur der *Wert* der Zelle als *Wert* in oldValue gespeichert, falls eine Formel drin war, ist sie "weg". Du kannst mal mit Target.formula (und entsprechenden Varianten) experimentieren, solltest aber schreiben: oldValue = "'" & Target.formula
Dadurch wird die Formel als Text angezeigt.
Schöne Grüße,
Michael

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Beim Speichern Datum und Benutzer eintragen"