Protokoll - Code-Fehler

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 02.10.2015 12:34:25

Hallo,
ich habe diese Frage schon in einem meiner Threads gestellt, allerdings wird dies langsam zu unübersichtlich dort. Außerdem ist es ein anderer Fehler, als im Thread besprochen wurde.
Ich habe mir einen Protokollierungs Code schreiben lassen, der es mir ermöglicht, Änderungen zu protokollieren.
Code:

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:AN2000")) Is Nothing Then Exit Sub
'------
  'Ereignisbehandlung ausschalten:
  Application.EnableEvents = False
  'Zwischenspeichern des neuen Wertes und der neuen Zellmarkierung
  NeuerWert = Target.Value
  Set rngNeuSel = Selection
  'Rückgängigmachen der letzten Aktion (=Zellwertänderung und Zellmarkierung):
  Application.Undo '<-- Des Pudels Kern, um alten Zellwert wieder zu bekommen
  'Alten Zellwert zwischenspeichern
  AlterWert = Target.Value
  'Neuen Zellwert aus der Zwischenspeicherung zurückholen in die geänderte Zelle
  Target.Value = NeuerWert
  'Ebenso die neue Zellmarkierung wieder neu setzen
  On Error Resume Next
  rngNeuSel.Activate
  On Error GoTo 0
'------
  With Sheets("Protokoll")
    ErsteFreieZeile = .Cells(Rows.Count, 1).End(xlUp).Row + 1
    .Cells(ErsteFreieZeile, 1) = Sh.Name
    .Cells(ErsteFreieZeile, 2) = Target.Address(0, 0)
    .Cells(ErsteFreieZeile, 3) = Target.Value
    .Cells(ErsteFreieZeile, 4) = AlterWert            '<---- Ausgeben
    .Cells(ErsteFreieZeile, 5) = Date
    .Cells(ErsteFreieZeile, 6) = Time
    .Cells(ErsteFreieZeile, 7) = Environ("username")
  End With
'------
  'Ereignisbehandlung wieder einschalten:
  Application.EnableEvents = True
End Sub
Allerdings treten einige Probleme auf. An sich funktioniert der Code, doch anscheinend stört er anderweitig das arbeiten.
Fehler 1: Wenn ich manuell eine neue Zeile einfügen will, kommt der "Laufzeitfehler '424': Objekt erforderlich." Wenn ich es beende, statt zu Debuggen, kann ich aber eine Zeile einfügen. beim Debuggen werde ich auf den angegebenen Code geleitet und er markiert mir "AlterWert=Target.Value".
Fehler 2: Ich habe einen Code, der mir einen neuen Eintrag automatisch setzt.
Code:
Option Explicit

Sub Main()
Dim lngLastRow As Long
Dim strTMP As String
Dim i As Long
On Error GoTo Fin
With Tabelle1
lngLastRow = .Cells(.Rows.Count, 2).End(xlUp).Row
For i = lngLastRow To 1 Step -1
If InStr(1, .Cells(i, 2), "(") <> 0 Then Exit For
Next i
i = i + 1
.Rows(i).Insert
lngLastRow = i - 1
strTMP = Split(Split(.Cells(lngLastRow, 2).Value, "(")(1), ")")(0)
If Left(strTMP, 2) = "00" Then
strTMP = "00" & strTMP + 1
ElseIf Left(strTMP, 1) = 0 Then
strTMP = "0" & strTMP + 1
Else
strTMP = strTMP + 1
End If
If Len(strTMP) > 3 Then strTMP = Right(strTMP, 3)
.Cells(lngLastRow + 1, 2).Value = "(" & strTMP & ")_ "
Application.Goto .Cells(lngLastRow + 1, 2), True
SendKeys "{F2}"
End With
Fin:
If Err.Number <> 0 Then MsgBox "Error: " & _
Err.Number & " " & Err.Description
End Sub
Hier bekomme ich den "Laufzeitfehler '1004': Die Methode 'Undo' für das Objekt '_Application' ist fehlgeschlagen. Auch das kann ich beenden, und das Makro wieder ganz normal ausführen. Beim debuggen werd ich auf den Protokollierungs-Code geleitet und mir wird "Application.Undo" markiert.
Fehler 3: Ich kann keine Zeilen löschen ! Nach dem Löschen, tauchen sie einfach wieder auf ! Ich habe gelesen, das liegt an der Undo Zeile. Aber das darf ja so nicht passieren !
Ich weiß, das sind sehr viele Fragen auf einmal ! Aber trotzdem hoffe ich, dass ihr mir helfen könnt !
Danke :)

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 02.10.2015 14:54:01
Hat niemand eine Idee ? :/

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Nepumuk
Geschrieben am: 02.10.2015 16:45:54
Hallo,
schau mal hier: http://www.office-loesung.de/ftopic599975_0_0_asc.php
Gruß
Nepumuk

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 02.10.2015 17:04:01
Danke für den Hinweis. Ich suche ja schon seit Tagen im Internet nach Lösungen. Und die Möglichkeit hatte ich schon gesehen, und sie funktioniert nicht. Bekomme Fehler wegen 32/64-bit. Außerdem sollen meine Änderungen in der selben Excel Datei angezeigt werden.

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Nepumuk
Geschrieben am: 02.10.2015 17:47:33
Hallo,
dann teste mal (Mappe vorher einmal schließen und wieder öffnen):

