Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

Ordnerstruktur erstellen mit VBA
#1
Hallo 

ich habe eine dynamische Liste erstellt in der alle Arbeitstage des Jahres enthalten sind. (abzüglich Feiertage). 
A1 = das Jahr

Ich möchte nun eine Ordnerstruktur per Knopfdruck anlegen, die mir dynamisch das Jahr "2024" als 1. Ebene anlegt. Auf der 2. Ebene dann die Monate "Jänner" - "Dezember" und auf der 3. Ebene die jeweiligen Arbeitstage. 
im Format "20240102"

Habt ihr Tipps - bin ganz neu beim Thema VBA. 

Habe wie folgt angefangen: 

Zitat:Sub OrdnerErstellen()
    Dim Hauptordner As String
    Dim ws As Worksheet
    Dim Zellwert As Range

    ' Setze den Hauptordnerpfad hier ein
    Hauptordner = "C:\Users\npamit\Desktop"

    ' Setze die Arbeitsblattreferenz hier ein
    Set ws = ThisWorkbook.Sheets("Tabelle1")

    ' Gehe durch jede Zelle in der Spalte E (Annahme: Die Liste ist in Spalte E, startend ab Zeile 3)
    For Each Zellwert In ws.Range("E3:E" & ws.Cells(ws.Rows.Count, "E").End(xlUp).Row)
        ' Überprüfe, ob der Zellwert nicht leer ist
        If Zellwert <> "" Then
            ' Erstelle den Ordner
            MkDir Hauptordner & Zellwert.Value
        End If
    Next Zellwert

    MsgBox "Ordner wurden erstellt!", vbInformation
End Sub
Antworten Top
#2
Hi,

Du willst allen Ernstes für jeden Arbeitstag einen eigenen Ordner erstellen? Da freuen sich die Anwender sicher auf ein fröhliches durchklicken im Explorer wenn sie was suchen... :D
Das ergibt ja nur Sinn, wenn Du pro Tag mehrere Dateien dort ablegen willst. Ich vermute aber mal, dass dort immer nur eine "Tagesdatei" gleichen Typs landet. Somit brauchst Du nur eine Schleife von 1 bis 12 für die Monate und speicherst die Dateien mit dem Tagesdatum und/oder Erstellernamen im Dateinamen. Genau genommen kannst Du Dir dann sogar die Monatsordner sparen.... 
Aber selbstverständlich darf man sich auch totorganisieren... :D
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#3
Hallo,

mal abgesehen von Ralf's berechtigtem Einwand hier eine Idee, wie Du Dein Vorhaben auch ganz leicht bewerkstelligen könntest.

Der alte, sicher auch immer noch oft genutzte, DOS-Befehl MKDIR erstellt einen neuen Ordner, basierend auf dem gerade aktiven Ordner, also als Unter- oder Unterunterordner.
Es gibt einen Fehler, wenn es ihn schon gibt. Diese Fehler muss man abfangen. Ganze Ordnerstrukturaufbauten müssen aufbauend stattfinden.

Deshalb empfehle ich Dir eine API-Version.

Diese erstellt eine ganze Ordnerstruktur, d.h. Du kannst gleich einen kompletten Pfad erstellen. Es werden diverse Fehlermeldungen herausgegeben, also etwa "Ordner schon vorhanden" usw.
Die Fehler muss man aber nicht abfragen, denn wenn es den Ordner schon gibt, passiert einfach nichts.

Hier ein Vorschlag (ungetestet). Probiere es einfach mal aus...

Code:

Private Declare PtrSafe Function SHCreateDirectoryExW Lib "Shell32.dll" ( _
        ByVal hwnd As LongPtr, ByVal pszPath As LongPtr, ByVal psa As LongPtr) As Long

