Im Netz findet man die abenteuerlichsten Anleitungen, wie man Daten aus einem Recordset in eine Combobox eines benutzerdefinierten Formulares übernehmen kann. Da wird beispielsweise gesagt, man müsse die Daten erst in ein eigenes Worksheet kopieren um sie dann mit einem Zellbezug in die Combobox zu übernehmen.
Dabei ist die Lösung in VBA eigentlich recht simpel.
Function Fill_Combobox(ByRef cbo As ComboBox, ByVal rs As ADODB.Recordset, ByVal colWidth As String) Dim aryColumnWidth() As String Dim i As Integer aryColumnWidth = Split(colWidth, ";") cbo.Clear cbo.ColumnCount = UBound(aryColumnWidth) + 1 cbo.ColumnHeads = False cbo.ColumnWidths = colWidth Do Until rs.EOF With cbo .AddItem For i = 0 To UBound(aryColumnWidth) .List(.ListCount - 1, i) = rs.Fields(i) Next End With rs.MoveNext Loop End Function
Diese Prozedur erhält als Parameter sowohl einen Verweis auf die zu befüllende Combobox als auch auf das Recordset mit den Daten. Zusätzlich werden in einer durch Semikolons getrennten Liste noch die Spaltenbreiten mit übergeben.
Diese Liste wird auch verwendet, um festzustellen, wieviele Spalten ausgegeben werden sollen. Hierzu wird sie mit der Split()-Funktion in ein Array umgewandet und die Anzahl der Array-Einträge ergibt dann die Anzahl der anzuzeigenden Spalten.
Mit der Do-Loop-Schleife wird dann das Recordset durchgegangen und pro Datensatz wird mit cbo.AddItem ein neuer Eintrag in der Combobox-Liste angelegt. Über die For-Next-Schleife werden dann die Werte aus dem Recordset in die Liste übertragen.
Eine typische Verwendung der Prozedur könnte so aussehen:
Fill_Combobox cboIhreCombobox, rsIhrRecordset, "0;50"
womit die Daten aus dem Recordset rsIhrRecordset in die das Control cboIhreCombobox eingetragen wird. Die erste Spalte wird dabei ausgeblendet (Breite = 0) während die Breite der zweiten Spalte auf den Wert 50 gesetzt wird.