Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1448to1452
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

Protokoll - Code-Fehler

Protokoll - Code-Fehler
02.10.2015 12:34:25
Imran
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 '
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 :)

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Protokoll - Code-Fehler
02.10.2015 14:54:01
Imran
Hat niemand eine Idee ? :/

AW: Protokoll - Code-Fehler
02.10.2015 17:04:01
Imran
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.

AW: Protokoll - Code-Fehler
02.10.2015 17:47:33
Nepumuk
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

Anzeige
AW: Protokoll - Code-Fehler
02.10.2015 17:58:55
Imran
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 ?

AW: Protokoll - Code-Fehler
02.10.2015 18:34:04
Nepumuk
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

Anzeige
AW: Protokoll - Code-Fehler
05.10.2015 09:09:45
Imran
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ß

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

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

AW: Protokoll - Code-Fehler
05.10.2015 12:21:49
Imran
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.

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

AW: Protokoll - Code-Fehler
05.10.2015 14:23:05
Nepumuk
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

AW: Protokoll - Code-Fehler
05.10.2015 16:01:22
Imran
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 !

Anzeige
AW: Protokoll - Code-Fehler
05.10.2015 16:09:36
Nepumuk
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

Anzeige
AW: Protokoll - Code-Fehler
05.10.2015 16:36:20
Imran
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" ?

AW: Protokoll - Code-Fehler
05.10.2015 17:19:22
Nepumuk
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

Anzeige
AW: Protokoll - Code-Fehler
05.10.2015 17:42:17
Imran
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ß

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige