Protokoll Tabellenblatt zu änderungen erstellen

  • Excel

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Tina.

    Protokoll Tabellenblatt zu änderungen erstellen

    Hallo,
    ich ändere über ein Userform Daten in einer "Stammdaten" Tabelle, diese Änderungen möchte ich gerne Protokollieren. In der Stammdatentabelle ist in Spalte A der Wert immer einmalig.

    Meine idee war wenn ich im Userform denn zu änderten Datensatz ausgewählt habe (Spalte A im Tabellenblatt) und denn "Ändern" Button bestätige das dann der Stammdatensatz in das Tabellenblatt "Protokoll" kopiert wird und um eine ein paar Spaltenwerte ergänzt wird "Alt", "Speicherdatum/Zeit",ÄnderungsUser".

    Wenn dann der Datensatz geändert wurde und der "Speicher" Button gedrückt wurde, dann soll unter der vorherigen Zeile die neuen Daten in das "Protokoll" Datenblatt gespeichert werden, wo ebenfalls dann am schluß die 3 Spalten ergänzt werden, nur das aus "Alt", "Neu" wird.

    Damit hätte ich immer zu jedem Datensatz den Alten und den neuen Wert direkt untereinander stehen und könnte die Änderungen vergleichen.

    und so sollen alle weiteren Änderungen immer in die erste leere Zeile im "Protokoll" Tabellenblatt geschrieben werden.

    Hab schon ein paar Tage gegooglet und mich ausprobiert aber irgendwie keine funktionierende Lösung gefunden, es müssten aus meiner Sicht 2 Subs sein, einmal für den Änderungsbutton und einmal für den Speicherbutton.

    Vielleicht kann mich hier jemand etwas anstupsen.

    Danke

    Edit,
    ich habe jetzt mal noch ein bisschen herumgetüftelt, aber irgendwie wird mir die lastrow nicht korrekt ermittelt, wenn ich den Code beim "Andern" Button stoppe ist lastRow=7 allerdings müsste 8 richtig sein, so überschreibt er mir immer eine Zeile, da im Protokoll Tabellenblatt zu dem Zeitpunkt wo ich lastrow ermitttel schon 8 Zeile belegt sind.

    Woran kann das liegen?
    Um die bestehenden Daten in das Protokoll Datenblatt zu kopieren gehe ich jetzt so vor

    Quellcode

    1. ​ lastrow = Worksheets("Protokoll").Range("d65536").End(xlUp).Row
    2. Worksheets("Stammdaten").Activate
    3. For r = 2 To 3000
    4. If txtWAWI.Value = Cells(r, 1) Then
    5. WksStamm.Cells(r, 1).Copy WksProt.Cells(lastrow + 1, 1)
    6. WksStamm.Cells(r, 2).Copy WksProt.Cells(lastrow + 1, 2)
    7. WksStamm.Cells(r, 3).Copy WksProt.Cells(lastrow + 1, 3)
    8. WksStamm.Cells(r, 4).Copy WksProt.Cells(lastrow + 1, 4)
    9. WksStamm.Cells(r, 5).Copy WksProt.Cells(lastrow + 1, 5)
    10. WksStamm.Cells(r, 6).Copy WksProt.Cells(lastrow + 1, 6)
    11. WksStamm.Cells(r, 7).Copy WksProt.Cells(lastrow + 1, 7)
    12. WksStamm.Cells(r, 8).Copy WksProt.Cells(lastrow + 1, 8)
    13. WksStamm.Cells(r, 9).Copy WksProt.Cells(lastrow + 1, 9)
    14. WksStamm.Cells(r, 10).Copy WksProt.Cells(lastrow + 1, 10)
    15. WksStamm.Cells(r, 11).Copy WksProt.Cells(lastrow + 1, 11)
    16. WksStamm.Cells(r, 12).Copy WksProt.Cells(lastrow + 1, 12)
    17. WksStamm.Cells(r, 13).Copy WksProt.Cells(lastrow + 1, 13)
    18. WksStamm.Cells(r, 14).Copy WksProt.Cells(lastrow + 1, 14)
    19. WksStamm.Cells(r, 15).Copy WksProt.Cells(lastrow + 1, 15)
    20. WksStamm.Cells(r, 16).Copy WksProt.Cells(lastrow + 1, 16)
    21. WksStamm.Cells(r, 17).Copy WksProt.Cells(lastrow + 1, 17)
    22. WksStamm.Cells(r, 18).Copy WksProt.Cells(lastrow + 1, 18)
    23. WksStamm.Cells(r, 19).Copy WksProt.Cells(lastrow + 1, 19)
    24. WksStamm.Cells(r, 20).Copy WksProt.Cells(lastrow + 1, 20)
    25. WksStamm.Cells(r, 21).Copy WksProt.Cells(lastrow + 1, 21)
    26. WksStamm.Cells(r, 22).Copy WksProt.Cells(lastrow + 1, 22)
    27. WksStamm.Cells(r, 23).Copy WksProt.Cells(lastrow + 1, 23)
    28. WksStamm.Cells(r, 24).Copy WksProt.Cells(lastrow + 1, 24)
    29. WksStamm.Cells(r, 25).Copy WksProt.Cells(lastrow + 1, 25)
    30. WksStamm.Cells(r, 26).Copy WksProt.Cells(lastrow + 1, 26)
    31. WksStamm.Cells(r, 27).Copy WksProt.Cells(lastrow + 1, 27)
    32. WksProt.Cells(lastrow + 1, 28).Value = "Alt"
    33. WksProt.Cells(lastrow + 1, 29).Value = Now
    34. WksProt.Cells(lastrow + 1, 30).Value = Application.UserName
    35. End If
    36. Next r


    Bis auf das lastrow Problem funktioniert das auch schon mal.
    Bilder
    • lastrow.jpg

      12,62 kB, 628×47, 34 mal angesehen
    • lastrowProtokoll.jpg

      5,47 kB, 628×47, 30 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Tina“ ()

    LastRow ist auch die letzte befüllte Zeile. Mach an der Codestelle einfach LastRow + 1

    Ok, Code nicht richtig angeschaut.

    ##########

    Bei mir klappt der Code.

    Warum sprichst Du die Sheets in Zeile#1 und #2 so an? Du hast Doch die Sheets-Objekte schon in Variablen?

    Die Zeilen#6-#32 kannst Du kürzen:

    Visual Basic-Quellcode

    1. For x = 1 To 27
    2. WksStamm.Cells(r, x).Copy WksProt.Cells(lastrow + 1, x)
    3. Next


    ##########

    Habe den Code mal etwas umgeschrieben, auch mit Testwerten. Folgendes funktioniert konkret bei mir: Ich habe 2 Sheets, Stammdaten und Protokoll. Protokoll ist leer, in Stammdaten habe ich
    1
    a
    b
    c
    2
    A
    B
    C
    3
    1
    2
    3

    Visual Basic-Quellcode

    1. Option Explicit
    2. Sub AddChangesToProtocol()
    3. Dim WksRoot As Worksheet
    4. Dim WksProtocol As Worksheet
    5. Set WksRoot = Sheets(1)
    6. Set WksProtocol = Sheets(2)
    7. Dim LastRootRowIndex As Integer
    8. Dim LastProtocolRowIndex As Integer
    9. LastRootRowIndex = WksRoot.Range("d65536").End(xlUp).Row
    10. LastProtocolRowIndex = WksProtocol.Range("d65536").End(xlUp).Row
    11. If LastProtocolRowIndex = 1 And WksProtocol.Cells(1, 1).Value = "" Then LastProtocolRowIndex = 0
    12. Dim x As Integer
    13. Dim y As Integer
    14. For y = 2 To LastRootRowIndex
    15. If WksRoot.Cells(y, 1).Value = "3" Then
    16. For x = 1 To 4
    17. WksRoot.Cells(y, x).Copy WksProtocol.Cells(LastProtocolRowIndex + 1, x)
    18. Next
    19. WksProtocol.Cells(LastProtocolRowIndex + 1, 5).Value = "Alt"
    20. WksProtocol.Cells(LastProtocolRowIndex + 1, 6).Value = Now
    21. WksProtocol.Cells(LastProtocolRowIndex + 1, 7).Value = Application.UserName
    22. End If
    23. Next
    24. End Sub


    Wenn ich das Sub ausführe, erhalte ich in Protokoll, Zeile#1:
    3
    1
    2
    3
    Alt

    13.11.2021 11:05

    VaporiZed
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()

    Hi, das funktioniert perfekt und ist deutlich übersichtlicher und kürzer wie mein Versuch. Vielen Dank.

    Eine frage hab ich aber noch, ich verstehe noch nicht so wirklich wofür das hier nötig ist

    Quellcode

    1. If LastProtocolRowIndex = 1 And WksProtocol.Cells(1, 1).Value = "" Then LastProtocolRowIndex = 0
    Da sollte eigentlich der Code für sich sprechen.
    Aber eben: Wenn die Protokolltabelle leer ist (sich ergebend aus der Tatsache, dass bei WksProtocol.Range("d65536").End(xlUp).Row 1 rauskommt (was ja passieren kann, wenn keine oder eben eine Zeile befüllt ist) und die erste Zeile leer ist (dann ist vermutlich auch die ganze Tabelle leer), dann setze LastProtocolRowIndex auf 0, damit dann eben später bei WksProtocol.Cells(LastProtocolRowIndex + 1, 5).Value = "Alt" als Zeilenindex folgerichtig 1 drinsteht. Sonst würde eben bei ner leeren Protokolltabelle es erst in Zeile#2 losgehen. Aber ich weiß ja gar nicht, ob Du Deine Protokolltabelle wirklich komplett leer beginnst oder schon irgendwelche Überschriften reinschreibst.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hi,
    danke für deine erklärung, was passiere war mir klar, nur nicht wieso du das so gemacht hast, jetzt hab ich es verstanden. Im Protokoll Tabellenblatt stehen in Zeile 1 Überschriften, so das sie nie leer ist.Beim meinen paar Tests eben hat alles super geklappt, danke daüfr