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 年工作的主要内容,如果未能解决你的问题,请参考以下文章