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

Forumthread: Worksheet_Change bei löschen von Zellenwerten

Worksheet_Change bei löschen von Zellenwerten
23.02.2018 21:11:25
Zellenwerten
Hallo Zusammen,
wenn ich in Spalte A ab der 9. Zeile einen Wert eintrage, dann sollen mir aus dem Worksheet " _ Leistungsbeschreibung" entsprechende Daten geholt werden und in die Spalte B und D geschrieben werden. Das funktioniert auch mit folgendem Code:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim wkb As Workbook
Dim wks_Leist As Worksheet
Dim Zelle As Range
Dim Zahl As Integer
Dim Zeile As Variant
Dim Spalte As Variant
Dim Leistung As Variant
Dim Leistung1 As Variant
Set wkb = ThisWorkbook
Set wks_Leist = wkb.Worksheets("Leistungsbeschreibung")
Set Zelle = wkb.Worksheets("Eingabeformular").Cells(1, 1)
Zahl = Zelle.Value
Zeile = Selection.Address
Select Case Zahl
Case Is = 1
Spalte = 1
Case Is = 2
Spalte = 5
Case Is = 3
Spalte = 13
Case Is = 4
Spalte = 9
End Select
If Target.Column = 1 And Target.Row > 9 Then
lz = wks_Leist.Cells(Rows.Count, Spalte).End(xlUp).Row
For i = 3 To lz
Leistung = Target.Value
Leistung1 = wks_Leist.Cells(i, Spalte).Value
If Leistung = Leistung1 Then      'hier kommt der Fehler
Application.EnableEvents = False
ActiveSheet.Cells(ActiveCell.Row, 2) = wks_Leist.Cells(i, Spalte + 1)
ActiveSheet.Cells(ActiveCell.Row, 4) = wks_Leist.Cells(i, Spalte + 2)
Application.EnableEvents = True
End If
Next i
End If
End Sub

