Veröffentlicht 1. Februar 201015 j 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
1. Februar 201015 j 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?
1. Februar 201015 j 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.
1. Februar 201015 j 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
1. Februar 201015 j 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.
2. Februar 201015 j 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?
2. Februar 201015 j 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]
2. Februar 201015 j 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
2. Februar 201015 j Es werden jedoch nicht die ganzen Zeilen gelöscht.Sondern? Werden nur halbe Zeilen gelöscht? Werden manche Zeilen gar nicht gelöscht? Wenn ja, welche?
2. Februar 201015 j Welche Zellen? Und versuch's mal mit ws.Rows(x).Delete. Keine Ahnung, worauf sich .Rows bezieht, wenn da kein with-Block ist.
2. Februar 201015 j 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.