Verzeichnis mit VBA kopieren

Guten Abend,

ich habe ein „Muster-Verzeichnis“, darin einige Unterverzeichnisse. Das möchte ich gerne komplett, also incl. Unterverzeichnisse, kopieren - auch innerhalb desselben Verzeichnisses, wobei ich das dann natürlich umbenennen muss.
Geht das?
„Filecopy“ funktioniert da wohl nicht.

Danke
Laika

Hi laika,
Wie wär’s hiermit:

Function Copy\_Folder(sSource As String, sTarget As String) As Boolean
 Dim FSO As Object
 If Right(sSource, 1) = "\" Then
 sSource = Left(sSource, Len(sSource) - 1)
 End If
 If Right(sTarget, 1) = "\" Then
 sTarget = Left(sTarget, Len(sTarget) - 1)
 End If
 Set FSO = CreateObject("scripting.filesystemobject")
 If FSO.FolderExists(sSource) = False Then
 Copy\_Folder=False
 End If
 FSO.CopyFolder Source:=sSource, Destination:=sTarget
 Copy\_Folder=True
End Function

Anwendungsbeispiel:

If Copy\_Folder("C:\Kopieren\Von\Hier","C:\Nach\Hier") Then
 MsgBox "Erfolgreich kopiert."
Else
 MsgBox "Fehler beim kopieren."
End If

P.S.: Modifizierte Version von http://www.rondebruin.nl/win/s3/win026.htm

Hallo Isendrak,

FSO.CopyFolder Source:=sSource, Destination:=sTarget

m.E. gibt es bei dieser Codezeile eine Fehlermeldung wenn sSource oder sTarget nicht existieren.

Gruß
Reinhard

Hallo laika,

ich habe ein „Muster-Verzeichnis“, darin einige
Unterverzeichnisse. Das möchte ich gerne komplett, also incl.
Unterverzeichnisse, kopieren -
auch innerhalb desselben Verzeichnisses,

innerhalb welchen Verzeichnisses?

wobei ich das dann natürlich umbenennen muss.

Wenn Muster_Verzeichnis das gemeinte Verzeichnis ist brauchste doch nicht umzubennen. Unterverzeichnis „Muster_Verzeichnis“ im Verzeichnis „Muster_Verzeichnis“ ist doch okay.

Beschreib bitte genauer was da von wo nach wo kopiert werden soll.

Geht das?

Ich gehe davon aus.

„Filecopy“ funktioniert da wohl nicht.

Möglich, ein eindeutiges Nein kann ich jetzt nicht sagen. Könnte ja sein es gibt rekursive Funktionen die Dateien einzeln per filecopy rüberschaufeln.

Gruß
Reinhard

Hi Reinhard,

FSO.CopyFolder Source:=sSource, Destination:=sTarget

m.E. gibt es bei dieser Codezeile eine Fehlermeldung wenn
sSource oder sTarget nicht existieren.

Zumindest, wenn „sSource“ nicht existiert. Aber genau deswegen findet sich unmittelbar davor dieser Code:

If FSO.FolderExists(sSource) = False Then
 Copy\_Folder=False
End If

Soll heissen: Wenn „sSource“ nicht existiert, gibt „Copy_Folder“ den Wert „False“ zurück, noch bevor der Versuch unternommen wird irgendetwas zu kopieren.

Was passiert, wenn „sTarget“ nicht existiert, da bin ich mir nicht ganz sicher. Sollte aber funktionieren, da beim rekursiven kopieren einer Ordnerstruktur alle nicht existierenden Zielpfade automatisch erstellt werden. (zumindest normalerweise…)

Hallo Isendrak,

FSO.CopyFolder Source:=sSource, Destination:=sTarget

m.E. gibt es bei dieser Codezeile eine Fehlermeldung wenn
sSource oder sTarget nicht existieren.

Zumindest, wenn „sSource“ nicht existiert. Aber genau deswegen
findet sich unmittelbar davor dieser Code:
If FSO.FolderExists(sSource) = False Then
Copy_Folder=False
End If

Soll heissen: Wenn „sSource“ nicht existiert, gibt
„Copy_Folder“ den Wert „False“ zurück, noch bevor der Versuch
unternommen wird irgendetwas zu kopieren.

jain, :„Copy_Folder“ bekommt den Wert False ABER der Code läuft weiter und trifft auf
FSO.CopyFolder Source:=sSource, Destination:=sTarget
dann "knallst wenn es „sSource“ nicht gibt.

M.E. müßte die IF-Abfrage so aussehen:

If FSO.FolderExists(sSource) = False Then
 Copy\_Folder=False
**Exit Function**
End If

Was passiert, wenn „sTarget“ nicht existiert, da bin ich mir
nicht ganz sicher. Sollte aber funktionieren, da beim
rekursiven kopieren einer Ordnerstruktur alle nicht
existierenden Zielpfade automatisch erstellt werden.
(zumindest normalerweise…)

Okay, ich glaube du hast Recht und ich stimme dir beim „sollte“ zu. GANZ sicher bin ich mir aber auch nicht.

Gruß
Reinhard

Hi Reinhard,

M.E. müßte die IF-Abfrage so aussehen:
If FSO.FolderExists(sSource) = False Then
Copy_Folder=False
Exit Function
End If

Ich bin (wohl fälschlicherweise…) davon ausgegangen, dass

Copy\_Folder=False

in Visual Basic ähnlich arbeitet wie

return false;

in C/C++/C#.
Mit Visual Basic an sich hab ich schon seit einiger Zeit nicht mehr gearbeitet, daher kenne ich nicht mehr alles so genau.

Moin Isendrak,

danke, klappt auf Anhieb! Allerdings muss ich mein „Muster-Verzeichnis“ noch einbetten in ein übergeordnetes Verzeichnis, da die

Function Copy\_Folder(sSource As String, sTarget As String) As Boolean

nur die Unterverzeichnisse von „sSource“ nach „sTarget“ kopiert.

So sieht es bei mir aus:

Muster-Verzeichnis
 |
 +--- Muster-Verzeichnis
 |
 +--- Originale
 |
 +--- Film
 |
 +--- Ton

In den Unterverzeichnissen können weitere Verzeichnisse sein. Das Ganze dient zum Anlegen neuer Film-/Videoprojekte mit Originalen (Bildern und Videoclips), Filmdateien, Audiodateien usw. Das zweite „Muster-Verzeichnis“ bekommt in „sTarget“ dann den Projektnamen.

Gruss
Laika

Auch Dir besten Dank. Guck bitte in meine Antwort an Isendrak, da steht alles drin.

Gruss
Laika

Hi, ich frage mal wieso aus VBA?
Ist dass ggf. Teil eine komplexeren Anwendun?
Für copyjobs nutze ich entweder die befehlszeile, oder robocopy.
Beides lässt sich wunderbar automatisieren z.B. zur Datensicherung.

Fragen? einfach mailen. Ich biete auch ggf. Unterstützung via Teamviewer an.

Gruß
Wolfgang

Moin,

Hi, ich frage mal wieso aus VBA?

  1. Weil ich VBA relativ gut kenne und
  2. weil neben dem Kopieren auch div. andere Dinge getan werden müssen.

Ist dass ggf. Teil eine komplexeren Anwendun?

Siehe meine Antwort an Isendrak.

Beides lässt sich wunderbar automatisieren z.B. zur
Datensicherung.

Dafür habe ich eine zweite Festplatte mit entsprechendem Sicherungs-Programm dazu.

Gruss
Laika