Wenn ich nun die Zellen markiere und lösche, ob per vba oder "von Hand", bekomme ich die Fehlermeldung: Typen unverträglich (siehe im Code die Stelle wo der Fehler auftaucht)
Wie bitt muss ich das ändern, bzw. warum kommt der Fehler?
Gruß Oisse
Anzeige

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Probier mal AS String statt Variant
23.02.2018 21:15:38
Matthias
Hallo
Dim Leistung As String
Dim Leistung1 As String
nicht getestet!
Gruß Matthias
AW: Probier mal AS String statt Variant
23.02.2018 21:21:36
Oisse
Hallo Matthias,
danke für die schnelle Antwort. Das war´s aber leider nicht.
Es kommt die gleiche Fehlermeldung.
AW: Probier mal AS String statt Variant
23.02.2018 21:25:31
Oisse
Habe nochmal nachgesehen,
diesmal kommt die Fehlermeldung zwei Zeilen früher nämlich bei:
Leistung = Target.Value
Irgendeine Idee?
Anzeige
Lösung gefunden
23.02.2018 21:33:10
Oisse
Das Makro hat Target.Value nicht akzeptiert oder konnte nichts damit anfangen oder, oder oder.
Auf jeden Fall kam bei Target.Value der Fehler.
Ich habe jetzt Target.Cell(Target.Row,Target.Column).Value genommen und es funktioniert.
Aber warum?
Könnte mir bitte noch jemand erklären, was bei dem einen und was bei dem anderen passiert?
Anzeige
AW: Lösung gefunden
23.02.2018 21:50:48
Oisse
Tut mir leid, wenn ich nerve, aber da war ich wohl zu euphorisch.
Jetzt funktioniert zwar das löschen aber jetzt bekomme ich keinen Wert.
Hab mittlerweile so viel durchprobiert, aber ich versteh einfach nicht, was da passiert. Seufz
AW: Lösung gefunden
23.02.2018 22:08:01
onur
Dann poste doch mal die Datei.
Löschst du mehrere Zellen auf 1mal? Das sieht ...
23.02.2018 22:21:16
Luc:-?
…dein Pgm nämlich nicht vor, Oisse!
Das würde auch den Fehler verursachen, denn ein ZellBereich mit mehreren Werten (auch leer!) ist niemals mit einem Einzelwert vergleichbar!
Außerdem, wofür soll Zeile verwendet wdn? Hier wohl gar nicht und das wäre dann auch keine ZeilenNr (Zahl), sondern eine ganze Adresse (Text). Statt des Select Case-Konstrukts könnte man auch ein indiziertes Array verwenden…
Gruß, Luc :-?
Anzeige
AW: Löschst du mehrere Zellen auf 1mal? Das sieht ...
23.02.2018 22:41:42
Oisse
Danke euch beiden für eure Antworten.
@ Luc
Du hast Recht: Zahl und Zeile wird in diesem Code nicht benötigt (Überbleibsel von reinkopiertem Code)
Das mit dem Löschen von mehreren Zellen auf einmal stimmt. Das mache ich tatsächlich.
Heißt das, ich müsste Zeile für Zeile löschen?
Mein Code sieht jetzt so aus:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim wkb As Workbook
Dim wks_Leist As Worksheet
Dim Zelle As Range
Dim Spalte As Variant
Dim Leistung As Variant
Dim Leistung1 As Variant
Set wkb = ThisWorkbook
Set wks_Leist = wkb.Worksheets("Leistungsbeschreibung")
Set Zelle = wkb.Worksheets("Eingabeformular").Cells(1, 1)
Select Case Zahl
Case Is = 1
Spalte = 1
Case Is = 2
Spalte = 5
Case Is = 3
Spalte = 13
Case Is = 4
Spalte = 9
End Select
If Target.Column = 1 And Target.Row > 9 Then
lz = wks_Leist.Cells(Rows.Count, Spalte).End(xlUp).Row
For i = 3 To lz
If ActiveCell  "" Then
Leistung = Target.Value
Leistung1 = wks_Leist.Cells(i, Spalte).Value
If Leistung = Leistung1 Then
Application.EnableEvents = False
ActiveSheet.Cells(ActiveCell.Row, 2) = wks_Leist.Cells(i, Spalte + 1)
ActiveSheet.Cells(ActiveCell.Row, 4) = wks_Leist.Cells(i, Spalte + 2)
Application.EnableEvents = True
End If
Else
Exit Sub
End If
Next i
End If
End Sub
Ich habe Target.Value mit ActiveCell ersetzt.
Momentan läuft es gut.
Es funktioniert beides. Das Löschen und das Einlesen der Daten aus einem anderen Sheet.
Anzeige
Target.Cells(1) <> "" hätt's auch getan... ;-) owT
23.02.2018 23:50:33
Luc:-?
:-?
AW: Löschst du mehrere Zellen auf 1mal? Das sieht ...
24.02.2018 00:06:31
KlausF
Hi,
bei mir funktioniert das hier (mit Löschen von mehreren Zellen):
Private Sub Worksheet_Change(ByVal Target As Range)
Dim wkb As Workbook
Dim wks_Leist As Worksheet
Dim Zelle As Range
Dim Zahl As Integer
Dim Spalte As Integer
Dim Leistung As Variant
Dim Leistung1 As Variant
Dim lz As Long
Dim i As Long
Set wkb = ThisWorkbook
Set wks_Leist = wkb.Worksheets("Leistungsbeschreibung")
Set Zelle = wkb.Worksheets("Eingabeformular").Cells(1, 1)
Zahl = Zelle.Value
Select Case Zahl
Case Is = 1: Spalte = 1
Case Is = 2: Spalte = 5
Case Is = 3: Spalte = 13
Case Is = 4: Spalte = 9
End Select
If Target.Column = 1 And Target.Row > 9 Then
Leistung = Target.Value
#If VBA7 Then
If Target.CountLarge > 1 Then GoTo Errorhandler
#Else
If Target.Count > 1 Then GoTo Errorhandler
#End If
lz = wks_Leist.Cells(Rows.Count, Spalte).End(xlUp).Row
For i = 3 To lz
Leistung1 = wks_Leist.Cells(i, Spalte).Value
If Leistung = Leistung1 Then
Application.EnableEvents = False
ActiveSheet.Cells(ActiveCell.Row, 2) = wks_Leist.Cells(i, Spalte + 1)
ActiveSheet.Cells(ActiveCell.Row, 4) = wks_Leist.Cells(i, Spalte + 2)
Application.EnableEvents = True
End If
Next i
End If
Errorhandler:
Set wkb = Nothing
Set wks_Leist = Nothing
Set Zelle = Nothing
End Sub
Gruß
Klaus
If ActiveCell "" Then bzw. Target.Cells(1) funktioniert bei mir nicht, deshalb 'rausgenommen
Anzeige
AW: Löschst du mehrere Zellen auf 1mal? Das sieht ...
27.02.2018 13:19:39
Oisse
Hallo nochmal alle Zusammen.
Sorry, dass ich erst jetzt dazu komme Danke zu sagen. Grippisch.
Also danke an:
Luc:-?
KlausF (diesen Vorschlag habe ich übrigens übernommen :-))
Onur, der bereit gewesen wäre meine Datei anzuschauen und
Mathias L
und alle anderen, die sich meinem Problem zumindest gedanklich auseinandergesetzt haben.
Ein klasse Forum!
Gruß Oisse
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Anzeige

Infobox / Tutorial

Automatisches Löschen von Zellinhalten mit Worksheet_Change in Excel VBA


Schritt-für-Schritt-Anleitung

