varios todos renombrar por para otro nombres mover macro los importar extension directorio crear copiar carpetas buscar archivos archivo excel excel-vba

excel - todos - mover varios archivos en linux



Haga un ciclo a través de subcarpetas y archivos en un directorio raíz especificado por el usuario (3)

Esta pregunta ya tiene una respuesta aquí:

Mi script cíclico a través de archivos individuales funciona bien, pero ahora necesito que también busque en / para múltiples directorios. Estoy atascado....

El orden en que las cosas deben suceder:

  • Se le pide al usuario que elija el directorio raíz de lo que necesitan
  • Necesito el script para buscar cualquier carpeta en ese directorio raíz
  • Si el script encuentra uno, abre el primero (todas las carpetas, por lo que no hay filtro de búsqueda específico para las carpetas)
  • Una vez abierto, mi secuencia de comandos recorrerá todos los archivos de las carpetas y hará lo que debe hacer.
  • una vez finalizado, cierra el archivo, cierra el directorio y pasa al siguiente, etc.
  • Bucles hasta que se hayan abierto / escaneado todas las carpetas

Esto es lo que tengo, que no funciona y sé que está mal:

MsgBox "Please choose the folder." Application.DisplayAlerts = False With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = "//blah/test/" .AllowMultiSelect = False If .Show <> -1 Then MsgBox "No folder selected! Exiting script.": Exit Sub CSRootDir = .SelectedItems(1) End With folderPath = Dir(CSRootDir, "/*") Do While Len(folderPath) > 0 Debug.Print folderPath fileName = Dir(folderPath & "*.xls") If folderPath <> "False" Then Do While fileName <> "" Application.ScreenUpdating = False Set wbkCS = Workbooks.Open(folderPath & fileName) --file loop scripts here Loop ''back to the Do Loop ''back to the Do

Código final. Se desplaza por todos los subdirectorios y archivos en cada subdirectorio.

Dim FSO As Object, fld As Object, Fil As Object Dim fsoFile As Object Dim fsoFol As Object Dim fileName As String MsgBox "Please choose the folder." Application.DisplayAlerts = False With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = "//blah/test/" .AllowMultiSelect = False If .Show <> -1 Then MsgBox "No folder selected! Exiting script.": Exit Sub folderPath = .SelectedItems(1) End With If Right(folderPath, 1) <> "/" Then folderPath = folderPath + "/" Set FSO = CreateObject("Scripting.FileSystemObject") Set fld = FSO.getfolder(folderPath) If FSO.folderExists(fld) Then For Each fsoFol In FSO.getfolder(folderPath).subfolders For Each fsoFile In fsoFol.Files If Mid(fsoFile.Name, InStrRev(fsoFile.Name, ".") + 1) = "xls" Then fileName = fsoFile.Name Application.ScreenUpdating = False Set wbkCS = Workbooks.Open(fsoFile.Path) ''My file handling code End If Next Next End If


Es posible que le resulte más fácil usar FileSystemObject , algo así como esto

Esto arroja una carpeta / lista de archivos a la Immediate window

Option Explicit Sub Demo() Dim fso As Object ''FileSystemObject Dim fldStart As Object ''Folder Dim fld As Object ''Folder Dim fl As Object ''File Dim Mask As String Set fso = CreateObject("scripting.FileSystemObject") '' late binding ''Set fso = New FileSystemObject ''or use early binding (also replace Object types) Set fldStart = fso.GetFolder("C:/Your/Start/Folder") '' <-- use your FileDialog code here Mask = "*.xls" Debug.Print fldStart.Path & "/" ListFiles fldStart, Mask For Each fld In fldStart.SubFolders ListFiles fld, Mask ListFolders fld, Mask Next End Sub Sub ListFolders(fldStart As Object, Mask As String) Dim fld As Object ''Folder For Each fld In fldStart.SubFolders Debug.Print fld.Path & "/" ListFiles fld, Mask ListFolders fld, Mask Next End Sub Sub ListFiles(fld As Object, Mask As String) Dim fl As Object ''File For Each fl In fld.Files If fl.Name Like Mask Then Debug.Print fld.Path & "/" & fl.Name End If Next End Sub


Aquí hay una solución VBA, sin usar objetos externos.

Debido a las limitaciones de la función Dir() , necesita obtener todo el contenido de cada carpeta a la vez, no mientras rastrea con un algoritmo recursivo.

Function GetFilesIn(Folder As String) As Collection Dim F As String Set GetFilesIn = New Collection F = Dir(Folder & "/*") Do While F <> "" GetFilesIn.Add F F = Dir Loop End Function Function GetFoldersIn(Folder As String) As Collection Dim F As String Set GetFoldersIn = New Collection F = Dir(Folder & "/*", vbDirectory) Do While F <> "" If GetAttr(Folder & "/" & F) And vbDirectory Then GetFoldersIn.Add F F = Dir Loop End Function Sub Test() Dim C As Collection, F Debug.Print Debug.Print "Files in C:/" Set C = GetFilesIn("C:/") For Each F In C Debug.Print F Next F Debug.Print Debug.Print "Folders in C:/" Set C = GetFoldersIn("C:/") For Each F In C Debug.Print F Next F End Sub


Sub MoFileTrongCacFolder() Dim FSO As Object, fld As Object, Fil As Object Dim fsoFile As Object Dim fsoFol As Object Dim fileName As String Dim folderPath As String Dim wbkCS As Object MsgBox "Please choose the folder." Application.DisplayAlerts = False With Application.FileDialog(msoFileDialogFolderPicker) .InitialFileName = "//blah/test/" .AllowMultiSelect = False If .Show <> -1 Then MsgBox "No folder selected! Exiting script.": Exit Sub folderPath = .SelectedItems(1) End With If Right(folderPath, 1) <> "/" Then folderPath = folderPath + "/" Set FSO = CreateObject("Scripting.FileSystemObject") Set fld = FSO.getfolder(folderPath) If FSO.folderExists(fld) Then For Each fsoFol In FSO.getfolder(folderPath).subfolders For Each fsoFile In fsoFol.Files If Mid(fsoFile.Name, InStrRev(fsoFile.Name, ".") + 1) = "xls" Then fileName = fsoFile.Name Application.ScreenUpdating = False Set wbkCS = Workbooks.Open(fsoFile.Path) ''My file handling code End If Next Next End If End Sub