History speichern
#1
Hallo an alle.

Ich habe volgenden Code, der die Änderungen aus TB Produkte ins TB History schreibt, was auch soweit funktioniert.

Wie kann ich den Code abändern, das er nur in einem bestimmten Bereich nur vorgegebene Spalten überwacht und in die History schreibt?

Danke für Eure Hinweise

Code:
Code:
Dim SaveWert As Variant, SaveSheet As String, firstEmptyRow As Long, SaveAddress As String

Private Sub Worksheet_Change(ByVal Target As Range)
   
    'History
    If SaveWert > "" And Target.Cells <> SaveWert Then
    firstEmptyRow = Sheets("History").Cells(Cells.Rows.Count, 2).End(xlUp).Row + 1
    Sheets("History").Cells(firstEmptyRow, 2) = ActiveSheet.Name
    Sheets("History").Cells(firstEmptyRow, 3) = SaveAddress
    Sheets("History").Cells(firstEmptyRow, 4) = SaveWert
    Sheets("History").Cells(firstEmptyRow, 5) = Target.Cells
    Sheets("History").Cells(firstEmptyRow, 6) = Environ("Username")
    Sheets("History").Cells(firstEmptyRow, 7) = Now
    End If

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
       
        'History
        SaveWert = Target.Cells
        SaveSheet = ActiveSheet.Name
        SaveAddress = Target.Cells.Address

End Sub
Antworten Top
#2
Zur weiteren Info!

Die Änderungen der Zellinhalte erfolgen vorrangig über ein UserForm!

Manuelle Änderungen in den Zellen werden alle korrekt erfasst.

Wie kann ich es umsetzen, dass er die Änderungen über die UserForm erkennt und in das TB History schreibt.
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
   
    'History
   
    endRow = Sheets("Produkte").Cells(Cells.Rows.Count, 2).End(xlUp).Row
    If Not Intersect(Target, Range("B8:M" & endRow)) Is Nothing Then
   
    If SaveWert > "" And Target.Cells <> SaveWert Then
    firstEmptyRow = Sheets("History").Cells(Cells.Rows.Count, 2).End(xlUp).Row + 1
    Sheets("History").Cells(firstEmptyRow, 2) = ActiveSheet.Name
    Sheets("History").Cells(firstEmptyRow, 3) = SaveAddress
    Sheets("History").Cells(firstEmptyRow, 4) = SaveWert
    Sheets("History").Cells(firstEmptyRow, 5) = Target.Cells
    Sheets("History").Cells(firstEmptyRow, 6) = Sheets("Benutzer").Range("H5")
    Sheets("History").Cells(firstEmptyRow, 7) = Now
    End If
   
    End If
   

End Sub

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)

        'History
        endRow = Sheets("Produkte").Cells(Cells.Rows.Count, 2).End(xlUp).Row
        If Not Intersect(Target, Range("B8:M" & endRow)) Is Nothing Then
        SaveWert = Target.Cells
        SaveSheet = ActiveSheet.Name
        SaveAddress = Target.Cells.Address
        End If

End Sub
Antworten Top
#3
Moin,

für den ersten Fall (Änderung im Tabellenblatt):
Beachte, dass 
-> Target.Cells auch mehr als eine Zelle enthalten kann und deine Hilfsvariablen dann ein zweidimensionales Array beinhalten.
-> du dich nicht auf ActiveSheet verlassen musst, wenn du doch Target hast
-> es ungewöhnlich ist, dass du die Klasse des Target-Parameters in den Prozedurköpfen einmal mit Angabe der Klassenbibliothek und einmal ohne schreibst,
-> du mit Intersect() prüfen kannst, ob sich Zellbereichsobjekte überschneiden.

für den zweiten Fall(Änderung über Userform):
Du musst gar nicht mehr mit den Worksheet-Events arbeiten, du kannst einfach vorm Ändern den bisherigen und den aktuellen wert direkt in die History schreiben.

Viele Grüße
derHöpp
Antworten Top
#4
Hier reicht:

Code:
Dim c00

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Count = 1 Then c00 = Target.Value
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
  If Target.Count = 1 Then Sheet2.Cells(Rows.Count, 2).End(xlUp).Offset(1).Resize(, 6) = Array(Target.Parent.Name, Target.Address, c00, Target.Cells, Environ("username"), Now)
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#5
Nur wie überwache ich bestimmte Spalten?

Die Zeile finde ich über:
Code:
    Targetstr = "(" & Range("barcode").Value & ")": If Targetstr = "" Or Range("$D$3") = "Zelle zum scannen aktivieren!" Or Range("$D$3") = "jetzt scannen ..." Then Exit Sub
    With Worksheets("Produkte")
        X = Application.Match(Targetstr, .Columns(4), 0)
    End With
Antworten Top
#6
Andyle schrieb:Nur wie überwache ich bestimmte Spalten?
Mit Intersect().
Aber, wie erwähnt, wenn du Inhalte mit Hilfe einer UserForm veränderst, kannst du auch direkt eine History schreiben, ohne die Worksheet-Events zu bemühen. Was dein letzter Code mit dem Problem zu tun haben könnte, verstehe ich allerdings nicht. Die Target-Straße ist nie leer, weil du mindestens ein Klammerpaar hast. Ich würde im übrigen noch davon abraten, Exit Sub zu verwenden. Ebenso ist es meiner Ansicht nach nicht ratsam, den Doppelpunkt zu verwenden, um Zeilen zu sparen. Codezeilen kosten in der Regel kein Geld, aller Erfahrung nach erschwerst du dir damit aber die spätere Fehlersuche, weil du gegebenenfalls dein Programm schon lange verlassen hast und den Grund dafür mit einem Exit sub hinter zwei Doppelpunkte versteckt hast.

Viele Grüße
derHöpp
Antworten Top


Gehe zu:


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