VBA: mehrere Ordner mit Excel-Liste erstellen

VBA - Visual Basic for Application

Wenn man viele zig oder gar hundert Ordner neu erstellen muss, ist es eine sehr zeitaufwendige und ätzende Arbeit jeden Ordner per Kontextmenü “Neu => Ordner” oder per Tastenkombination Strg+Umschalt+N anzulegen. Unter Windows gibt es einige Alternativen, wie die Verwendung des Dateimanager Total Commander oder die Verwendung der PowerShell.

Hat man jedoch die vielen Ordnernamen bereits digital in Form einer Liste vorliegen und ist mit VBA ein wenig vertraut, dann kann dies auch mit ein wenig VBA-Code erledigen.

Je nachdem in welcher Form die Ordnernamen vorliegen, kann man diese in eine Excelliste überführen, wie das nachfolgende Beispiel zeigt. Den VBA-Editor kann man im Menü über die “Entwicklertools” aufrufen. (Die Entwicklertools sind standardmäßig nicht eingeblendet. Um diese einzublenden wählt man “Datei => Optionen => Menüband anpassen => Checkbox bei Entwicklertools anklicken”) Alternativ kann man den VBA-Editor mit der Tastenkombination Alt+F11 aufrufen.

Screenshot von Excel und VBA-Editor
VBA-Methode zum Erstellen vieler Verzeichnisse

In dem VBA-Editor erstellt man dann die folgende Methode. Der Variable strPath weist man den Dateipfad zu unter welchem die Ordner erstellt werden sollen. Bei Worksheets schreibt man anstelle “Tabelle1” den Namen des Tabellenblatts hinein, in welchem sich die Ordnernamen befinden. Und im Klammerausdruck von Range gibt man den Bereich der Excelzellen an, in dem sich die Ordnernamen befinden. Mittels der For-Each-Schleife wird dann über diesen Zellenbereich iteriert und der Pfadname des neuen Ordners zusammengestellt. Die VBA-Methode MkDir erstellt dann die neuen Verzeichnisse.

Sub CreateNewFolders()
  Dim strPath As String
  Dim newFolderPath As String
  'hier Pfad festlegen, wo Ordner erstellt werden sollen
  strPath = "c:\Users\DeinAccount\Desktop\temp\Ordner_anlegen\OrdnerGemischt\"
  'Tabelle1 ersetzen durch Name des Tabellenblatts
  'A2:A31 ersetzen durch Bereich, wo Ordnernamen enthalten sind
  For Each c In Worksheets("Tabelle1").Range("A2:A31").Cells
    newFolderPath = strPath & c.Value
    MkDir (newFolderPath)
  Next
End Sub

Führt man diese Methode aus, indem man innerhalb des VBA-Editors die Taste F5 drückt oder das Wiedergabe-Symbol, dann werden die Ordner in wenigen Millisekunden erstellt. Das Ergebniss kann dann wie auf dem nachfolgenden Bild aussehen.

Screenshot Windows Explorer mit neu angelegten Verzeichnissen
Ergebniss mit VBA angelegte Ordner

Hier spart man sich also viel Zeit, genauso, wi beim umgekehrten Fall, Ordnernamen in eine Excelliste zu übernehmen, wenn man VBA und Makros benutzt.

Bestseller Nr. 1
Bestseller Nr. 2