Sub OrdnerErstellen()
  Dim sHauptordner As String
  Dim oRng As Range
  
  sHauptordner = "C:\Users\npamit\Desktop"

  With ThisWorkbook.Sheets("Tabelle1")
      For Each oRng In .Range("E3:E" & .Cells(.Rows.Count, "E").End(xlUp).Row)
         If oRng.Value <> "" Then
            SHCreateDirectoryExW 0, StrPtr(sHauptordner & "\" & oRng.Value & "\"), 0
'           SHCreateDirectoryExW 0, StrPtr(oRng.Value & "\"), 0     ' oder Angabe kompletter Ordner
         End If
      Next oRng
  End With
 
  MsgBox "Ordner wurden erstellt!", vbInformation, "Ordner erstellen"

End Sub

_________
viele Grüße
Karl-Heinz
Antworten Top
#4
Moin!
Ich habe es so verstanden:
Code:
Option Explicit
Declare Function MakePath& Lib "imagehlp.dll" Alias _
       "MakeSureDirectoryPathExists" (ByVal sPath$)
Sub Ordnerstruktur()
Dim Zelle As Range
For Each Zelle In Range(Range("E2"), Range("E2").End(xlDown))
  MakePath "I:\Temp\" & Format(Zelle, "yyyy\\mm\\dd") & "\"
Next
End Sub
Da ich aus der Threaderöffnung nicht ganz schlau geworden bin:
Statt
Format(Zelle, "yyyy\\mm\\dd")
wäre ja auch folgendes denkbar:
Format(Zelle, "yyyy\\mm\\yyyymmdd")

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#5
Hallo Ralf,

ergänzend:

MakeSureDirectoryPathExists  tut natürlich hier was erforderlich ist. Man liest aber hier und da in Beiträgen und Foren, dass die Funktion veraltet sei und durch 
SHCreateDirectoryExW ersetzt werden sollte. Die Funktion SHCreateDirectoryExW  ist bzgl. des Handlings wesentlich flexibler.


Gruß KH
Antworten Top
#6
Code:
Sub M_snb()
  With CreateObject("shell.application").Namespace("G:\")
    For j = 1 To DatePart("y", DateSerial(2025, 1, 0))
      .NewFolder Format(DateSerial(2024, 1, j), "yyyy\\mm\\dd")
    Next
  End With
End Sub
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#7
(05.12.2023, 08:04)volti schrieb: MakeSureDirectoryPathExists  ... SHCreateDirectoryExW 
Beide Funktionen können allerdings nicht (letztere: nicht zuverlässig) mit langen Pfaden über dem üblichen Limit Max_Path (260 Zeichen inkl, NULL) umgehen. 

Aus diesem Grund bin ich auf die Funktionen aus der Kernel32.dll umgestiegen. Da gibt es aber unglücklicherweise keine Funktion, die komfortabel komplette Pfade inklusive nicht existierender Zwischenebenen erstellt, da ist also "Handarbeit" angesagt.

Auf alle Fälle empfiehlt es sich aber, die Rückgabewerte auszuwerten, um den Erfolg der Funktion zuverlässig zu ermitteln.
Antworten Top
#8
@snb:
Die Liste von bigcuno umfasst nicht 366 Daten wie bei Dir, sondern 253 (wenn er in NRW, Deutschland wohnt).
Zitat:dynamische Liste erstellt in der alle Arbeitstage des Jahres enthalten sind. (abzüglich Feiertage)

Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. 
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Antworten Top
#9
Habe nie etwas von einem Feier gemerkt hier jenseits der Grenze der NRW
Die Leute haben 113 Feiertage pro Jahr ??
Die nehmen das Leben nicht ernst.

Scheint mir kein Hexentour die Feiertage in VBA auszuschließen.
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#10
(05.12.2023, 14:18)snb schrieb: Die Leute haben 113 Feiertage pro Jahr ??

...da würden sich die NRW'ner sicher drüber freuen, aber das eine oder andere Wochenende ist in den 113 freien Tagen pro Jahr bestimmt mit enthalten...  19
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste