Live-Forum - Die aktuellen Beiträge
Datum
Titel
17.04.2024 18:57:33
17.04.2024 16:56:58
Anzeige
Archiv - Navigation
1400to1404
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listbox anhand Combobox füllen

Listbox anhand Combobox füllen
20.01.2015 11:13:07
Marco
Ich suche schon mehrere Std und finde keine pasende Lösung.
Folgende Ausgangssituation:
---a--b---c---d---e---f
1- 1- 1b- 1c- 1d- 1e- 1f
2- 2- 2b- 2c- 2d- 2e- 2f
3- 3- 3b- 3c- 3d- 3e- 3f
4- 4- 4b- 4c- 4d- 4e- 4f
Das ist meine Beispiel Tabelle.
In einer userform habe ich eine Combobox mit werten aus Spalte A und eine Listbox.
Wenn ich z.B. in Combobox den Wert 2 (Zelle 2A) auswähle, soll in einer Listbox der Wert aus der rechts daneben liegenden Spalte wiedergegeben werden. Also "2b".
Danke für eine schnelle Hilfe...
VG

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
SVERWEIS
20.01.2015 11:28:16
Klaus
Hallo Marco,
das kannst du mit einem einfachen SVERWEIS machen, auch unter VBA!
Etwa so für deine Musterdatei:
Private Sub ComboBox1_Change()
ListBox1.Clear
ListBox1.AddItem WorksheetFunction.VLookup(--ComboBox1.Value, ActiveSheet.Range("A1:B4"), 2,  _
False)
End Sub
oder mit etwas Fehlerbehandlung
Private Sub ComboBox1_Change()
ListBox1.Clear
If IsNumeric(ComboBox1.Value) Then
ListBox1.AddItem WorksheetFunction.VLookup(--ComboBox1.Value, ActiveSheet.Range("A1:B4"), 2, _
False)
Else
ListBox1.AddItem WorksheetFunction.VLookup(ComboBox1.Value, ActiveSheet.Range("A1:B4"), 2,  _
False)
End If
End Sub
Anmerkung: in deiner Mustertabelle steht 1-2-3, der SVERWEIS hat mit "Zahlen-Als-Text" so seine Probleme, daher das IsNumeric IF und das doppelminus.
Du hast explizit nach einer Listbox mit einem Eintrag gefragt. Den Sinn muss ich nicht verstehen, aber "Listbox1.Clear" einbauen. Mit einer TextBox wäre das ganze einfacher.
Grüße,
Klaus M.vdT.

Anzeige
AW: SVERWEIS
20.01.2015 12:33:23
Marco
Hallo Klaus,
danke für deine schnelle Antwort.
Die Minuszeichen sind nur als Platzhalter in meiner Beispieltabelle.
Ich dachte Textboxen wären nur zum manuellen füllen gedacht. (Ich bin VBA neuling)
Wenn es damit einfacher ist, dann einfach ListBox in TextBox umbennen in deinem Code?
Natürlich auch in der Userform die Listboxen gegen Textboxen tauschen...
VG
Marco