' **********************************************************************
' Modul: DieseArbeitsmappe Typ: Element der Mappe(Sheet, Workbook, ...)
' **********************************************************************

Option Explicit

Private avntOldValues As Variant

Private Sub Workbook_Open()
    Call ReadValues
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    Call ReadValues
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    Dim lngFirstFreeRow As Long
    Dim rngCell As Range, rngRange As Range
    
    If Sh.Name <> "Protokoll" Then
        
        Set rngRange = Intersect(Target, Sh.Range("A1:AN2000"))
        
        If Not rngRange Is Nothing Then
            
            'Ereignisbehandlung ausschalten:
            Application.EnableEvents = False
            
            With Worksheets("Protokoll")
                
                lngFirstFreeRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                
                For Each rngCell In rngRange
                    
                    .Cells(lngFirstFreeRow, 1).Value = Sh.Name
                    .Cells(lngFirstFreeRow, 2).Value = rngCell.Address(False, False)
                    .Cells(lngFirstFreeRow, 3).Value = rngCell.Value
                    .Cells(lngFirstFreeRow, 4).Value = avntOldValues(rngCell.Row, rngCell.Column)
                    .Cells(lngFirstFreeRow, 5).Value = Date
                    .Cells(lngFirstFreeRow, 6).Value = Time
                    .Cells(lngFirstFreeRow, 7).Value = Environ("USERNAME")
                    
                    lngFirstFreeRow = lngFirstFreeRow + 1
                    
                Next
            End With
            
            Set rngRange = Nothing
            
            'Ereignisbehandlung wieder einschalten:
            Application.EnableEvents = True
            
        End If
    End If
End Sub

Private Sub ReadValues()
    avntOldValues = ActiveSheet.Range("A1:AN2000").Value
End Sub

Ist halt erheblich langsamer als eine externe Datei und die "Rückgängig machen" - Funktion von Excel funktioniert nicht mehr.
Gruß
Nepumuk

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 02.10.2015 17:58:55
DANKE !!!!!
Endlich, die Fehler tauchen nicht mehr auf, ich kann wieder Zeilen löschen, und auch neue hinzufügen !
Aber was genau meinst du mit "Rückgängig machen - Funktion funktioniert nicht mehr ?

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Nepumuk
Geschrieben am: 02.10.2015 18:34:04
Hallo,
na wenn du einen Wert eingibst kannst du normalerweise mit Strg+Z bzw. der entsprechenden Schaltfläche den alten Wert wiederherstellen also die Eingabe "Rückgängig machen".
Du solltest übrigens noch die folgende Prozedur einfügen:

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    Call ReadValues
End Sub

Ansonsten wird das Löschen und Einfügen von Zeilen / Spalten nicht registriert und die alten Werte stimmen nicht mehr.
Gruß
Nepumuk

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 05.10.2015 09:09:45
Hallo,
habe deinen Code jetzt übernommen, und noch eingesetzt, was du mir nachträglich noch gesagt hast. Die Position dieser Codezeile, im gesamten Code, ist egal oder ?
Achja, das "Rückgänging machen" funktioniert bei mir aber weiterhin.
Gruß

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Nepumuk
Geschrieben am: 05.10.2015 10:54:19
Hallo,
richtig, die Position ist egal, Hauptsache sie befindet sich im selben Modul wie der restliche Code.
Gruß
Nepumuk

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 05.10.2015 11:21:46
Vielen Dank für deine Hilfe !
Jetzt läuft alles genau so, wie ich es haben wollte :)
Gruß !

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 05.10.2015 12:21:49
Es ist leider noch etwas aufgetreten, dass in meinem Protokoll auftritt. Wenn ich per Makro eine neue Zeile einfüge, nimmt das Protokoll dies mit auf. Das heißt alle neuen Felder mit protokolliert werden. Also im Protokoll tritt dann der "Alter Wert" mit leerem Feld und der "neuer Wert" ebenfalls mit leerem Wert auf.

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 05.10.2015 12:37:04
Verstehe ich deinen Code richtig, dass er die Zeile, die nach dem neuen Wert kommt, kopiert, und die Werte in den Zellen löscht ?

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Nepumuk
Geschrieben am: 05.10.2015 14:23:05
Hallo,
intern wird nicht wirklich eine neue Zeile eingefügt sondern wie du vermutest die Werte werden nach unten kopiert. Du kannst ja eine Abfrage einbauen, wenn alter Wert = Neuer Wert dann kein Eintrag ins Protokoll.
Gruß
Nepumuk

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 05.10.2015 16:01:22
Ok. Ist es möglich, dass du mir den Code dazu eventuell schreibst ?
Ich weiß, ich übernehme keinen großen Part beim Schreiben der Codes, allerdings bin ich abgesehen von C++ ein Neuling in der Programmierung. Vor allem bei VBA hab ich Probleme.
Vielen Dank !

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Nepumuk
Geschrieben am: 05.10.2015 16:09:36
Hallo,
so:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    Dim lngFirstFreeRow As Long
    Dim rngCell As Range, rngRange As Range
    
    If Sh.Name <> "Protokoll" Then
        
        Set rngRange = Intersect(Target, Sh.Range("A1:AN2000"))
        
        If Not rngRange Is Nothing Then
            
            'Ereignisbehandlung ausschalten:
            Application.EnableEvents = False
            
            With Worksheets("Protokoll")
                
                lngFirstFreeRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                
                For Each rngCell In rngRange
                    
                    If rngCell.Value <> avntOldValues(rngCell.Row, rngCell.Column) Then
                        
                        .Cells(lngFirstFreeRow, 1).Value = Sh.Name
                        .Cells(lngFirstFreeRow, 2).Value = rngCell.Address(False, False)
                        .Cells(lngFirstFreeRow, 3).Value = rngCell.Value
                        .Cells(lngFirstFreeRow, 4).Value = avntOldValues(rngCell.Row, rngCell.Column)
                        .Cells(lngFirstFreeRow, 5).Value = Date
                        .Cells(lngFirstFreeRow, 6).Value = Time
                        .Cells(lngFirstFreeRow, 7).Value = Environ("USERNAME")
                        
                        lngFirstFreeRow = lngFirstFreeRow + 1
                        
                    End If
                Next
            End With
            
            Set rngRange = Nothing
            
            'Ereignisbehandlung wieder einschalten:
            Application.EnableEvents = True
            
        End If
    End If
