Получить список файлов 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 довольно проста в использовании. Он также поддерживает подстановочные знаки, что полезно, если вы не хотите каждый файл. Фокус в том, чтобы использовать его, чтобы понять, как его называть с параметром отличается, что вызов без одного.

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