-- nicht verstanden
20.01.2015 13:13:36
Klaus
Hallo Marco,
das die - Zeichen in deiner "Tabelle" nicht real sind war mir schon klar. Um solche Missverständnisse auszuschließen ist es immer besser, eine Mustertabelle zu laden.
Das Problem: in deinem Muster steht 1, 2 und 3 in Spalte A. Das sind Zahlen (also LONG). Der Inhalt einer Combobox ist aber keine Zahl, sondern ein Text (STRING). 2 LONG ist nicht das gleiche wie 2 STRING, darum wird die SVERWEIS-Formel keine 2 in Spalte A finden.
Wenn ich mit einem STRING eine beliebige Rechenoperation ausführe und er eine Zahl beinhaltet, wird daraus automatisch eine Zahl. Also wird "1" mal 1 zu einer echten 1, oder eben --"1" wird zu 1. -- nehme ich, weil es die am schnellsten zu tippende Rechenoperation ist, genau das gleiche würde ich mit 1*ComboBox1.value erreichen (müsste aber beim Tippen einmal auf dem Keyboard umgreifen).
Problem: Wenn in der ComboBox1 ein Text steht - sagen wir "Hallo" - dann kann man keine Rechenoperation durchführen. Denn 1*"Hallo" oder --"Hallo" ist eben keine gültige Rechnung sondern ein Fehler. Um eben das zu umgehen, habe ich das IF-Konstrukt benutzt.
Wenn in deiner echten Tabelle in Spalte A keine Zahlen stehen sondern Texte, hast du dieses Problem gar nicht und ich habe dich unnötigerweise verwirrt.
Wenn du statt der ListBox eine TextBox benutzen willst, kannst du natürlich nicht mehr mit .additem arbeiten - klar. Stattdessen musst du den Text der TextBox zuweisen. Das sähe dann so aus:
TextBox1.Value = WorksheetFunction.VLookup(ComboBox1.Value, ActiveSheet.Range("A1:B4"), 2,  _
False)
Grüße,
Klaus M.vdT.

Anzeige
AW: Listbox anhand Combobox füllen
20.01.2015 13:48:48
Marco
Hallo Klaus,
vielen Dank und sorry wenn ich nerve. Ich bin absolut neu und baue meine Userform mühselig mit googlesuche zusammen.
Anbei die Tabelle. Ich hätte gern die Request ID aus Spalte I ausgewählt. Folgende werte sollen automatisch übernommen werden. Titel aus Spalte g, Start aus Spalte c, End aus Spalte d, Location aus Spalte f und Typ aus Spalte h.
Geht das überhaupt?
Vielen Dank für deine Mühe...
VG
Marco
https://www.herber.de/bbs/user/95118.xlsm
Userbild

Anzeige
AW: Listbox anhand Combobox füllen
20.01.2015 14:25:30
Klaus
Hallo Marco,
zunächst mal: für ComboBox1 habe ich dir hier den Code geschrieben. Der Rest ist Fleißarbeit. In deiner Musterdatei wird der Code zu einem Fehler führen, da er TextBox7.CHANGE auslöst - die dort fehlerhafte Zeile habe ich einfach auskommentiert.
Private Sub ComboBox1_Change()
On Error GoTo hell
Dim i As Long
i = WorksheetFunction.Match(ComboBox1.Value, Columns(9), False)
TextBox7.Value = Cells(i, 1).Value & "/" & Cells(i, 2).Value
TextBox8.Value = Cells(i, 3).Value
TextBox9.Value = Cells(i, 4).Value
TextBox10.Value = Cells(i, 6).Value
TextBox11.Value = Cells(i, 8).Value
hell:
End Sub
Jetzt aber einen Ratschlag vom "alten Hasen" an den "Neuling":
Deine Namensgebung ist eine Katastrophe. Wenn du in drei Monaten nochmal in den Code schaust, wie willst du dann noch wissen was TextBox7 ist? Gewöhne dir an, alle Objekte sprechend zu benennen! Wenn man es immer gleich macht, ist es kaum Arbeit und der Code wird viel lesbarer. Mal ein Beispiel, sagen wir ich habe für "Location" die falsche Spalte erwischt, oder du musst in der Tabelle eine Spalte einfügen und danach den Code anpassen. Wie hieß nochmal die TextBox, die jetzt geändert werden muss?
Mal ein Beispiel für "sprechenden" Code (genau der gleiche wie oben):
Private Sub CB_Request_K1_Change()
On Error GoTo hell
Dim ZeileFinden As Long
ZeileFinden = WorksheetFunction.Match(CB_Request_K1.Value, Columns(9), False)
TB_Titel_K1.Value = Cells(ZeileFinden, 1).Value & "/" & Cells(ZeileFinden, 2).Value
TB_Start_K1.Value = Cells(ZeileFinden, 3).Value
TB_Ende_K1.Value = Cells(ZeileFinden, 4).Value
TB_Location_K1.Value = Cells(ZeileFinden, 6).Value
TB_Typ_K1.Value = Cells(ZeileFinden, 8).Value
hell:
End Sub

