Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1904to1908
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Fehler abfangen von Target.Value

Fehler abfangen von Target.Value
04.11.2022 19:30:22
Target.Value
Hallo Zusammen,
mit diesem Code werden Änderungen protokolliert. Funktioniert soweit ganz gut.
Ich habe jetzt beim testen festgestellt, dass beim Einfügen einer neuen Spalte ein Laufzeitfehler entsteht. Alles Versuche diesen Fehler abzufangen schlugen fehl.
Da der Code auf der Arbeitsmappe hinterlegt ist, muss die Datei danach erst wieder neu geöffnet werden.
Gibts hier eine Möglichkeit?
Vorab vielen Dank
Gruß
Stefan
Option Explicit

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ErsteFreieZeile As Long
Dim AlterWert As Variant, NeuerWert As Variant
Dim rngNeuSel As Range
If Sh.Name = "Protokoll" Then Exit Sub
If Intersect(Target, Sh.Range("A1:CC1000")) Is Nothing Then Exit Sub
Application.EnableEvents = False
NeuerWert = Target.Value
Set rngNeuSel = Selection
Application.Undo
AlterWert = Target.Value    '

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
AlterWert = Target
End Sub

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler abfangen von Target.Value
04.11.2022 19:40:36
Target.Value

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Cells.Count > 1 Then Exit Sub
.....

AW: Fehler abfangen von Target.Value
04.11.2022 19:56:22
Target.Value
Vielen Dank für die schnelle Antwort.
Habs getestet. Funktioniert perfekt.
Gerne !
04.11.2022 19:57:09
onur
AW: Fehler abfangen von Target.Value
04.11.2022 21:00:50
Target.Value
Hallo Stefan,

Habs getestet. Funktioniert perfekt.
- nicht so voreilig urteilen. Drücke mal die Tastenkombination
Strg+A und es kommt zum Vba-Fehler; deshalb benutze If Target.CountLarge > 1 Then Exit Sub
Gruß von Luschi
aus klein-Paris
AW: Fehler abfangen von Target.Value
04.11.2022 21:07:35
Target.Value
Hallo Luschi,
danke für die Info.
Bei mir passiert allerdings gar nichts bei der Tastenkombination...?
Ist das evtl. Versionsabhängig?
Gruß
Anzeige
AW: Fehler abfangen von Target.Value
04.11.2022 22:25:52
Target.Value
Hallo Stefan,
aktiviere 1 beliebige Zelle im bestimmten Tabellenblatt: Strg+a (Kleinbuchstabe) markiert dann alle Zellen in diesen Arbeitsblatt.
das sind 17.179.869.184 Zellen Target.Count kann aber bis nur 2.147.483.647 zählen.
Gruß von Luschi
aus klein-Paris
AW: Fehler abfangen von Target.Value
06.11.2022 13:44:48
Target.Value
Hallo Luschi,
danke für die Info.
Ich habe es entsprechend angepasst.
Jetzt hat sich ein ganz anderes Problem gezeigt.
Innerhalb dieser Datei gibt es noch ein weiteres Makro, welches identische Datensätze in einer anderen Datei sucht, kopiert und hier wieder einfügt.
Der Code läuft durch bis zu der Schleife, welche die Werte einfügt. (getestet in dem ich einige "msgbox'es" eingefügt habe)
Schleife:
For z = 50 To lastcell1
For y = 13 To lastcell2
If Worksheets(sheet1).Cells(z, 63) = Worksheets("PT").Cells(y, 3) Then
Worksheets(sheet1).Cells(z, 57) = Worksheets("PT").Cells(y, 13)
Worksheets(sheet1).Cells(z, 58) = Worksheets("PT").Cells(y, 10)
Worksheets(sheet1).Cells(z, 59) = Worksheets("PT").Cells(y, 9)
Worksheets(sheet1).Cells(z, 60) = Worksheets("PT").Cells(y, 14)
Worksheets(sheet1).Cells(z, 61) = Worksheets("PT").Cells(y, 15)
End If
Die Schleife als solches funktioniert problemlos und der Rest auch.
erst seit dem ich die Protokollierung in diese Datei gebastelt habe, bleibt der Code hier stehen:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Cells.CountLarge > 1 Then Exit Sub
Dim ErsteFreieZeile As Long
Dim AlterWert As Variant, NeuerWert As Variant
Dim rngNeuSel As Range
If Sh.Name = "Protokoll" Then Exit Sub
If Sh.Name = "PT" Then Exit Sub
If Intersect(Target, Sh.Range("A1:DD1000")) Is Nothing Then Exit Sub
Application.EnableEvents = False
NeuerWert = Target.Value
Set rngNeuSel = Selection
Application.Undo 

Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
AlterWert = Target
End Sub
Gibts eine Idee wie man das abfangen könnte?
Oder anders gefragt, warum kommt der Fehler gerade hier?
Vielen Dank vorab.
Gruß Stefan
Anzeige
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
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige