Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA获取文件夹中Excel文件的列表_Vba_Excel_Excel 2010 - Fatal编程技术网

使用VBA获取文件夹中Excel文件的列表

使用VBA获取文件夹中Excel文件的列表,vba,excel,excel-2010,Vba,Excel,Excel 2010,我需要获得文件夹中所有Excel文件的名称,然后对每个文件进行更改。我已经把“做出改变”的部分整理好了。是否有办法在一个文件夹中获取.xlsx文件列表,比如D:\Personal,并将其存储在字符串数组中 然后,我需要遍历文件列表,并在每个文件上运行宏,我想我可以使用: Filepath = "D:\Personal\" For Each i in FileArray Workbooks.Open(Filepath+i) Next 我看了一下,但是,我无法打开文件,因为它以Varian

我需要获得文件夹中所有Excel文件的名称,然后对每个文件进行更改。我已经把“做出改变”的部分整理好了。是否有办法在一个文件夹中获取
.xlsx
文件列表,比如
D:\Personal
,并将其存储在字符串数组中

然后,我需要遍历文件列表,并在每个文件上运行宏,我想我可以使用:

Filepath = "D:\Personal\"
For Each i in FileArray
    Workbooks.Open(Filepath+i)
Next
我看了一下,但是,我无法打开文件,因为它以
Variant
格式存储了名称

简而言之,如何使用VBA获取特定文件夹中Excel文件名的列表?

Dim iIndex as Integer
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 'This moves the value of strFile to the next file.
Loop
将ws设置为Excel.Worksheet 将wb设置为工作簿 将strPath设置为字符串 作为字符串的Dim strFile strPath=“D:\Personal\” strFile=Dir(strPath&“*.xlsx”) 当strFile“”时执行 设置wb=Workbooks.Open(文件名:=strPath&strFile) 对于iIndex=1到wb.Worksheets.count 设置ws=wb.工作表(iIndex) “在这里做点什么。 下一个指数 strFile=Dir'这会将strFile的值移动到下一个文件。 环
您可以使用内置的Dir函数或FileSystemObject

  • Dir函数:

  • 文件系统对象:

他们各有长处和短处

Dir函数

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 name
    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 name
        sFile = Dir

    Loop

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

好的,这可能对你有用,一个函数,它获取路径并返回文件夹中的文件名数组。在数组中循环时,可以使用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

    If oFiles.Count = 0 Then Exit Function

    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对象中的文件,那就太好了,但是无论出于什么原因(bug?)VBA中似乎出现了问题。

如果您只需要没有文件扩展名的文件名

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

主要基于此处详述的技术:

关于向上投票的答案,我喜欢它,除了如果在数组公式{CSE}中使用生成的“listfiles”数组,则列表值将全部显示在水平行中。为了使它们以垂直列的形式出现,我简单地将数组设置为二维,如下所示:

ReDim vaArray(1 To oFiles.Count, 0)
i = 1
For Each oFile In oFiles
    vaArray(i, 0) = oFile.Name
    i = i + 1
Next
子测试()
作为对象的Dim FSO
设置FSO=CreateObject(“Scripting.FileSystemObject”)
设置folder1=FSO.GetFolder(FromPath).Files
FolderPath_1=“D:\Arun\Macro Files\UK Marco\Au的外部销售工具\Example Files\”
工作手册。添加
设置Movenamelist=ActiveWorkbook
对于文件夹1中的每个文件
移动名称列表。激活
范围(“A100000”)。结束(xlUp)。偏移量(1,0)。值=fil
ActiveCell.Offset(1,0)。选择
下一个
端接头


在VBA中连接字符串不是吗?与
Filepath&i
甚至
Filepath&CStr(i)
@pi yes一样,这需要更改为
Filepath&i
@MatthewD谢谢,但我想生成文件夹中的文件列表。我的标题有点误导人。很抱歉。我现在改了。看来
&
可能是首选。。。您需要在其他地方列出的文件吗?或者你只是想在文件中做一些事情而不列出它们?只是想在文件中做一些事情,这与你的问题相反。你想要文件名,而不仅仅是对文件做一些事情。@Raystafarian是的,但是如果我得到文件名,我可以用工作簿打开它们。open()因此,我只需要获取字符串数组中的名称列表。我仍在获取各种格式的名称,并且获取所有文件,而不仅仅是Excel文件。编写一个if语句来测试文件名。。。如果LCase(Right(sPath,5))=“.xlsx”,则或您可能希望查看File.Type属性。将变量声明为正确的类型,并且它们不会是变量。对于Dir版本,为+1。需要考虑的一件事是DIR在调用时读取下一个文件。如果您在当前选定的文件上执行任何任务,它可能会对文件重新排序,因此即使您希望打开另一个文件,也不会打开它。为了避免这种情况,将文件列表读入字符串数组,然后使用该列表执行所有操作。值得知道的是,Dir方法比FSO方法快得多。在修改这两种方法以写入字符串数组(因为Debug.Print本身非常慢)之后,我发现对于包含大约3000个文件的文件夹,Dir方法在0.009秒内执行,FSO方法在13秒内执行,系数为1400!这管用!唯一的问题是它是一个变量数组,我需要它们作为字符串,但类型转换不能正常工作。在那之后,我需要打开它们中的每一个。它是一个包含在变量中的字符串,在可能使用字符串的地方使用它应该不会有问题。你确定不是其他原因导致了你的错误吗?你能发布违规代码吗?另外,我不使用数组作为以后打开的文件名列表,我使用的是文件集合,这可能也适用于您。我发现了我的问题。我对oFiles工作簿中的每个I使用
迭代文件。Open(oFiles(I))
只需将其更改为I。我的错!谢谢你的帮助!我可以阅读并认为我理解了上面的代码在大部分情况下所做的工作,如何修改上面的代码,以便它也可以从子文件夹中获取文件名?
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
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
ReDim vaArray(1 To oFiles.Count, 0)
i = 1
For Each oFile In oFiles
    vaArray(i, 0) = oFile.Name
    i = i + 1
Next