Das ist EXAKT der gleiche Code. Aber wenn du da drin die TextBox für die Location von Kurs 1 suchst, findest du sie umgehend.
Daher mein Rat: Geh die gesamte Userform durch und bring ALLE Namen auf den Stand. Das braucht einmalig ne Stunde Zeit, aber das gesamte weitere Programmieren wird dir viel einfacher von der Hand gehen. Dank mir später :-)
Grüße,
Klaus M.vdT.

Anzeige
Code Verbesserungsvorschläge
20.01.2015 14:35:28
Klaus
Hallo Marco,
der Code auf deinem CommandButton1 (den du in CmB_Aktualisieren umbenennen solltest) ist extrem fehleranfällig. Die "ActiveWindow" zu minimieren und dann zu hoffen im richtigen Fenster zu landen ist ein reines Glücksspiel. Probier mal diese (ungetestete) Version, die sollte genauso laufen aber stabiler sein:
Private Sub CmB_Aktualisieren_Click()
Dim wkbOld As Workbook
Dim wkbNew As Workbook
Set wkbOld = ActiveWorkbook
ChDir ThisWorkbook.Path
Workbooks.Open (ThisWorkbook.Path & "\" & "mint.xls")
Set wkbNew = ActiveWorkbook
Range("A2:I5000").copy
wkbOld.Activate
Range("A2").PasteSpecial
Application.CutCopyMode = False
wkbNew.Close
End Sub
Verzichte wo immer es geht auf "select" und "activate". Der Makrorekorder kann nicht anders, du schon! Sehr gute Lektüre zu dem Thema Makrorekorder-Optimieren:
Achtung Makrorekorder oder Wer selektiert denn da?
www.online-excel.de/excel/singsel_vba.php?f=78
Grüße,
Klaus M.vdT.

Anzeige
Schade .... :-(
22.01.2015 16:19:23
Klaus
... viel Mühe mit den Antworten gegeben, und zwei Tage später immer noch keine Rückmeldung. So macht es keinen Spaß.
LG,
Klaus

AW: Schade .... :-(
23.01.2015 07:12:52
Marco
Hallo Klaus,
sorry dass es von mir noch keine Reaktion gab, aber da ich im Moment mehrere Projekte bearbeite, kann ich immer nur Stück für Stück an meiner Tabelle arbeiten und Deine sehr guten Tipps einarbeiten.
Ich habe mir die Mühe gemacht und jede Textbox und ComboBox einen klar definierten Namen geben.
Das ist sehr hilfreich, da meine Codes sehr lang geworden sind.
Ich bin zwar absulter Laie in VBA, aber mit deiner Hilfe und deinen super Ansätzen (auch der Link, was Makro überhaupt aufnimmt) habe ich meine Userform komplexer gestalten können. Und das beste ist: Es funktionier sogar... ;-)
Die Person, die damit arbeiten wird und mein Vorgestzter sind vollauf begeistert. Es wird die Arbeitsabläufe vereinfachen...
Klaus, vielen Dank nochmal für Deine Mühe.
Du hast mir sehr geholfen und mein Verständnis für VBA einen großen schrtitt voran gebracht.
Ich werde in kürze auf einen VBA Kurs (3 Tage) gehen, da mich das Thema und die Möglichkeiten, die damit machbar sind, gepackt haben...
VG
Marco
Userbild

Anzeige
Nix für ungut, danke für die RÜ! Pass aber auf ...
23.01.2015 08:14:28
Klaus
... dass dir in deinem VBA-Kurs kein Blödsinn beigebracht wird. Ich habe schon erlebt und gesehen, dass in Kursen Sachen wie
Sheets("Tabelle1").select
Range("B4").select
selection.value = "Hallo Welt"

in den Aufgaben standen und der Kursleiter es selbst nicht besser wusste. Viel Erfolg mit VBA und deinen Projekten!
Grüße,
Klaus M.vdT.

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige