Rainman1981 Geschrieben 1. Februar 2010 Geschrieben 1. Februar 2010 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 Zitieren
Klotzkopp Geschrieben 1. Februar 2010 Geschrieben 1. Februar 2010 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? Zitieren
Rainman1981 Geschrieben 1. Februar 2010 Autor Geschrieben 1. Februar 2010 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. Zitieren
Rainman1981 Geschrieben 1. Februar 2010 Autor Geschrieben 1. Februar 2010 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 Zitieren
Klotzkopp Geschrieben 1. Februar 2010 Geschrieben 1. Februar 2010 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. Zitieren
Rainman1981 Geschrieben 2. Februar 2010 Autor Geschrieben 2. Februar 2010 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? Zitieren
Klotzkopp Geschrieben 2. Februar 2010 Geschrieben 2. Februar 2010 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] Zitieren
Rainman1981 Geschrieben 2. Februar 2010 Autor Geschrieben 2. Februar 2010 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 Zitieren
Klotzkopp Geschrieben 2. Februar 2010 Geschrieben 2. Februar 2010 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? Zitieren
Rainman1981 Geschrieben 2. Februar 2010 Autor Geschrieben 2. Februar 2010 Es werden nur einzelne Zellen gelöscht. Zitieren
Klotzkopp Geschrieben 2. Februar 2010 Geschrieben 2. Februar 2010 Welche Zellen? Und versuch's mal mit ws.Rows(x).Delete. Keine Ahnung, worauf sich .Rows bezieht, wenn da kein with-Block ist. Zitieren
Rainman1981 Geschrieben 2. Februar 2010 Autor Geschrieben 2. Februar 2010 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. Zitieren
Empfohlene Beiträge
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.