Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich habe folgendes Problem:

Ich habe eine Userform mit 2 Listboxen.

In Listbox1 stehen bereits Werte drin.

Diese kann ich auswählen und über eine Schaltfläche in die Listbox2 übertragen.

Im nächsten Schritt möchte ich die Werte der Listbox2 mit einem Tabellenblatt vergleichen. Das bedeutet wenn ein in Listbox2 enthaltener Werte in der Spaltte A der Tabelle1 vorkommt soll die ganze Zeile gelöscht werden.

Bin für jeden Rat dankbar.

Vielen Dank im Voraus

Geschrieben

In Listbox1 stehen bereits Werte drin.

Diese kann ich auswählen und über eine Schaltfläche in die Listbox2 übertragen.

Das heißt, das alles funktioniert schon?

Bin für jeden Rat dankbar.
Wo genau ist denn das Problem? Weißt du nicht, wie du an die Werte in Listbox2 rankommst? Weißt du nicht, wie du Spalte A durchsuchst? Weißt du nicht, wie du eine Zeile löschst?
Geschrieben

Bis jetzt sieht das bei mir so aus.

Das funktioniert aber nur, wenn in der Listbox nicht mehr als ein Wert enthalten ist.

Private Sub CommandButton4_Click()

Dim ws As Worksheet

Set ws = ActiveSheet

Dim x As Integer

Dim lz As Integer

lz = ws.Cells(60000, 13).End(xlUp).Row

If ListBox2.ListIndex = -1 Then Exit Sub

For i = 0 To ListBox2.ListCount - 1

For x = lz To 13 Step -1

With ActiveSheet

If Cells(x, 13).Value <> ListBox2.List(i) Then .Rows(x).Delete

End With

Next

Next

End Sub

Geschrieben
Das funktioniert aber nur, wenn in der Listbox nicht mehr als ein Wert enthalten ist.
Du solltest auch immer dazu schreiben, wie genau das "Nicht-funktionieren" aussieht.

Lass mich raten: Bei mehr als einem Listeneintrag wird einfach alles gelöscht?

Es soll eine Zeile gelöscht werden, wenn die Zelle mit allen Listeneinträgen nicht übereinstimmt, stimmts?

Du löschst aber die Zeile, wenn die Zelle mit irgendeinem Listeneintrag nicht übereinstimmt.

Der Effekt bei mindestens zwei unterschiedlichen Einträgen ist, das alles gelöscht wird, denn alles, was auf den ersten Eintrag passt (und damit im ersten Durchlauf stehenbleibt), passt dann natürlich nicht mehr auf den zweiten Eintrag, und wird damit auch gelöscht.

Das ist ein Logikfehler in deinem Code.

Du musst jede Zelle mit jedem Listeneintrag vergleichen, aber nur, wenn dabei keine Übereinstimmung gefunden wurde, darfst du löschen.

Geschrieben

Vielen Dank erst mal für deine Hilfe.

Das ist genau das Problem.

Bei mehr als einem Eintrag wird alles gelöscht.

Wie kann ich den Code denn umstellen, damit jede Zelle mit jedem Listeneintrag verglichen wird?

Geschrieben

Zuerst solltest du die innere und äußere Schleife vertauschen. Momentan vergleichst du erst jede Zelle mit dem ersten Listeneintrag, dann jede Zelle mit dem zweiten usw. Das ist nicht zielführend, weil du dann erst im letzten Durchlauf der äußeren Schleife wissen kannst, ob du löschen darfst.

Wenn du aber erst die erste Zelle mit jedem Listeneintrag vergleichst, dann die zweite Zelle usw., kannst du nach jedem Durchlauf der inneren Schleife entscheiden, ob die Zeile gelöscht werden muss.

Dazu solltest in der äußeren Schleife, aber vor der inneren Schleife eine Variable anlegen, die speichert, ob du für diese Zeile eine Übereinstimmung gefunden hast. Anfangs steht die auf False. Wenn du in der inneren Schleife eine Übereinstimmung findest, setzt du sie auf True.

Und wenn hinter der inneren (aber noch innerhalb der äußeren) Schleife diese Variable immer noch False ist, hast du für diese Zeile keine Übereinstimmung gefunden und kannst sie löschen.

Sinngemäß:

For Zellen
gefunden = False
For Listeneinträge
if Zelle = Listeneintrag Then gefunden = True
Next
if Not gefunden Then Löschen
Next[/code]

Geschrieben

Vielen Dank für deine Hilfe.

Hat bis auf eine Kleinigkeit einwandfrei funktioniert.

Hab mir auch schon gedacht, dass ich die Schleifen umtauschen muss.

Es werden jedoch nicht die ganzen Zeilen gelöscht.

Private Sub CommandButton4_Click()

Dim ws As Worksheet

Set ws = ActiveSheet

Dim x As Integer

Dim lz As Integer

lz = ws.Cells(60000, 13).End(xlUp).Row

If ListBox2.ListIndex = -1 Then Exit Sub

For x = lz To 13 Step -1

gefunden = False

For i = 0 To ListBox2.ListCount - 1

If ws.Cells(x, 13).Value = ListBox2.List(i) Then gefunden = True

Next

If Not gefunden Then .Rows(x).Delete

Next

End Sub

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...