AW: Fehler abfangen von Target.Value
07.11.2022 22:26:13
Target.Value
Hallo Stefan,
Application.Undo ist was, der Makrorekorder aufnimmt, wenn man per Hand "Rückgängig" aufruft.
Es hat in ein sauber durchgedachte Programmierung theoretisch nichts zu suchen. Aber in deinem Fall schon. Du darfst nur davor nichts per Makro einstellen, da eine eine Zellenhandlung per Makro nicht zurückzumachen ist (zumind. nicht per Application.Undo)
Du musst eine globale Variable verwenden (also nicht innerhalb der Procedure), die befüllt wird, wenn man eine Zelle auswählt (hattest Du schon richtig):
Dim AlterWert
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
AlterWert = Target.Value
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Sh.Name = "Protokoll" Then Exit Sub
If Sh.Name = "PT" Then Exit Sub
Application.EnableEvents = False
If Not Intersect(Target, Sh.Range("A1:DD1000")) Is Nothing Then
If Target.Cells.CountLarge > 1 Then
Application.Undo 'Das Rückspielen von AlterWert funktioniert nur bei eine Zelle, nicht bei mehreren
MsgBox "Es darf nur eine Zelle geändert werden."
Else
Protokolliere Sh.Name, Target.Address(0, 0), Target.Value, AlterWert, Target.EntireRow.Cells([DplKltxt].Column)
End If
End If
Application.EnableEvents = True
End Sub
Private Sub Protokolliere(Blatt, Zelle, NeuerWert, AlterWert, Optional Sonstiges = "")
Dim AppEE As Boolean
AppEE = Application.EnableEvents
Application.EnableEvents = False
With Sheets("Protokoll").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).EntireRow
.Cells(1) = Blatt
.Cells(2) = Zelle
.Cells(3) = NeuerWert
.Cells(4) = AlterWert
.Cells(5) = Date
.Cells(6) = Time
.Cells(7) = Environ("username")
.Cells(8) = Sonstiges
End With
Application.EnableEvents = AppEE
End Sub
Die Protokollierung an sich würde ich in einer separaten Sub ablegen.
VG
Yal