Does anyone know how to copy subfolders from one place to another in VB?. I have a Template folder on a network share I want to use to set up the base folder structure on newly created job folders, however, I can't seem to get any copy methods to take just the subfolders and not the parent.

The base (from) template folder is structrued as;

and so on..

I have:

Public Sub CopyFilesFolder2Folder(Foldername As String)

    Dim fso
    sfol = "\\server\main_jobs\_Templates\" ' source folder path
    dfol = Foldername ' destination folder path

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set Folder = fso.GetFolder(sfol)

    fso.GetFolder(Folder).Copy dfol
    Set fso = Nothing

This copy's the folder just fine, but, carrys the parent (_Templates) too, so the resulting desitnation is \\newserver\newjob\_Templates\folder1, 2, 3, ect. wher I want it to be \\newserver\newjob\folder1, 2, 3, ect.

Any ideas?, I'm stumped on this.

7 Years
Discussion Span
Last Post by Tommymac501

No, this fix throws out a "Folder not found" error. In hovering, it appears as though the source folder in "fso.GetFolder(Folder).Copy dfol" is missing the trailing slash, making it a file, not a folder - causing the error. Still trying to figure it out, but thanks..


If I understood right, the problem is that the destination folder does not exists?
Then you should use fso.CreateFolder before copying.

Anyway, instead of using fso.GetFolder(Folder).Copy .. I would prefer the fso.CopyFolder( fromFolder , toFolder, Overwrite)

Hope this helps


The folder exists, I create it using "CreateNewFolder", the problem is that it's nested in a certain path structure (Client\Year\JobNumber_name\). The Template folder is what needs to go into the nested Job folder (actually, just the folders inside it). We need to create a consistent folder structure that's common for every job so there is no question as to where anything is for turnover or coverage. "Data" is always in the '"Client\Year\JobNumber_name\Input\Data" folder, Reports are always in the "Client\Year\JobNumber_name\Output\Reports" folder. This is the idea.

As the Project manager creats a new job entry, Access will automatically create that folder structure by using the Index to the Client list to determine the root client folder name, ect.


To copy the files and folders inside _templates from \\Server\mainjobs\_templates to the new destination directory you need to iterate through the \\Server\mainjobs\_templates subfolders.


Set SourceRootFolder = fso.GetFolder(sfol)

you can loop by subfolder as (untested)

For Each Folder In SourceRootFolder.SubFolders
    fso.GetFolder(Folder).Copy dfol & "\" & Folder.Name

Also if you need to copy the files from the root folder then (also untested)

For Each ExistingFile In SourceRootFolder.Files
    fso.GetFile(ExistingFile).Copy dfol & "\" & ExistingFile.Name

Hope this helps


Still erroring out;

dim SourceRootFolder As FileSystemObject

    sfol = "\\SERVER\Maijobs\_Templates\" 
    dfol = Foldername
    Set SourceRootFolder = fso.GetFolder(sfol)
    For Each Folder In SourceRootFolder.subFolders
        fso.GetFolder(Folder).Copy dfol & "\" & Folder.Name

Throws a ".subFolders Method or Data Member not found" error.

I feel sooooooo close!.. ugh!


No, "SubFolders" doesn't appear on the list of available methods. Perhaps I should be dimesioning SourceRootFolder as something other than a FileSystemObject?


The default dim is as object, like in the example on the page I recommended to read:

Function ShowFolderList(folderspec)
   Dim fso, f, f1, s, sf
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.GetFolder(folderspec)
   Set sf = f.SubFolders
   For Each f1 in sf
      s = s & f1.name 
      s = s & "<BR>"
   ShowFolderList = s
End Function

Hope this helps

Edited by lolafuertes: n/a


Actually, I'm getting a '454 Object Required' error on "Set SourceRootFolder = fso.GetFolder(sfol)", thats why I dimme'd 'SourceRootFolder' as a FileSystemObject.


Got it figured out. I id reference the page you mentioned, and actually ran the code. When VBA was erroring out, it indicated the variable "SourceRootFolder" was the issue, however, I needed to create fso first. after adding "Set fso = CreateObject("Scripting.FileSystemObject")", it worked like a charm!


This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.