Excel VBA FSO.GetFolder(folderPath) 在 2007 年但不是 2010 年工作

Posted

技术标签:

【中文标题】Excel VBA FSO.GetFolder(folderPath) 在 2007 年但不是 2010 年工作【英文标题】:Excel VBA FSO.GetFolder(folderPath) working in 2007 but not 2010 【发布时间】:2013-08-05 16:34:36 【问题描述】:

所以我对 VBA 还是很陌生。

下面的代码在 2007 年可以正常工作,用于列出特定文件夹中的所有 PDF files。但是,当我在 excel 2010 中尝试时,此代码似乎不起作用(它在 Set fold = fso.GetFolder(folderPath) 上引发错误)

任何想法我做错了什么?

我确实检查了脚本运行时。我的代码如下:

Sub List_files()

Dim fso As FileSystemObject
Dim fold As Folder
Dim f As File
Dim folderPath As String
Dim i As Integer

folderPath = "S:\Academic Affairs\Academic Operations Reporting\CV's"
Set fso = New FileSystemObject
Set fold = fso.GetFolder(folderPath)

i = 2
For Each f In fold.Files
    If LCase(Right(f.Name, 3)) = "pdf" Then
        Range("A" & i).Value = f.Name
        i = i + 1
    End If
Next

End Sub

【问题讨论】:

错误说明了什么? 你添加了正确的引用吗? 我在我的机器上运行了你的代码,XL 2010 运行良好。 【参考方案1】:

我认为您需要在 folderPath 变量上添加一个“\”...这样它就是

folderPath = "S:\Academic Affairs\Academic Operations Reporting\CV's\"

如果这不能解决问题,请发布您遇到的错误。

【讨论】:

我添加了 \ 并没有修复它。运行时错误 76,找不到文件路径。我已经检查了十几次这个名字。大约有十几个用户在 excel 2007 中使用这个程序,他们没有收到错误,但我在 2010 年收到了 对不起,我想通了。我不知道为什么,但似乎我的 S:\ 驱动器的名称是“学术事务”,而在 2010 年它不允许我这样表达:“S:\学术事务\学术运营报告\CV's”但现在当我这样表达时有效:“”S:\Academic Operations Reporting\CV's.但是,2007 与原来的方法配合得很好。 如果文件/文件夹名称中有空格,通常需要用一组额外的引号对它们进行转义。请参阅***.com/questions/4835691/… 我更喜欢使用下划线 _ 而不是空格,因为它更健壮 路径的原始拼写适用于 2016 年。另请注意,撇号在 VBA 中被解释为 cmets【参考方案2】:

这是我用来列出文件的过程:

Function GetFileList(pDirPath As String) As Variant
On Error GoTo GetFileList_err

    ' Local constants / variables
    Const cProcName = "GetFileList"
    Dim objFSO As Object
    Dim objFolder As Object
    Dim objFile As Object
    Dim c As Double           ' upper bound for file name array
    Dim i As Double           ' iterator for file name array
    Dim vFileList() As String ' array for file names

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFolder = objFSO.GetFolder(pDirPath)
    c = objFolder.Files.Count
    i = 0

    ReDim vFileList(1 To c)  ' set bounds on file array now we know count

    'Loop through the Files collection
    For Each objFile In objFolder.Files
        'Debug.Print objFile.Name
        i = i + 1
        vFileList(i) = objFile.Name
    Next

    'Clean up!
    Set objFolder = Nothing
    Set objFile = Nothing
    Set objFSO = Nothing

    GetFileList = vFileList

GetFileList_exit:
    Exit Function

GetFileList_err:
    Debug.Print "Error in ", cProcName, " Err no: ", Err.Number, vbCrLf, "Err Description: ", Err.Description
    Resume Next

End Function

Sub PrintFileList(pDirPath As String, _
                  Optional pPrintToSheet = False, _
                  Optional pStartCellAddr = "$A$1", _
                  Optional pCheckCondition = False, _
                  Optional pFileNameContains)
On Error GoTo PrintFileList_err

    ' Local constants / variables
    Const cProcName = "PrintFileList"
    Dim vFileList() As String ' array for file names
    Dim i As Integer          ' iterator for file name array
    Dim j As Integer          ' match counter
    Dim c As String

    vFileList = GetFileList(pDirPath)
    c = pStartCellAddr
    j = 0

    For i = LBound(vFileList) To UBound(vFileList)
        If pPrintToSheet Then
            If pCheckCondition Then
                ' if pFileNameContains not in filename go to next iteration of loop
                If InStr(1, vFileList(i), pFileNameContains, vbTextCompare) = 0 Then
                    GoTo EndLoop
                End If
            End If
            Range(c).Offset(j, 0).Value = vFileList(i)
            j = j + 1
        End If
        'Debug.Print vFileList(i)
        i = i + 1
EndLoop:
    Next

PrintFileList_exit:
    Exit Sub

PrintFileList_err:
    Debug.Print "Error in ", cProcName, vbCrLf, "Err no: ", Err.Number, _
                vbCrLf, "Err Description: ", Err.Description
    Resume Next

End Sub

该函数仅供内部使用,您调用该过程。这是一个示例调用(在这种情况下,使用 userprofile windows 环境变量作为路径而不是硬编码路径):

call PrintFileList(environ("userprofile"), True, "$A$1", True, ".pdf")

【讨论】:

【参考方案3】:

每当事情没有按照“应该”的方式运行时,从一个可行的最小方法开始并从那里构建是非常有成效的。 试试这个在 Excel 2016 中有效的方法:

Option Explicit

Sub File_renaming2()
    Dim objFSO As FileSystemObject
    Dim mySource As Folder
    Dim myFolder As File

    Set objFSO = New FileSystemObject
    Set mySource = objFSO.GetFolder("S:\Academic Affairs\Academic Operations Reporting\CV's\")
    For Each myFolder In mySource.Files
        Debug.Print myFolder.Name
    Next myFolder
End Sub

【讨论】:

【参考方案4】:

使用这个:

Set fso = New Scripting.FileSystemObject

【讨论】:

【参考方案5】:

不知道怎么解释: 但是我们需要对对象类型进行完整的引用

CHANGE                            
    "Dim mySource As Folder "         
TO
    "Dim mySource As Scripting.Folder"    'OR "Dim mySource As object"     

为什么? 在我的情况下,工作代码停止工作 => 我添加了“microsoft Outlook 对象库” => 它有一个“文件夹”类型 => 所以后来没有什么对我有用

【讨论】:

以上是关于Excel VBA FSO.GetFolder(folderPath) 在 2007 年但不是 2010 年工作的主要内容,如果未能解决你的问题,请参考以下文章

VBA批量导入图片到多Word文档并加标题(会飞的鱼)

js如何遍历本地目录的文件 不用FSO

VBA如何模拟CTRL+F 查找效果

excel range vba

使用 Excel DNA 将用 F# 编写的用户定义函数导入 VBA 子例程

怎么用vba给excel 加密