Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.04.2024 20:05:21
28.04.2024 18:33:31
28.04.2024 18:25:12
28.04.2024 14:18:05
Anzeige
Archiv - Navigation
1932to1936
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

Zeitstempel beim Löschen von Zeilen

Zeitstempel beim Löschen von Zeilen
14.06.2023 13:20:47
Marc Free

Hallo zusammen,

ich habe ein Makro, welches mir in Spalte R und S das letzte Änderungsdatum / -zeit und den Bearbeiternamen der jeweiligen Zeile (Spalten A bis Q) eintägt.

Das funktioniert auch soweit ganz gut.

Ich habe aber beim Löschen ganzer Zeilen ein Problem:

Wenn beispielsweise Zeile 17 komplett gelöscht wird, rutscht der Inhalt logischer Weise nach oben. Also Zeile 18 wird zu 17. Daber trägt mir das Makro aber in der neuen Zeile 17 (vorher Zeile 18) das Änderungsdatum / -zeit und den Bearbeiternamen ein, obwohl der ursprüngliche Inhalt aus Zeile 18 nicht verändert wurde.

Hat jemand eine Idee, wie ich dem Makro beibringen kann, dass es beim Löschen einer ganzen Zeile kein Änderungsdatum / -zeit und Bearbeitername in Spalte R und S einträgt?

Hier der Code:


Private Sub Worksheet_Change(ByVal Target As Range)
Dim xRInt1 As Integer
Dim xRInt2 As Integer
Dim xDStr As String
Dim xFStr As String
On Error Resume Next
xDStr = "A:Q" 'Data Column
xFStr1 = "R" 'Timstamp Column
xFStr2 = "S" 'User Column
If (Not Application.Intersect(Me.Range(xDStr & ":" & xDStr), Target) Is Nothing) Then
       xRInt = Target.Row
       Me.Range(xFStr1 & xRInt) = Format(Now(), "mm/dd/yyyy hh:mm:ss")
       Me.Range(xFStr2 & xRInt) = Environ("Username")
End If
End Sub


Danke Für Eure Unterstützung!

Gruß

Marc

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Zeitstempel bei Änderung in mehreren Zeilen
14.06.2023 13:53:08
NoNet
Hi Marc,

da der Event-Handler erst nach dem Löschen der Zeile ausgeführt wird, ist das nicht ganz so einfach, da man sich quasi die Adresse der zuvor markierten Zeile(n) sichern müsste, Das ist allerdings sehr fehleranfällig. Eine adhoc-Lösung kann ich Dir leider nicht präsentieren, daher lasse ich den Thread noch offen.

Dennoch hätte ich einen kleinen Verbesserungsvorschlag für Dein Makro - für den Fall, dass der Inhalt mehrerer Zellen gelöscht/geändert wird (also z.B. mehrere Zeilen markiert wurden und dann ENTF-Taste gedrückt oder ein Wert eingegeben und mit Strg+ENTER bestätigt wurde) :

Die folgende Ergänzung dokumentiert die Änderungen in allen Zeilen der Mehrfachmarkierung :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngRow As Range, datTime
    Dim xRInt1 As Integer
    Dim xRInt2 As Integer
    Dim xDStr As String
    Dim xFStr As String
    On Error Resume Next
    
    datTime = Now 'Aktualisierungszeitpunkt speichern
    
    xDStr = "A:Q" 'Data Column
    xFStr1 = "R" 'Timstamp Column
    xFStr2 = "S" 'User Column
    Application.EnableEvents = False 'Ereignis-Handler deaktivieren
    
    For Each rngRow In Target.Rows
        If (Not Application.Intersect(Me.Range(xDStr & ":" & xDStr), rngRow) Is Nothing) Then
               xRInt = rngRow.Row
               Me.Range(xFStr1 & xRInt) = Format(datTime, "mm/dd/yyyy hh:mm:ss")
               Me.Range(xFStr2 & xRInt) = Environ("Username")
               Me.Range(xFStr2 & xRInt).Offset(, 1) = Target.Address
        End If
    Next
    
    Application.EnableEvents = True 'Ereignis-Handler aktivieren
End Sub
Salu, NoNet


Anzeige
AW: Zeitstempel beim Löschen von Zeilen
14.06.2023 14:01:25
Daniel
Hi
Ob zeilen gelöscht wurden oder nicht, kann man mit einem einfachen Trick prüfen:
man erstellt im SelectionChange-Event einen Namen, der auf die selektierten Zeilen referenziert.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Names.Add "test", Target.EntireRow
End Sub
wenn dann diese Zeilen gelöscht werden, verliert der Name seine Zellen, und die Formel wird entsprechend abgeändert (Bezugsfehler)
das kann man dann abfragen und als Prüfung verwenden:

Private Sub Worksheet_Change(ByVal Target As Range)
If Names("test").RefersToR1C1 Like "*REF!" Then
    MsgBox "Zeile wurde gelöscht"
Else
    MsgBox "Zeile nicht gelöscht"
End If
End Sub
Gruß Daniel


Anzeige
Name für jede Zeile erstellen ?
14.06.2023 14:12:41
NoNet
Hallo Daniel,

dann müsste man aber für jede Zeile einen separaten Namen erstellen, denn wenn eine einzelne Zeile gelöscht wird, ist ja nicht automatisch der Name gelöscht.
Natürlich könnte man auch den gesamten Referenzbereich überprüfen (also z.B. : If Names("Teilnehmer").RefersToR1C1 = "=Tabelle1!R2C1:R99C17" Then ), aber auch das ist nicht ganz so nachhaltig.....

Das müsste man noch ein wenig ausbauen (Bereich zuvor getrennt in Variable initialisieren, auf Einfügen/Löschen von Zeilen innerhalb des Bereiches reagieren und die Variable entsprechend anpassen etc.)...

Ciao, NoNet


Anzeige
AW: Name für jede Zeile erstellen ?
14.06.2023 14:29:52
Daniel
Der Anwender kann nur das Löschen, was er zuvor selektiert hat.
Also reicht es aus, im SelectionChange-Event (welches immer vor der jeweiligen Aktion ausgeführt wird), den selektierten Zellbereich einem Namen zuzuweisen, dieser Name kann immer überschrieben werden.
Bei einer Änderung wird das Change-Event immer direkt nach der Änderung ausgeführt, also bevor der Anwender noch was anders selektieren kann.
daher kann man das so verwenden, wie ich es geschrieben habe.

Hast du getestet und Probleme festgestellt oder hast du auf Basis des Codes Vermutungen angestellt?

Gruß Daniel


Anzeige
AW: Zeitstempel beim Löschen von Zeilen
14.06.2023 14:33:41
Ulf
o.w.


Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xRInt1 As Integer
    Dim xRInt2 As Integer
    Dim xDStr As String
    Dim xFStr1 As String
    Dim xFStr2 As String
    Dim bIsRowDeleted as Boolean
    On Error Resume Next
    xDStr = "A:Q" 'Data Column
    xFStr1 = "R" 'Timstamp Column
    xFStr2 = "S" 'User Column
    
    Dim rg As Range
    Set rg = Application.Selection
    bIsRowDeleted = rg.EntireRow.Columns.Count = rg.Columns.Count Then
    If Not bIsRowDeleted Then
        If (Not Application.Intersect(Me.Range(xDStr & ":" & xDStr), Target) Is Nothing) Then
            xRInt1 = Target.Row
            Me.Range(xFStr1 & xRInt1) = Format(Now(), "mm/dd/yyyy hh:mm:ss")
            Me.Range(xFStr2 & xRInt1) = Environ("Username")
        End If
    Else
        'Mach was anderes
    End If
End Sub
hth
Gruss
Ulf


Anzeige
AW: Zeitstempel beim Löschen von Zeilen
15.06.2023 11:32:23
Marc Free
Vielen Dank Euch allen für Euren Input!

Das Makro von Uwe läuft, nachdem ich ein "Then" entfernt hatte super!

Hier das korrigierte Makro:



Private Sub Worksheet_Change(ByVal Target As Range)
    Dim xRInt1 As Integer
    Dim xRInt2 As Integer
    Dim xDStr As String
    Dim xFStr1 As String
    Dim xFStr2 As String
    Dim bIsRowDeleted as Boolean
    On Error Resume Next
    xDStr = "A:Q" 'Data Column
    xFStr1 = "R" 'Timstamp Column
    xFStr2 = "S" 'User Column
    
    Dim rg As Range
    Set rg = Application.Selection
    bIsRowDeleted = rg.EntireRow.Columns.Count = rg.Columns.Count
    If Not bIsRowDeleted Then
        If (Not Application.Intersect(Me.Range(xDStr & ":" & xDStr), Target) Is Nothing) Then
            xRInt1 = Target.Row
            Me.Range(xFStr1 & xRInt1) = Format(Now(), "mm/dd/yyyy hh:mm:ss")
            Me.Range(xFStr2 & xRInt1) = Environ("Username")
        End If
    Else
        'Mach was anderes
    End If
End Sub
Gruß

Marc


Anzeige
AW: Zeitstempel beim Löschen von Zeilen
15.06.2023 17:08:37
Ulf
then mea culpa
Grüsse
Ulf

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige