Excel VBA使用Workbook.Open结果Dir(目录)

这似乎很简单,我已经多次工作,但是我的Dir调用(遍历一个目录)和打开当前文件之间的东西不断。 以下是相关的代码:

SourceLoc = "C:\ExcelWIP\TestSource\" SourceCurrentFile = Dir(SourceLoc) 'Start looping through directory While (SourceCurrentFile <> "") Application.Workbooks.Open (SourceCurrentFile) 

我得到的是一个文件访问错误,因为Application.Workbooks.Open试图打开“C:\ ExcelWIP \ TestSource \\ FILENAME”(注意额外的斜线)

但是,当我从SourceLoc中取出最后一个斜杠时,Dir(SourceLoc)的结果是“”(它不search目录)。

令人沮丧的是,由于我以其他方式编辑了子代,所以这个代码的function已经消失了。 我已经按原样工作了,而且我已经从目录path中取出了“/”,使其成为可行的工作,而现在,我无法一起工作。

我search了在线帮助和ms文章,但似乎没有指出为什么这会继续上升和下降(没有被编辑,除了什么时候停止工作),为什么目录path的格式有时会与最终的工作'/',有时没有。

有任何想法吗?

这将打开该目录中的所有.xlxs文件。

  Sub OpenFiles() Dim SourceCurrentFile As String Dim FileExtension as String: FileExtension = "*.xlxs" SourceLoc = "C:\ExcelWIP\TestSource\" SourceCurrentFile = Dir(SourceLoc) SourceCurrentFile = Dir() 'Start looping through directory Do While (SourceCurrentFile <> "") Application.Workbooks.Open (SourceLoc &"\"& SourceCurrentFile) SourceCurrentFile = Dir(FileExtension) Loop End Sub 

JLILI Aman击中了将Dir()的结果作为string的答案。 使用它与Application.Open上的path结合使用,可以从代码中获得稳定的行为。

新代码:

 Dim SourceLoc as String Dim SourceCurrentFile as String SourceLoc = "C:\ExcelWIP\TestSource\" SourceCurrentFile = Dir(SourceLoc) 'Start looping through directory While (SourceCurrentFile <> "") Application.Workbooks.Open (SourceLoc & "/" & SourceCurrentFile) 

我没有包含推荐的文件扩展名,因为我在一个目录中处理了xls,xlsx和xlsm文件。 这个代码打开所有的。

警告 – 此代码将设置当前文件到目录中的每个文件,包括非Excel文件。 在我的情况下,我只处理Excel文件,所以这不是一个问题。

至于为什么发生这种情况,它不会显示Application.Open将接受Dir()的完整对象结果,所以Dir()的返回需要是一个string。 我没有深入探讨为什么超越这个。

考虑使用包含文件夹和文件属性的VBA的FileSystemObject :

 Sub xlFilesOpen() Dim strPath As String Dim objFSO As Object, objFolder As Object, xlFile As Object strPath = "C:\ExcelWIP\TestSource" Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFolder = objFSO.GetFolder(strPath) For Each xlFile In objFolder.Files If Right(xlFile, 4) = "xlsx" Or Right(xlFile, 3) = "xls" Then Application.Workbooks.Open (xlFile) End If Next xlFile Set objFSO = Nothing Set objFolder = Nothing End Sub