Excel Dir返回意外的空值

我试图写我认为是一个简单的例程,将所有的Excel工作表都放在一个目录中,并将它们复制到主工作表中的选项卡上。 这就是我想要的:

Sub GetSheets() myPath = "C:\Users\Brian.Scott\Documents\2017_INVENTORY\TestInv" Filename = Dir(myPath) MsgBox (Filename) Do While Filename <> "" Workbooks.Open Filename:=myPath & Filename, ReadOnly:=True For Each Sheet In ActiveWorkbook.Sheets Sheet.Copy After:=ThisWorkbook.Sheets(1) Next Sheet Workbooks(Filename).Close Filename = Dir() Loop End Sub 

当没有任何事情发生时,我放入MsgBox。 它返回一个null。 myPath返回正确的名称 – 我从资源pipe理器复制和粘贴,以避免拼写错误。 我只有目录中的excel文件,所以我没有错误检查。 这是一个一次性的需求,但目录中有超过200个文件,所以我想我可以花一点时间在代码上。 任何想法将不胜感激,因为我非常青睐这个。

声明所有variables – 在每个模块的顶部指定Option Explicit ,然后声明您使用的每个variables,直到代码再次编译。 不这样做只是要求麻烦; VBA会愉快地编译和运行一个错字,而且debugging起来并不好玩。 使用Option Explicit。 总是。

 Option Explicit Public Sub GetSheets() Const myPath As String = "C:\Users\Brian.Scott\Documents\2017_INVENTORY\" Const myFilter As String = "TestInv*.xls?" Dim myFilename As String myFilename = Dir(myPath & myFilter) Do While myFilename <> vbNullString MsgBox myFilename With Workbooks.Open(Filename:=myPath & myFilename, ReadOnly:=True) Dim sh As Worksheet For Each sh In .Worksheets sh.Copy After:=ThisWorkbook.Sheets(1) Next .Close End With Filename = Dir Loop End Sub 

请注意, With块 – 它保留了Workbooks.Open函数返回的Workbook对象的引用,因此您可以执行.Worksheets.Close ,无需对ActiveWorkbook进行编码,也无需重新获取完全相同的内容每次迭代都从Workbooks集合中获取对象引用。

你的myPath包含一个path,是的,但也包括通配符,我怀疑这会按预期工作:

 Workbooks.Open "C:\Users\Brian.Scott\Documents\2017_INVENTORY\TestInv*.xls?\TestInv42.xlsx" 

这就是为什么我将myPathstring拆分为pathfilter :将filter提供Dir函数,并提供Workbooks.Open函数与Dir返回的文件名的path

这样的应该工作

  Sub GetSheets() myPath = "C:\Users\Brian.Scott\Documents\2017_INVENTORY\TestInv\" Filename = Dir(myPath, vbNormal) MsgBox (Filename) Do While Filename <> "" Workbooks.Open Filename:=myPath & Filename, ReadOnly:=True For Each Sheet In ActiveWorkbook.Sheets Sheet.Copy After:=ThisWorkbook.Sheets(1) Next Sheet Workbooks(Filename).Close Filename = Dir() Loop End Sub