Получить список файлов Excel в папке с помощью VBA
мне нужно получить имена всех файлов Excel в папке, а затем вносить изменения в каждый файл. Я разобрался с частью "внести изменения". Есть ли способ получить список .xlsx
файлы в одной папке, скажем D:Personal
и сохраните его в строковом массиве.
затем мне нужно перебрать список файлов и запустить макрос на каждом из файлов, которые я решил, что могу сделать с помощью:
Filepath = "D:Personal"
For Each i in FileArray
Workbooks.Open(Filepath+i)
Next
на этой, однако, я не смог открыть файлы вызывают сохранение имен в .
короче говоря, как я могу использовать VBA для получения списка имен файлов Excel в определенной папке?
4 ответов
Ок хорошо это может работать для вас, функция, которая принимает путь и возвращает массив имен файлов в папке. Вы можете использовать оператор if для получения только файлов excel при циклическом прохождении через массив.
Function listfiles(ByVal sPath As String)
Dim vaArray As Variant
Dim i As Integer
Dim oFile As Object
Dim oFSO As Object
Dim oFolder As Object
Dim oFiles As Object
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sPath)
Set oFiles = oFolder.Files
ReDim vaArray(1 To oFiles.Count)
i = 1
For Each oFile In oFiles
vaArray(i) = oFile.Name
i = i + 1
Next
listfiles = vaArray
End Function
было бы неплохо, если бы мы могли просто получить доступ к файлам в объекте files по номеру индекса, но это, похоже, сломано в VBA по какой-либо причине (ошибка?).
вы можете использовать встроенную функцию Dir или FileSystemObject.
Функция Dir:VBA: функция Dir
FileSystemObject:VBA: FileSystemObject-коллекция файлов
для простого списка файлов команда dir довольно проста в использовании. Он также поддерживает подстановочные знаки, что полезно, если вы не хотите каждый файл. Фокус в том, чтобы использовать его, чтобы понять, как его называть с параметром отличается, что вызов без одного.
Public Sub ListFilesDir(ByVal sPath As String, Optional ByVal sFilter As String)
Dim sFile As String
If Right(sPath, 1) <> "\" Then
sPath = sPath & "\"
End If
If sFilter = "" Then
sFilter = "*.*"
End If
'call with path "initializes" the dir function and returns the first file
sFile = Dir(sPath & sFilter)
'call it again until there are no more files
Do Until sFile = ""
Debug.Print sFile
'subsequent calls without param return next file
sFile = Dir
Loop
End Sub
Если вы хотите intellisense и больше возможностей, помимо получения имени файла, я бы предложил FileSystemObject. Вы можете добавить ссылку на " Windows Script Host Object Model "(или" Windows Scripting Runtime") и объявить свои объекты следующим образом:
Public Sub ListFilesFSO(ByVal sPath As String)
Dim oFSO As FileSystemObject
Dim oFolder As Folder
Dim oFile As File
Set oFSO = New FileSystemObject
Set oFolder = oFSO.GetFolder(sPath)
For Each oFile In oFolder.Files
Debug.Print oFile.Name
Next 'oFile
Set oFile = Nothing
Set oFolder = Nothing
Set oFSO = Nothing
End Sub
Если вы не хотите intellisense, вы можете сделать это, не устанавливая ссылку:
Public Sub ListFilesFSO(ByVal sPath As String)
Dim oFSO As Object
Dim oFolder As Object
Dim oFile As Object
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = oFSO.GetFolder(sPath)
For Each oFile In oFolder.Files
Debug.Print oFile.Name
Next 'oFile
Set oFile = Nothing
Set oFolder = Nothing
Set oFSO = Nothing
End Sub
Dim iIndex as Integer
Dim ws As Excel.Worksheet
Dim wb As Workbook
Dim strPath As String
Dim strFile As String
strPath = "D:\Personal\"
strFile = Dir(strPath & "*.xlsx")
Do While strFile <> ""
Set wb = Workbooks.Open(Filename:=strPath & strFile)
For iIndex = 1 To wb.Worksheets.count
Set ws = wb.Worksheets(iIndex)
'Do something here.
Next iIndex
strFile = Dir
Loop
Если все, что вы хотите-это имя файла без расширения файла
Dim fileNamesCol As New Collection
Dim MyFile As Variant 'Strings and primitive data types aren't allowed with collection
filePath = "c:\file directory" + "\"
MyFile = Dir$(filePath & "*.xlsx")
Do While MyFile <> ""
fileNamesCol.Add (Replace(MyFile, ".xlsx", ""))
MyFile = Dir$
Loop
для вывода на рабочий лист excel
Dim myWs As Worksheet: Set myWs = Sheets("SheetNameToDisplayTo")
Dim ic As Integer: ic = 1
For Each MyFile In fileNamesCol
myWs.Range("A" & ic).Value = fileNamesCol(ic)
ic = ic + 1
Next MyFile
в основном на основе метода, подробно описанного здесь:https://wordmvp.com/FAQs/MacrosVBA/ReadFilesIntoArray.htm