End Sub

Gruß
Nepumuk

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 05.10.2015 16:36:20
Danke !
Es hört leider nicht auf :/ Noch eine Sache:
In meinem Protokoll tauchen nun 3 Veränderungen auf, die ersten beiden würde ich aber gerne auch nicht beachten lassen.
Bei den beiden ist der alte Wert "[PlatzhalterMakro - NichtBeachten]" und der neue Wert einmal eine leere Zelle, und einmal die neue Zahl, die hinten angefügt wird.
Kann man per Code sagen, dass auch das nicht mit ins Protokoll mit aufgenommen wird ? Also sozusagen: "Wenn AlterWert = [PlatzhalterMakro - NichtBeachten], dann nicht aufnehmen" ?

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Nepumuk
Geschrieben am: 05.10.2015 17:19:22
Hallo,
kaum reicht man dir den kleinen Finger .....
Das ist jetzt aber die letzte Änderung die ich dir einbaue. Es wird auch immer langsamer je mehr Bedingungen du einbaust.

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    
    Dim lngFirstFreeRow As Long
    Dim rngCell As Range, rngRange As Range
    
    If Sh.Name <> "Protokoll" Then
        
        Set rngRange = Intersect(Target, Sh.Range("A1:AN2000"))
        
        If Not rngRange Is Nothing Then
            
            'Ereignisbehandlung ausschalten:
            Application.EnableEvents = False
            
            With Worksheets("Protokoll")
                
                lngFirstFreeRow = .Cells(.Rows.Count, 1).End(xlUp).Row + 1
                
                For Each rngCell In rngRange
                    
                    If rngCell.Value <> avntOldValues(rngCell.Row, rngCell.Column) Then
                        
                        If avntOldValues(rngCell.Row, rngCell.Column) <> "[PlatzhalterMakro - NichtBeachten]" Then
                            
                            .Cells(lngFirstFreeRow, 1).Value = Sh.Name
                            .Cells(lngFirstFreeRow, 2).Value = rngCell.Address(False, False)
                            .Cells(lngFirstFreeRow, 3).Value = rngCell.Value
                            .Cells(lngFirstFreeRow, 4).Value = avntOldValues(rngCell.Row, rngCell.Column)
                            .Cells(lngFirstFreeRow, 5).Value = Date
                            .Cells(lngFirstFreeRow, 6).Value = Time
                            .Cells(lngFirstFreeRow, 7).Value = Environ("USERNAME")
                            
                            lngFirstFreeRow = lngFirstFreeRow + 1
                            
                        End If
                    End If
                Next
            End With
            
            Set rngRange = Nothing
            
            'Ereignisbehandlung wieder einschalten:
            Application.EnableEvents = True
            
        End If
    End If
End Sub

Gruß
Nepumuk

Bild

Betrifft: AW: Protokoll - Code-Fehler
von: Imran
Geschrieben am: 05.10.2015 17:42:17
Ja, ich kann dich verstehen! Ich musste mich auch ehrlich gesagt immer wieder überwinden, eine weitere Frage zu stellen.
Ich danke dir vielmals! Du hast mir wirklich super geholfen! Jetzt letztendlich ist es genau so, wie ich es mir vorgestellt habe.
Viele vielen Dank
Gruß

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Protokoll - Code-Fehler"