Flexiblere Listen

Zeilen anders hinzufügen

Wenig bekannt und unter Access kaum üblich ist eine weitere Technik, Zeilen an eine Listbox oder Combobox anzufügen: mit AddItem. Listing 2 zeigt die minimalen Änderungen gegenüber dem vorigen Code. Da bei den anderen Office-Programmen in diesem Fall neue Elemente zu einem internen Array hinzugefügt werden, gäbe es hier die Hoffnung, dass die Grenze für die Zeichenkette damit uninteressant wird.

Private Sub btnAddItem_Click()
'wie bei btnRowSource_Click
Do While aktDatei <> ""
With lstDateien
.AddItem aktDatei & ";" & _
FileDateTime(cmbPfad.Value & aktDatei) & ";" & _
FileLen(cmbPfad.Value & aktDatei) & ";"
End With
aktDatei = Dir()
Loop
'wie bei btnRowSource_Click
End Sub

Das hilft aber leider nicht. Access-Controls unterscheiden sich nämlich von denjenigen aus Word oder Excel. Auch AddItem führt zur gleichen Fehlermeldung, also wird intern nur die Datensatzherkunft-Zeichenkette befüllt

Callback-Funktion aufrufen

Genau für dieses Problem ist die Callback-Technik gedacht: Der VBA-Code legt seine Daten in beliebig großen Arrays ab, und die Combobox oder Listbox lädt per Funktion nur den sichtbaren Ausschnitt nach.'

Diese Technik heißt „Callback“, wobei das Control selber nur den Namen einer Funktion genannt bekommt. Diese kann es dann nach eigener Entscheidung mit wechselnden Parametern aufrufen. Sie benötigen keine Ereignisse zum aktiven Aufruf der Funktion, vielmehr muss die Funktion auf den Rückruf (Callback) der Liste warten.

Es ist nur schade, dass es in Access keinerlei Hinweis auf diese Technik gibt. In der Eigenschaft Herkunftstyp hätte beispielsweise in der Auswahl eine zusätzliche Zeile Callback-Funktion stehen können.

Mehr ist nämlich davon nicht zu sehen: In Herkunftstyp steht der Name einer beliebigen Funktion ohne Klammern oder Gleichheitszeichen. Daher ist der Aufruf wie in Listing 3 sehr kurz.

Private Sub btnCallback_Click()
DoCmd.Hourglass True
datStart = Now()
With lstDateien
.RowSourceType = "HoleDateien"
.RowSource = ""
End With
datEnde = Now()
EndeMeldung
End Sub

Wenn nicht wie hier zu Testzwecken die Eigenschaften der Listbox laufend geändert werden, können Sie den Namen selbstverständlich auch direkt im Entwurf in den Herkunftstyp schreiben.