Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Excel 2013 VBA für Profis

Kombinationsfeld erzeugen

Testen Sie unsere 2021 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Die ComboBox stellt eine Mischung aus Eingabefeld und Listenauswahl dar. In diesem Beispiel werden – abhängig vom Wert in der neuen ComboBox – unterschiedliche Listen für das Listenfeld erzeugt.

Transkript

Jetzt gibt es zwar hier schon eine Liste, die die Tabellennamen anzeigt, aber ich möchte eine Auswahl ermöglichen, sodass ich entweder die markierten Zellinhalte hier anzeigen kann, oder wenn ich die Auswahl ändere, dann die Namen der Tabellen. Dazu braucht es eine Möglichkeit, hier was auswählen zu können. Da gibt es technisch diverse Ideen. Zum Beispiel könnte man eine CheckBox machen, die sagt, "ja, mit Tabellenamen", und andernfalls werden eben die Zellinhalte angezeigt. Oder Optionen, bei denen dann eine Option heißt "Zellinhalte" und die andere Option "Tabellennamen". Da Sie früher oder später damit rechnen können, dass es nicht nur zwei Auswahlmöglichkeiten gibt, sondern vielleicht noch mehr, würde ich direkt empfehlen, hier eine ComboBox einzubauen. Das ist sozusagen die bessere Optionsliste. Dazu braucht es ein bisschen Platz, denn sinnvollerweise ist das natürlich oberhalb angebracht. Ein Klick auf die ComboBox, oder das Kombinationsfeld, je nachdem ob Sie es deutsch oder englisch benennen wollen. Und das muss natürlich einen besseren Namen kriegen als ComboBox1. Ich werde es also cmb für "ComboBox" und dann Auswahl benennen. Auch die ComboBox hat so einen komischen SelectionMargin, den ich schonmal direkt wegschalten. Also mit Doppelklick auf False. Und dann kann ich direkt mit Doppelklick hier in deren Ereignis wechseln, aber ich will nicht das Change-Ereignis haben, das könnte nämlich auch sein, dass man Text nicht in der ComboBox schreibt, sondern ich will das Click-Ereignis haben. Und damit kann diese Prozedurleiche weg. Und hier wird jetzt was passieren. Da wird noch nicht sofort was passieren. Dies ist erstmal nur ein Kommentarzeichen, damit ich weiß, da kommt noch was hin. Erstmal muss hier was passieren, im UserForm_Initialize sorge ich zum Beispiel dafür, dass nicht automatisch immer die Anzeige der Tabellennamen aufgerufen wird. Die wird exportiert sozusagen. sub ErmittleTabellenNamen wird all das übernehmen, was hier zu diesem Teil gehört, also die Deklaration der Variablen und diese For-Each-Schleife. Und der Einfachheit halber werde ich genau diese Prozedur, Strg+Leertaste damit er die namentlich wieder findet, hier wieder aufrufen. Es ist also inhaltlich nichts passiert. Das, was vorher hier drinstand ist jetzt ausgelagert und wird aufgerufen. Vorübergehend. Das können wir schonmal speichern. Und wenn Sie sichergehen wollen, dass da keine Syntaxfehler sind, kann man auch hier schonmal Debuggen Kompilieren So weit alles in Ordnung, weil es keine Rückmeldung gibt. Und jetzt kommt das, dass ich in der neuen Liste, in der ComboBox überhaupt erstmal eine Auswahl reinschreibe. Denn, Sie können das gern mal so starten mit F5, die ist zwar da, aber sie ist leer. Sie kann nur zur Laufzeit gefüllt werden, wie so eine Listbox ja auch. Also muss ich im Initialize dafür sorgen, dass da was reingeschrieben wird. Und zwar von me. ComboBox, nämlich cmbAuswahl gibt es ein AddItem. Und das erste Item wird heißen "Zellen-Inhalte". Und das zweite, muss ich fast dasselbe nochmal schreiben: cmbItemAuswahl.AddItem "Tabelle-Namen". Und damit auch einer ausgewählt wird, muss ich direkt hinterher sagen: me.cmbAuswahl.listindex=1, und zwar deswegen weil der hat Index 0, der den Index 1 hat und wir ja im Moment die Tabellennamen sehen. Das dürfte jetzt funktionieren. Gucken wir mal mit F5. Es steht hier "Tabellen-Namen" und es wird dort unten die Liste der Tabellen-Namen angezeigt. So weit, so gut. Nur, wenn ich jetzt hier oben was ändere, tut sich da unten nichts. Und das soll ja passieren. Also muss ich nach dem Abbrechen, in dessen Cick-Ereignis hier wirklich was reinschreiben. Und da kann ich jetzt relativ übersichtlichst, können ja mehrere werden, eine select case Anweisung nehmen. Und der case, der Fall den ich untersuche, ist nämlich der Index in dieser Liste. Das ist im Moment noch ein bisschen vereinfacht. Ich prüfe einfach, ob Me.cmbAuswahl.ListIndex den Case 0 oder den Case 1 oder sicherheitshalber den Case Else hat, und dann kommt das End Select. Case Else, kann ich direkt schon dahinter schreiben: MsgBox "Das darf nicht passieren!". Wenn diese Meldung kommt, habe ich ein Programmierproblem, da muss ich nochmal drüber nachdenken. Dann habe ich wahrscheinlich eine dritte Zeile, eine dritte Auswahl aufgenommen. Das ist so eine Sicherheitsmaßnahme. Es dürfen eigentlich nur diese zwei Fälle auftreten. In Case 0 würde ich jetzt gern aufrufen: "ErmittleZellenInhalte". Das gibt es noch nicht. Das macht aber nichts. Da mache ich jetzt einen leeren Prozedurrumpf: ErmittleZellenInhalte, der ist komplett. Ist zwar leer, aber formal ist er in Ordnung. Also Case 0:, ist ja nichts anderes als zwei Programmierzeilen in eine schreiben zu dürfen. ErmittleZellenInhalte. Und Case 1 ist ErmittleTabellenNamen. Dieses ist jetzt überflüssig. Ich kann das also wegnehmen. Und diese Auswahl sollte da oben hinein. Das heißt, wenn da oben irgendein Inhalt ermittelt wurde, dann wird automatisch der erste dieser Einträge ausgewählt. Das ist jetzt einigermaßen aufgeräumt, außer dass ich hier lieber eine With-Struktur benutze, sodass ich das sozusagen ausklammern kann. Das liest sich ein bisschen einfacher. Das heißt, Sie müssen nicht in jeder Zeile neu Me.cmbAuswahl schreiben. Das wird durch das With jetzt davor gesetzt. Und dann machen wir nochmal einen Kompiliercheck. Debuggen Kompilieren, Und gucken mit F5 mal, was passiert. Das ist noch nicht perfekt, kann ich Ihnen gleich sagen, aber es passiert schonmal was. Zum Beispiel wenn ich jetzt wechsle auf Zellen-Inhalte, wird aufgerufen die Analyse der Zellinhalte. Die tut es zwar noch nicht, aber wie Sie sehen, es wird leider auch nichts gelöscht. Und wenn ich jetzt wiederum die Tabellen-Namen aufrufe, noch viel ärgerlicher, wird auch das aufgerufen und vorher wieder nicht gelöscht. Also wir müssen erstens löschen und zweitens die Zellen auch noch anzeigen. Das Löschen können wir automatisch machen. Nämlich sobald hier was sich ändert, wird vorher die Liste, Me.lstDetails.Clear, gibt es eine eigene Methode, gelöscht, und erst dann wird geschrieben. Und wenn ich jetzt hier bei den Zellinhalten auch wirklich was anzeigen will, dann muss ich jetzt ein Range-Objekt erfinden. Das heißt einfach rngDieseZelle As Range, und gehe dann, for each rngDieseZelle in selection, das ist ja das, was der Benutzer ausgewählt hat, cells, next. Und dann kann ich jetzt wieder, me.listDetails.AddItem, rausschreiben, was in der Zelle drinsteht, rngDieseZelle.Value. Wenn ich Pech habe, steht da nichts drin. Deswegen kommt jetzt so eine Notmaßnahme. Da wird ein Leerstring verkettet., sodass in einem Fall, dass dort ein NULL, ein gar nichts drinsteht, wenigstens eine Zeichenkette zurückkommt. Jetzt muss ich nur natürlich dafür sorgen, mit Alt+F11 können Sie rüberwechseln, dass in ein paar Zellen auch was drinsteht. Ich schreibe mal hier ganz banal "1". Na, machen wir eine ungerade Liste. Beide markieren, bisschen ziehen. Und jetzt, wo es markiert ist, kann ich testen mit F5. Tabellen-Namen, alles in Ordnung. Zellen-Inhalte, 1, 3, 5, 7, 9, 15. Jetzt kann ich aber auch wieder zurückwechseln zu den Tabellen-Namen. Und es wird nur die Selection berücksichtigt, wenn ich also jetzt in der Tabelle selber, sagen wir diesen Bereich markiere, und das mit F5 starte, dann werden Sie auch nur diesen Bereich inhaltlich wiederfinden. Also wir haben mehrere Teile jetzt gemacht. Eine zweite ComboBox für eine Auswahl eingebaut, die als Erstes die Liste der Details löscht. Und dann, je nachdem was hier ausgewählt ist, entweder Zellen-Inhalte oder Tabellen-Bezeichnungen, oder was auch immer Sie wollen, anbietet, sodass der Benutzer jeweils das auf dem Bildschirm einstellen kann, was er möchte und Sie als Programmierer, das ist durchaus wichtig, auch möglichst wenig Arbeit, nämlich möglichst übersichtlichen Code haben, der entweder Teile auslagert oder ansonsten in möglichst kurzen Formulierungen dafür sorgt, dass Sie nicht den Überblick verlieren.

Excel 2013 VBA für Profis

Nutzen Sie die Möglichkeiten der Programmiersprache VBA in Excel 2013, um eigene Dialoge zu erstellen, auf andere Arbeitsmappen zuzugreifen und wichtige Funktionen einzusetzen.

4 Std. 59 min (53 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!