Um das Löschen von Zellinhalten in Excel VBA zu automatisieren, kannst du das Worksheet_Change-Ereignis nutzen. Folge diesen Schritten:

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.
  2. Wähle das entsprechende Arbeitsblatt aus, in dem das Worksheet_Change-Ereignis implementiert werden soll.
  3. Füge den folgenden Code in das Arbeitsblattmodul ein:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim wkb As Workbook
    Dim wks_Leist As Worksheet
    Dim Spalte As Long
    Dim Leistung As Variant
    Set wkb = ThisWorkbook
    Set wks_Leist = wkb.Worksheets("Leistungsbeschreibung")

    If Target.Column = 1 And Target.Row > 9 Then
        If Target.CountLarge > 1 Then
            For Each Cell In Target
                If Cell.Value <> "" Then
                    Leistung = Cell.Value
                    ' Hier kannst du die Logik zum Abrufen der Werte aus wks_Leist hinzufügen
                End If
            Next Cell
        Else
            Leistung = Target.Value
            ' Hier kannst du die Logik zum Abrufen der Werte aus wks_Leist hinzufügen
        End If
    End If
End Sub
  1. Teste das Makro, indem du Werte in die Zellen der Spalte A ab der Zeile 9 eingibst und lösche.

Häufige Fehler und Lösungen

  • Fehler: Typen unverträglich

    • Ursache: Dieser Fehler tritt häufig auf, wenn du versuchst, einen Zellbereich mit mehreren Zellen als einzelnen Wert zu verarbeiten.
    • Lösung: Stelle sicher, dass du mit einer einzelnen Zelle arbeitest oder den Code so anpasst, dass er mit einem Zellbereich umgehen kann. Nutze If Target.CountLarge = 1 um sicherzustellen, dass nur eine Zelle bearbeitet wird.
  • Fehler: Target.Value akzeptiert keine leeren Zellen

    • Ursache: Wenn du versuchst, einen leeren Zellwert zu verarbeiten.
    • Lösung: Füge eine Bedingung hinzu, die sicherstellt, dass der Zellwert nicht leer ist, bevor du ihn verarbeitest.

Alternative Methoden

Eine alternative Methode, um die Inhalte mehrerer Zellen zu löschen, ist die Verwendung einer Schleife, die durch die Zellen iteriert. Hier ist ein Beispiel:

For Each Cell In Range("A10:A20")
    If Cell.Value <> "" Then
        Cell.ClearContents ' Löscht nur den Inhalt der Zelle
    End If
Next Cell

Diese Methode stellt sicher, dass nur die Inhalte der Zellen gelöscht werden, ohne die Formatierungen zu beeinflussen.


Praktische Beispiele

Hier sind einige praktische Beispiele für die Verwendung des Worksheet_Change-Ereignisses:

  • Datenabruf bei Zelleingabe: Wenn du in die Zelle A10 einen Wert eingibst, wird automatisch ein entsprechender Wert aus dem Arbeitsblatt „Leistungsbeschreibung“ in die Zellen B10 und D10 eingetragen.

  • Löschen von Werten: Wenn du mehrere Zellen in Spalte A markierst und löschst, wird diese Aktion aufgefangen, und die entsprechenden Daten in den anderen Spalten werden ebenfalls aktualisiert.


Tipps für Profis

  • Nutze die Application.EnableEvents = False und Application.EnableEvents = True Anweisungen, um zu verhindern, dass das Makro sich selbst auslöst, wenn du Zellen änderst.
  • Verwende Target.Cells(1).Value, um sicherzustellen, dass du immer den Wert der ersten Zelle im Bereich verarbeitest, wenn mehrere Zellen betroffen sind.
  • Halte den Code sauber und dokumentiere wichtige Schritte, damit andere oder zukünftige Du selbst die Logik schnell nachvollziehen können.

FAQ: Häufige Fragen

1. Was ist Worksheet_Change?
Worksheet_Change ist ein Ereignis in Excel VBA, das ausgelöst wird, wenn sich der Inhalt einer Zelle ändert. Es ist nützlich, um automatisierte Aktionen basierend auf Benutzereingaben durchzuführen.

2. Warum funktioniert mein Code nicht, wenn ich mehrere Zellen gleichzeitig ändere?
Wenn du mehrere Zellen auf einmal änderst, musst du sicherstellen, dass dein Code in der Lage ist, mit einem Zellbereich umzugehen. Verwende eine Schleife, um durch jede Zelle im Target-Bereich zu iterieren.

3. Wie kann ich verhindern, dass mein Code bei jedem Zellwechsel ausgeführt wird?
Verwende Application.EnableEvents = False, um das Auslösen anderer Ereignisse zu verhindern, während dein Code läuft. Vergiss nicht, es am Ende deines Codes wieder auf True zu setzen.

4. Was bedeutet Target.CountLarge?
Target.CountLarge gibt die Anzahl der Zellen im Target-Bereich zurück. Es ist nützlich, um zu überprüfen, ob mehr als eine Zelle betroffen ist, insbesondere bei großen Zellbereichen.

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