Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Event für Zeile löschen

Forumthread: Event für Zeile löschen

Event für Zeile löschen
03.02.2008 13:11:00
Joachim
Hallo,
ich bin auf der Suche nach einem Event was ausgelöst wird, wenn man eine Zeile löscht...
Mit WorksheetChange kann man ja feststellen wenn eine Zeile eingefügt wird, aber leider wird dies scheinbar zumindest unter Excel 2000 nicht aufgerufen wenn eine Zeile gelöscht wird.
Was gibt es sonst noch für gute Möglichkeiten zu ermitteln wenn eine Zeile gelöscht wird und welche es ist?
VIELEN DANK

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Event für Zeile löschen
03.02.2008 13:53:52
Nepumuk
Hallo Joachim,
verwechselst du da nicht etwas? Bei mir wird in xl2000 das Change-Ereignis nur durchs löschen, aber nicht durchs einfügen ausgelöst. In 2003 wird es durch beides ausgelöst. Man kann es nur dadurch unterscheiden, dass bei jedem Selection_Change-Ereignis einen Referenzpunkt in eine Zelle geschrieben und geprüft wird, ob sich der verschoben hat. In 2000 würde ich wahrscheinlich alle Menüpunkte zum löschen und einfügen in eine Klasse packen und das Click-Ereignis der Buttons überwachen. Zusätzlich natürlich auch die Shortcuts Strg + und Strg -. Den Referenzpunkt benötige ich aber trotzdem, denn wenn keine ganze Zeile/Spalte markiert ist, kommt ein kleines Auswahlform und da kann ich auch abbrechen.
Gruß
Nepumuk

Anzeige
AW: Event für Zeile löschen
03.02.2008 14:07:00
Joachim
Hi,
ähm bei mir löst das Change-Ereignis beim einfügen aus! da bin ich mir sicher...
Also im Moment mache ich das folgendermassen:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 2 Then
MsgBox "B geändert! in Zeile" & Target.Row
End if
....
....
Wie kann ich den die ganzen Menüeinträge ansprechen bzw. abfangen wenn der benutzer auf die verschiedenen menüs klickt?
Danke! Für die hilfe...

Anzeige
AW: Event für Zeile löschen
03.02.2008 14:30:42
Nepumuk
Hallo Joachim,

Wie kann ich den die ganzen Menüeinträge ansprechen bzw. abfangen wenn der benutzer auf die verschiedenen menüs klickt?


na indem du zwei Klassen erstellst (eine für's einfügen und eine für's löschen), mit der FindControls-Methode die entsprechenden ID's suchst und an die jeweilige Klasse verweist.
Gruß
Nepumuk

Anzeige
AW: Event für Zeile löschen
03.02.2008 18:05:08
Joachim
Hallo,
vielen Dank für die Infos.
Leider reichen scheinbar meine Kenntnisse noch nicht aus...
Wie ermittle ich mit der Methode die Ids und was mache ich dann?
Für weitere Tipps wäre ich sehr dankbar!!
Gruss
Joachim

AW: Event für Zeile löschen
03.02.2008 21:22:06
Nepumuk
Hallo Joachim,
na dann, erst mal die ID's. Mit folgender Prozedur lassen sich alle auflisten. Das sieht zwar ein bisschen umständlich aus, aber wenn ich durch das Auflistungsobjekt der Controls einer Commandbar laufe, bekomme ich komischerweise nicht alle zurück.
Public Sub ID_List()
    Dim lngIndex As Long, lngRow As Long
    Dim objBar As CommandBar, objControl As CommandBarControl
    lngRow = 1
    Application.ScreenUpdating = False
    Cells.Clear
    For lngIndex = 1 To 31500
        For Each objBar In Application.CommandBars
            Set objControl = objBar.FindControl(ID:=lngIndex, Recursive:=True)
            If Not objControl Is Nothing Then
                lngRow = lngRow + 1
                Cells(lngRow, 1) = objControl.ID
                Cells(lngRow, 2) = objControl.Index
                Cells(lngRow, 3) = Replace(objControl.Caption, "&", "")
                Cells(lngRow, 4) = objControl.Type
                If objControl.Type = 1 Then Cells(lngRow, 5) = objControl.FaceId
                Cells(lngRow, 6) = objBar.Name
                Cells(lngRow, 7) = objBar.NameLocal
                Cells(lngRow, 8) = objBar.Index
            End If
        Next
    Next
    With Range("A1:H1")
        .Value = Array("ID Control", "Index Control", "Caption Control", "Typ Control", "FaceId Control", "In Leiste engl.", "In Leiste deutsch", "Index Leiste")
        .Font.Bold = True
        .AutoFilter
    End With
    Columns.AutoFit
    Application.ScreenUpdating = True
End Sub

Über die ID eines Controls kannst du nach ihm suchen. Das geht so:
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

Private objInsertButtonClass As clsInsertButton

Public Sub Intialize_Class()
    Dim objControls As CommandBarControls
    Set objControls = CommandBars.FindControls(ID:=3183) '3183=Zellen einfügen
    If Not objControls Is Nothing Then
        Set objInsertButtonClass = New clsInsertButton
        Set objInsertButtonClass.prpSetButton = objControls.Item(1)
    End If
End Sub

Public Sub Terminate_Class()
    Set objInsertButtonClass = Nothing
End Sub

Dazu benötigst du dann noch ein Klassenmodul mit dem Namen "clsInsertButton" und folgendem Code:
' **********************************************************************
' Modul: clsInsertButton Typ: Klassenmodul
' **********************************************************************

Option Explicit

Private WithEvents mobjButton As Office.CommandBarButton

Friend Property Set prpSetButton(objButton As Office.CommandBarButton)
    Set mobjButton = objButton
End Property

Private Sub mobjButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    MsgBox "Einfügen"
End Sub

An Stelle der MsgBox kommt natürlich dein Code. Wenn du die Variable "CancelDefault" in der Prozedur auf True setzt, wird die Standardroutine des Buttons nicht ausgeführt und du kannst sie durch eine eigene Routine ersetzen.
Gruß
Nepumuk

Anzeige
AW: Event für Zeile löschen
03.02.2008 21:30:00
Joachim
Hey super!
Das sieht doch schonmal Klasse aus! Ich werde es spätestens morgen ausprobieren und bei mir in das System reinbasteln!
Vielen vielen Dank für den ausführlichen code!!! Damit sollte es auf alle Fälle klappen!
DANKE!
Gruss
Joachim
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige

Infobox / Tutorial

Event für Zeile löschen in Excel


Schritt-für-Schritt-Anleitung

Um ein Event zu erstellen, das ausgelöst wird, wenn eine Zeile in Excel gelöscht wird, kannst du die Worksheet_Change-Methode verwenden. Hier ist eine grundlegende Schritt-für-Schritt-Anleitung:

  1. Öffne den VBA-Editor:

    • Drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Wähle das Arbeitsblatt aus:

    • Doppelklicke auf das Arbeitsblatt, in dem du das Event implementieren möchtest.
  3. Füge den Code hinzu:

    • Verwende den folgenden Code, um das Event für das Löschen einer Zeile zu implementieren:
    Private Sub Worksheet_Change(ByVal Target As Range)
       If Target.Columns.Count > 1 Then Exit Sub 'Überprüfen, ob mehr als eine Spalte betroffen ist
       If Target.Row > 0 Then
           MsgBox "Eine Zeile wurde geändert oder gelöscht!"
       End If
    End Sub
  4. Testen:

    • Lösche eine Zeile in deinem Excel-Dokument und beobachte, ob die Meldung erscheint.

Häufige Fehler und Lösungen

  • Fehler: Das Event wird nicht ausgelöst
    Lösung: Stelle sicher, dass du die richtige Arbeitsblatt-Sicht im VBA-Editor ausgewählt hast. Das Worksheet_Change-Event funktioniert nur für das spezifische Arbeitsblatt, in dem der Code geschrieben ist.

  • Fehler: Mehrere Zeilen werden als gelöscht erkannt
    Lösung: Prüfe die Bedingung im Code und stelle sicher, dass du nur auf Änderungen an einer Zeile reagierst.


Alternative Methoden

Wenn du speziellere Anforderungen hast, kannst du auch andere Methoden verwenden:

  • Selection_Change-Ereignis: Dies kann nützlich sein, um Änderungen an der Auswahl zu verfolgen und entsprechend zu reagieren.

  • Klassenmodule: Erstelle Klassenmodule, um die Menüeinträge für Einfügen und Löschen zu überwachen, wie von Nepumuk vorgeschlagen.

Hier ein Beispiel, wie du mit der FindControls-Methode arbeiten kannst, um die ID eines Controls zu finden:

Dim objControl As CommandBarControl
Set objControl = Application.CommandBars.FindControl(ID:=3183) 'ID für Zellen einfügen
If Not objControl Is Nothing Then
    ' Dein Code hier
End If

Praktische Beispiele

Hier sind einige praktische Beispiele, um das Löschen von Zeilen in Excel zu überwachen:

  1. Einfaches Meldungsfenster:

    Private Sub Worksheet_Change(ByVal Target As Range)
       If Target.Rows.Count > 1 Then
           MsgBox "Mehrere Zeilen wurden gelöscht oder geändert."
       End If
    End Sub
  2. Protokollierung der gelöschten Zeilen:

    Private Sub Worksheet_Change(ByVal Target As Range)
       Dim logRow As Long
       logRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
       Cells(logRow, 1).Value = "Gelöscht: " & Target.Address
    End Sub

Tipps für Profis

  • Verwende Error-Handling: Um sicherzustellen, dass dein Code auch bei unerwarteten Eingaben stabil bleibt, integriere On Error Resume Next in deinen VBA-Code.

  • Optimierung der Performance: Schalte Application.ScreenUpdating auf False, während dein Code ausgeführt wird, um die Performance zu verbessern.

  • Benutze benannte Bereiche: Dies macht deinen Code lesbarer und einfacher zu warten.


FAQ: Häufige Fragen

1. Wie kann ich das Löschen von Zeilen in Excel 2000 verfolgen?
In Excel 2000 kann das Worksheet_Change-Ereignis manchmal unzuverlässig sein. Es empfiehlt sich, Selection_Change zu verwenden, um Veränderungen in der Auswahl zu überwachen.

2. Warum wird mein Event nicht ausgelöst, wenn ich eine Zeile lösche?
Das kann daran liegen, dass die Zeile nicht vollständig gelöscht wurde oder dass es sich um eine Batch-Änderung handelt. Stelle sicher, dass du die richtigen Ereignisse für deine Anforderungen verwendest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige