使用VBA文件夹选取器和For Each语句

时间:2018-06-01 15:13:24

标签: vba excel-vba foreach excel

我目前正在尝试使用一种解决方案,允许用户在其计算机上确定存储某些文件的文件夹(使用文件夹选择器工具)。

一旦设置了该文件夹,我想在那里找一个名为“File 1”的文件。请注意,我没有完整的文件名,它会改变人与人之间的关系。例如,全名可以是“123456 File1 abcde.xlsx”

目前的尝试如下(这会产生错误)

Sub SelectFolder()

    Dim wb As Workbook
    Dim sFolder As String
    ' Open the select folder prompt
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = -1 Then    ' if OK is pressed

        End If
    End With

    If sFolder <> "" Then    ' if a file was chosen
        For Each wb In sFolder
            If wb.Name Like ("Extract 1 Dividends") Then
                wb.Open
            End If
        Next wb

    End Sub

这会产生错误,因为一旦用户选择并设置了sFolder字符串,我似乎无法查找该字符串中的文件。我收到以下错误

  

对于每个可能只迭代集合对象或数组

我可以尝试另类策略吗?

1 个答案:

答案 0 :(得分:2)

错误很明确 - 您要求VBA循环String的每个工作簿。唯一可以&#34; loopable&#34;在字符串中是它的字符。因此,VBA不知道String实际上是PC中包含工作簿的文件夹。

这是循环访问给定文件夹中的Excel文件的方法:

Option Explicit

Sub SelectFolder()

    Dim wb As Workbook
    Dim fileInFolder As String        

    fileInFolder = Dir("C:\Users\user\Desktop\Neuer Ordner\")

    Do While Len(fileInFolder) > 0
        If Right(fileInFolder, 4) = "xlsx" Then
            Debug.Print fileInFolder
        End If
        fileInFolder = Dir
    Loop

End Sub

它使用的事实是,您的Excel文件可能带有扩展名xlsx,因此它会检查文件名的最后4个字母。

至于你试图打开工作簿并对它们做些什么,这是一个很好的指导:

Option Explicit

Sub SelectFolder()

    Dim wb As Workbook
    Dim fileInFolder As String
    Dim initialDir As String

    initialDir = "C:\Users\user\Desktop\Neuer Ordner\"
    fileInFolder = Dir(initialDir)

    Do While Len(fileInFolder) > 0
        If Right(fileInFolder, 4) = "xlsx" Then
            Set wb = Workbooks.Open(initialDir & fileInFolder)
            Debug.Print wb.Name
            Debug.Print wb.Path
        End If
        fileInFolder = Dir
    Loop

    For Each wb In Workbooks
        If wb.Name <> ThisWorkbook.Name Then
            Debug.Print wb.Name & " is closed!"
            wb.Close savechanges:=True
        End If
    Next wb

End Sub

在代码的最后,它循环遍历所有工作簿,在同一实例中打开并关闭其中的每一个,除了代码所在的工作簿(If wb.Name <> ThisWorkbook.Name Then)。