我目前正在尝试使用一种解决方案,允许用户在其计算机上确定存储某些文件的文件夹(使用文件夹选择器工具)。
一旦设置了该文件夹,我想在那里找一个名为“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字符串,我似乎无法查找该字符串中的文件。我收到以下错误
对于每个可能只迭代集合对象或数组
我可以尝试另类策略吗?
答案 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
)。