我正在尝试编写我认为将目录中的所有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返回正确的名称 - 我从资源管理器复制并粘贴以避免拼写错误。我只在目录中有excel文件,所以我不是错误检查。这是一次性需求,但目录中有200多个文件,所以我想我可以在代码上花一点时间。 任何想法都会受到高度赞赏,因为我对此非常满意。
答案 0 :(得分:1)
声明所有变量 - 在每个模块的顶部指定Option Explicit
,然后声明您使用的每个变量,直到代码再次编译。不这样做只是要求麻烦; VBA很乐意编译并运行一个拼写错误,调试根本不是很有趣。使用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
阻止 - 它持有对Workbook
函数返回的Workbooks.Open
对象的引用,因此您可以执行.Worksheets
和{{ 1}}反对它,无需对.Close
进行编码,也无需在每次迭代时从ActiveWorkbook
集合重新获取完全相同的对象引用。
你的Workbooks
包含一条路径,是的,还有通配符,我怀疑这会按预期工作:
myPath
这就是我将Workbooks.Open "C:\Users\Brian.Scott\Documents\2017_INVENTORY\TestInv*.xls?\TestInv42.xlsx"
字符串拆分为路径和过滤器的原因:您提供过滤器到myPath
函数,并使用路径为Dir
函数提供Workbooks.Open
返回的文件名。
答案 1 :(得分:0)
这样应该可行
#{myBean.myList[indexRuntime].myProperty}