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"
这就是为什么我将myPath
string拆分为path和filter :将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