Flexiblere Listen

Comboboxen und Listboxen können beliebig viele Datensätze anzeigen, wenn sie aus Tabellen oder Abfragen kommen, nicht jedoch, wenn sie aus anderen Datenquellen stammen. Sie hatten damit noch nie Probleme? Glück gehabt, denn diese Listen sind je nach Datenquelle begrenzt. Aber wie Sie sehen werden, können Sie dem Glück mit Callback-Funktionen auf die Sprünge helfen.

Das klassische Problem der Datenmenge stellt sich schon bei der Anzeige von Dateinamen eines Verzeichnisses. Da die Inhalte nicht erst mühsam in eine Tabelle geschrieben werden sollen, werden alle Angaben mit Semikolon getrennt in die Datensatzherkunft geschrieben.

Listing 1 zeigt die grundsätzliche Technik für das in Bild 1 dargestellte Testformular.

Option Compare Database
Option Explicit
Dim datStart As Date
Dim datEnde As Date
Const Pfad1 = "c:\Windows\System\"
Const Pfad2 = "c:\Windows\System32\"
Private Sub Form_Load()
cmbPfad.RowSource = Pfad1 & ";" & Pfad2
cmbPfad.Value = Pfad1
End Sub
Private Sub btnRowSource_Click()
Dim aktDatei As String
On Error GoTo Mist
DoCmd.Hourglass True
datStart = Now()
With lstDateien
.RowSourceType = "Value list"
.RowSource = ""
aktDatei = Dir(cmbPfad.Value & "*.*")
Do While aktDatei <> ""
With lstDateien
.RowSource = .RowSource & aktDatei & ";" & _
FileDateTime(cmbPfad.Value & aktDatei) & ";" & _
FileLen(cmbPfad.Value & aktDatei) & ";"
End With
aktDatei = Dir()
Loop
End With
Mist:
datEnde = Now()
EndeMeldung
If Err.Number <> 0 Then
MsgBox "Abgebrochen, denn: " & Err.Description, vbCritical
End If
End Sub
Private Sub EndeMeldung()
lblDauer.Caption = "Dauer: " & _
Format(datEnde - datStart, "hh:mm:ss")
lblDateien.Caption = lstDateien.ListCount & _
" Dateien in " & Me.cmbPfad.Value
lblLang.Caption = Len(lstDateien.RowSource) & " Zeichen"
DoCmd.Hourglass False
End Sub
Static datStartTag As Date
Dim datNaechsteWoche As Date
Select Case Code
Case acLBInitialize
datStartTag = Date + 7 - _
Weekday(Date, vbMonday) - 1 + _
Me.cmbWerktage.Value
FolgeWerktage = True
Case acLBOpen
FolgeWerktage = Timer
Case acLBGetRowCount
FolgeWerktage = 10
Case acLBGetColumnCount
FolgeWerktage = 1
Case acLBGetColumnWidth
FolgeWerktage = -1
Case acLBGetValue
datNaechsteWoche = datStartTag + Zeile * 7
FolgeWerktage = Format(datNaechsteWoche, _
"DDDD"", der ""DD. MMMM YYYY")
End Select
End Function

Bild 1: Formular zur Anzeige von Dateien.
Bild 1: Formular zur Anzeige von Dateien.

Beim Laden des Formulars wird eine Combobox cmbPfad mit dem Herkunftstyp Wertliste ganz einfach mit zwei typischen Systemverzeichnissen vorbelegt.