VBA Excel Dateien in Comboboxen auswählbar machen

Duke00

Lt. Commander
Registriert
Sep. 2010
Beiträge
1.914
Hallo Leute ich hab hier grad nen kleines Problem:

ich hab eine User Form mit 2 Comboboxen. Die erste soll mir alle Ordner die im Ordner xy liegen als auswahl anbieten:
Code:
Private Sub ComboBox1_DropButtonClick()
Dim dat, folder
Dim Dateipfad(), Dateiname() As String
Dim n
Dim a As Integer

Set dat = CreateObject("Scripting.FileSystemObject")
'---Kann später wieder raus-----
n = split(ThisWorkbook.path, "\")
ReDim Preserve n(UBound(n) - 2)
Pfad = Join(n, "\")
'--------------------------------
Set folder = dat.GetFolder(Pfad)  '"Path of Workfiles" Anpassen!
If Projekt <> "" Then
    Me.ComboBox1.Clear
End If
For Each file In folder.subfolders
    Me.ComboBox1.AddItem file.Name
    ReDim Preserve Dateipfad(a)
    ReDim Preserve Dateiname(a)
    Dateipfad(a) = file
    Dateiname(a) = file.Name
    a = a + 1
Next
'Me.ComboBox1.AddItem Dateiname
Projekt = Me.ComboBox1.Value
End Sub

Diese funktioniert auch einwandfrei.

Nun soll die 2. Combobox alle Ordner anzeigen die in dem Ordner liegen, welcher in Combobox 1 ausgewählt wurde. Dazu hab ich folgendes Versucht:

Code:
Private Sub ComboBox2_DropButtonClick()
Dim dat, DGN
Dim a As Integer
Dim Dateipfad(), Dateiname() As String

If Projekt = "" Then
    Me.ComboBox2.AddItem ("Projekt auswählen")
    If Style <> "" Then
        Me.ComboBox2.Clear
    End If
    Exit Sub
End If
Set dat = CreateObject("Scripting.FileSystemObject")
Set DGN = dat.GetFolder(Pfad & "\" & Projekt & "\Workfiles\Isometrics\Styles")  '"Path of Styles" Anpassen!
If Style <> "" Then
    Me.ComboBox2.Clear
End If
For Each file In DGN.Files
    If file.Name Like "*.dgn" Then
        Me.ComboBox2.AddItem file.Name
        'ReDim Preserve Dateipfad(a)
        'ReDim Preserve Dateiname(a)
        'Dateipfad(a) = file
        'Dateiname(a) = file.Name
        'a = a + 1
    End If
Next
Style = Me.ComboBox2.Value
End Sub

Das problem ist hierbei, das wenn Nichts in Combobox 1 angezeigt wird, er zwar bei ersten klicken auf den dropdown button das richtige anzeigt, jedoch beim 2. Mal drauf "projekt auswählen" angezeigt wird.
Irgendwie komm ich hier mit dem clear befehl nicht ganz weiter.
Ach ja die Variablen Style und Projekt sind in der Userform ganz oben drüber als public definiert

Hoffe mir kann hier jemand helfen.
Gruß Duke
 
Dein zweites Sub wird ja aktiviert wenn der Dropdown-Button gedrückt wird. Losgelöst von den in diesem Sub definierten Aktionen wird von VBA- bzw. Windows-Modulen auf die du keinen Zugriff hast die Darstellung der Dropdownlist ausgelöst.
Du kannst also erst beim zweiten Klick den beim ersten Klick generierten Eintrag im Dropdown sehen, weil erst dann die Dropdownlist neu gerendert wird.
Funktionieren müsste es, wenn dein Sub nicht bei einem Klick auf dne Dropdown-Button 2 auslöst, sondern bei Änderung von Dropdown Nr. 1
 
Neuer Versuch:
Wenn du den Knopf drückst werden zwei voneinander getrennte Aktionen ausgelöst.
1.: Windows rendert die aufpoppende Dropdownliste
2.: VBA führt dein Makro aus

Die Darstellung der bereits gerenderten Dropdownliste verändert sich nicht mehr, solange du nicht noch einmal den Knopf drückst.
Wenn also erst gerendert wird und dann erst die Listbox mit Werten beladen wird, kannst du dies logischerweise nicht sehen. Erst im zweiten durchlauf ist schon ein Wert in der Listbox vorhanden.

Das Ziel ist jetzt also, dass zuerst die Listbox mit Werten gefüllt wird und dann erst gerendert wird.
Dies löst du, indem du die zweite schon befüllst, wenn sich in der ersten Listbox die Auswahl verändert hat.

Technisch löst man dies, indem man das Sub
Private Sub ComboBox2_DropButtonClick()
in
Private Sub ComboBox1_Change()

umbenennt, es wird also nicht mehr aufgerufen wenn du den Dropdownbutton drückst, sondern wenn sich der Wert in Box 1 verändert.

Verstanden?
 
Ist es dann nicht einfacher die Dropdownliste für die Combobox 2 in der Combobox eins zu definieren und einfach in dem sub combobox2_clickdropdownbutton wieder aufzurufen ?

weil wenn ich das mit dem Sub combobox_Change() mache, will er die Dropdownliste schon ertellen bevor er Projekt = ME.Combobox1.Value gesetzt hat.
Ergänzung ()

Habs hinbekommen, falls es jemanden interessiert oder er ein ähnliches problem hat:
Code:
Private Sub UserForm_Activate()
Dim dat, folder
Dim Dateipfad(), Dateiname() As String
Dim n
Dim a As Integer
 
Set dat = CreateObject("Scripting.FileSystemObject")
'---Kann später wieder raus-----
n = split(ThisWorkbook.path, "\")
ReDim Preserve n(UBound(n) - 2)
Pfad = Join(n, "\")
'--------------------------------
Set folder = dat.GetFolder(Pfad)  '"Path of Workfiles" Anpassen!
'MsgBox "läuft"
If Me.ComboBox1.Text <> "" Then
    Me.ComboBox1.Clear
End If
For Each file In folder.subfolders
    Me.ComboBox1.AddItem file.Name
Next
End Sub
Private Sub ComboBox1_Change()
Dim dat, DGN, folder
Projekt = Me.ComboBox1.Value
On Error GoTo Error
If Projekt <> "" Then
    Set dat = CreateObject("Scripting.FileSystemObject")
    Set folder = dat.GetFolder(Pfad & "\" & Projekt & "\Workfiles\Isometrics\Styles")  '"Path of Styles" Anpassen!
    Me.ComboBox2.Clear
    For Each file In folder.subfolders
        Me.ComboBox2.AddItem file.Name
    Next
End If
Error:
'MsgBox Err.Number
If Err.Number = 76 Then
MsgBox ("Das Projekt scheint noch keine generierten Dateien zu enthalten")
Me.ComboBox2.Clear
End If
End Sub
 
Zurück
Oben