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

Ja genau.

Das funktioniert alles schon.

Ich weiß nicht wie ich die Werte in der Listbox ansprechen kann.

Das ist das größte Problem. Das andere werde ich dann schon selber hinbekommen.

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

Geschrieben

Vielen Dank.

Jetzt funktionierts einwandfrei. Ich hab wirklich einige Varianten durchprobiert, aber ws.Rows(x).Delete war wohl nicht dabei.

Bin halt noch nicht so fit in VBA.

Hast mir sehr geholfen.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...