6 Kommentare

  1. Hallo zusammen,

    ich habe ein Problem und zwar möchte ich aus einer Excel-Liste Ordner erstellen. Das hat mit eurem Code hier schon gut funktioniert. – Danke dafür!
    Jetzt wird meine Liste stetig erweitert und ich benötige entsprechend neue Ordner. Kann man im Code noch eine Schleife einfügen, die die bestehenden Ordner überspringt und am Ende nur für die neu hinzugekommenen Positionen Ordner erstellt?

    Vielen Dank und viele Grüße

    1. Hallo Marko,

      also ich würde für deinen beschriebenen Fall innerhalb der For-Schleife noch eine Überprüfung einbauen, ob das Verzeichnis existiert. Das sollte mit der folgenden prinzipiellen IF-Anweisung funktionieren. Ich habe diesen Code aber nicht getestet. Musst du noch auf deine Verhältnisse anpassen.

      newFolderPath = strPath & c.Value
      If Dir(newFolderPath, vbDirectory) = vbNullString Then
      MkDir (newFolderPath)
      End If

      Wenn das Verzeichnis also nicht existiert, wird es angelegt, ansonsten wird nix gemacht.

  2. Hallo,

    wie kann ich denn in die erstellen Ordner noch Unterordner kreieren?
    Die Unterordner sollen immer die selben Namen haben.
    Z.b.
    -CO2-Emissionen
    -Exportkontrolle – Dual Use
    -Handbuch
    Produktfotos

    Danke schon mal für eine Antwort.

    Gruß

    1. Hi Ricky,

      da es immer dieselben Unterordner sind, könntest du dir weitere String-Variable definieren und den Ordnernamen zuweisen.

      Dim subFolder1 As String
      Dim subFolder2 As String
      Dim subFolder3 As String
      subFolder1 = "CO2-Emissionen"
      subFolder2 = "Exportkontrolle – Dual Use"
      subFolder3 = "Handbuch"

      In der For each – Schleife kreiierst du dann nach dem ersten MkDir (newFolderPath) deinen neuen Pfad und machst weitere MkDir:

      subFolder1 = newFolderPath & "\" & subFolder1
      subFolder2 = newFolderPath & "\" & subFolder2
      subFolder3 = newFolderPath & "\" & subFolder3
      MkDir (subFolder1)
      MkDir (subFolder2)
      MkDir (subFolder3)

      Wenn du ganz sicher gehen willst, kannst du den letzten Code-Block noch in eine If-Bedingung verpacken und vorher überprüfen, ob der zuvor erzeugte Ordner (newFolderPath) auch existiert.

  3. Hallo,
    wenn ich richtig verstehe, klappt das ganze nur innerhalb des VBA Editors. Was ich suche ist folgendes:
    Ich habe eine Excel Zelle, deren Inhalt zunächst ausgeblendet wird. (“”) Wenn in der Zelle Daneben ein Datum eingegeben wird, zählt die Zelle gegenüber der darüber liegenden um eins hoch und erstellt einen Hyperlink auf einen Ordner (in dem werden die Daten zum Tabelleninhalt gesammelt). Den zugehörigen Ordner muss ich aktuell separat manuell (oder z.B. als Powershell Script) erstellen, sonst läuft der Link ins Leere.
    Jetzt würde ich gerne für genau die angezeigte Nummer einen Ordner erstellen, falls es den noch nicht gibt. Wie könnte ich das bewerkstelligen? Kann ich den o.g. Code auch von Excel aus in einer Formel aufrufen?
    Hier die bisherige Formel:

    =WENN(ISTFEHLER(HYPERLINK(VERKETTEN(“i:\INTERN\”;JAHR(C1039);”\”;VERKETTEN(“I”;(RECHTS(A1038;4)+1);””));WERT(RECHTS(A1039;4))))=WAHR;””;HYPERLINK(VERKETTEN(i:\INTERN\”;JAHR(C1039);”\”;VERKETTEN(“I”;(RECHTS(A1038;4)+1);””));WERT(RECHTS(A1039;4))))

    Hierbei ist A*die Zelle mit dem Link und dem Counter, (Zelle A1039 ist Inhalt der A1038 +1)
    Spalte C* die mit dem Datum. Wenn da was drin steht, beginnt er zu zählen.
    Der Ordner hier ist i:\intern\(Jahr)\I(Zähler)
    Vorteil wäre, dass es für jedes Jahr genau die Ordner und gültigen Links gibt, die in der Excel auftauchen und keine leeren Ordner im Voraus angelegt werden müssten.

    Für Eure Hilfe schon mal vielen Dank.

    1. Hallo, trotz ausführlicher Beschreibung, kann ich das Vorhaben nur annähernd nachvollziehen und hier gibt es sicherlich verschiedene Ansätze je nachdem, was man am Ende haben will. Deswegen bitte keine fertige Lösung erwarten. Was würde ich in diesem Fall machen?
      Ich würde vermutlich für die Zählerspalte eine einfache Formel verwenden, die nur +1 hochzählt anhand der vorhergehenden Zelle, wenn in der Datumsspalte ein Datum steht. Das lässt sich einfach bewerkstelligen mit =WENN(ZELLE(“Format”;B4)=”D1″;A3+1;””)
      Den Rest, also die Erstellung des Links und des Ordners würde ich in ein Makro packen, und mir ein Button in die Excel-Tabelle einfügen, mit dem ich das Makro aufrufe.
      Das Makro müsste dann ungefähr wie folgt ablaufen (kleiner Ablaufplan):

      1. – ermitteln welche Zeile/Zelle aktiviert ist, für die aktivierte Zeile wird dann das Makro ausgeführt.
      2. – Jahr ermitteln aus der Zelle mit der Datumsangabe
      3. – Zähler ermitteln aus der Zelle mit der laufenden Nummer
      4. – aus ermittelten Jahr und Zähler einen String zusammenbauen für den Ordnerpfad á la i:\intern\(Jahr)\I(Zähler)
      5. – Hyperlink anlegen mit der Hyperlinks.Add-Methode
      6. – Überprüfen, ob der Ordnerpfad bereits existiert FolderExists
      7. – wenn nicht Ordner neu anlegen, wie oben beschrieben, mit MkDir-Methode

      Somit wäre es nur noch ein Klick zur Bearbeitung der beschriebenen Routine. Ich hoffe, dass ich damit wenigstens einen Ansatz liefern konnte, wie man das Problem angehen kann.

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert