Code:
Private Sub UserForm_Initialize()
[COLOR="#008000"] Dim objFSO As Object
Dim objFolder As Object
Dim objSubFolder As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("K:\")
For Each objSubFolder In objFolder.subfolders
Debug.Print objSubFolder.Name
Next objSubFolder[/COLOR]
Set Db = OpenDatabase(Name:=objSubFolder.Path + "\Datei.mdb")
End Sub
Disclaimer: ich kann eigtl. gar kein VBA.
kurze Antwort: Der Fehler scheint zu bemängeln dass eine Variable unter Umständen nicht gesetzt ist
lange Antwort:
Ich sehe keinen Fehler den ein Compiler direkt anmängeln sollte, aber trotzdem erklär ich mal was mit dem Code an sich falsch ist....
Dein For Each macht im Prinzip nichts:
For Each iteriert über eine Liste/ein Array o.ä. und tut etwas in jedem Schleifendurchlauf. In diesem Fall macht er nichts anderes ausser den Namen des Verzeichnisses auszugeben.
Im Endeffekt dient dein For Each also quasi nur dazu, die Variable "objSubFolder" zu befüllen.
Ich erklärs nochmal weil ich vermute dass du nicht weißt was der Code macht:
Code:
For Each objSubFolder In objFolder.subfolders
Hier ist objFolder ein Objekt das Informationen über ein Verzeichnis enthält (beispielsweise den Pfad, die enthaltenen Dateien etc.). objFolder.subfolders ist eine Liste aller Unterverzeichnisse. Über Listen kann man auf verschiedene Weisen iterieren, eine davon ist eben das For Each. Bei einer For Each Schleife wird für jeden Schleifendurchlauf ein Element der Liste in eine Variable gespeichert:
Code:
For Each <ELEMENT> In <LISTE>
Stell dir eine Liste mit den Zahlen 1 bis 10 vor... Dann wäre in der Variable <ELEMENT> beim ersten Schleifendurchlauf eine 1 gespeichert, beim zweiten eine 2 etc.
Genauso bei dir mit den Verzeichnisnamen.
Da die Variable objSubFolder vorher deklariert wurde (bin mir nicht sicher ob das in VB pflicht ist oder nicht, in den meisten anderen Programmiersprachen ist es das nicht und könnte u.U. zu Fehlern führen), iteriert er über die Liste, speichert jeweils das subfolder Objekt in objSubFolder und gibt den Namen auf der Debugkonsole aus. D.h. wenn du OpenDatabase aufrufst ist in objSubFolder immer der "letzte" Verzeichnisname gespeichert. Wäre ja kein Problem eigentlich, schließlich hast du gesagt es kann nur ein Verzeichnis geben...
Was aber wenn es KEIN verzeichnis gibt? Dann fliegt dir der Code nämlich um die Ohren (dein For Each läuft nie an, über eine leere Liste muss ich nicht iterieren, die Variable objSubFolder wird nie gefüllt).
Zumal es natürlich auch overkill ist... stell dir vor es hat 1000 Unterverzeichnisse und du willst immer das letzte (oder das erste, oder ein bestimmtes... ist egal). Würdest du tatsächlich JEDES Verzeichnis angucken? Die gesamte Liste? Oder würdest du dir das Verzeichnis raussuchen das du willst?
ein "Set objSubFolder = objFolder.subfolders(0)" würde z.B. auch machen was du willst (auch hier mit der Gefahr dass dir alles um die Ohren fliegt wenn es keine Unterverzeichnisse gibt).
Richtigerweise müsstest du also etwas in dieser Art programmieren (Pseudocode):
Code:
Wenn Verzeichnisliste.Anzahl ungleich 0
Datenbank öffnen mit erstem Element der Verzeichnisliste