Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

VBA Listbox

Empfohlene Antworten

Veröffentlicht

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

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?

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.

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

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.

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?

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]

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

Es werden nur einzelne Zellen gelöscht.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.