2013-08-05 64 views
1

所以我对VBA很新。Excel VBA FSO.GetFolder(folderPath)在2007年工作,但不是2010年

下面的代码在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 
+2

错误说的是什么? – Jaycal

+1

您是否添加了适当的参考? –

+1

我用XL 2010在我的机器上运行了您的代码,运行良好。 –

回答

2

我认为你需要在FOLDERPATH变量“\” ......所以,这是

FOLDERPATH =“S:\教务处\学术运营报表\简历\ “

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

+0

我添加了\并没有解决它。运行时错误76,未找到文件路径。我已经检查了十几次这个名字。大约有十几位用户在Excel 2007中使用这个程序,他们没有收到错误信息,但我在2010年做过 – user2653858

+0

对不起,伙计们,我明白了。我不知道为什么,但似乎我的S:\ drive的名字是“Academic Affairs”,并且在2010年它不会让我这样表达:“S:\ Academic Affairs \ Academic Operations Reporting \ CV's”但现在可以用这种方式表达:“S:\ Academic Operations Reporting \ CV's。然而,2007年原来的方法工作得很好。 – user2653858

+0

如果文件/文件夹名称中有空格,通常需要使用额外的引号将它们转义。请参阅http://stackoverflow.com/questions/4835691/escape-double-quote-in-vb-string 我更喜欢使用下划线_而不是空格,因为它更健壮 – user1515373

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") 
0

当事情不工作,因为他们“应该”这是非常有成效的开始与最小的方法,从那里工作和建立。 试试这适用于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 
相关问题