Vba Excel目录返回意外的空值
我正在尝试编写一个简单的例程,将所有Excel工作表放在一个目录中,并将它们复制到主工作表的选项卡中。以下是我正在尝试的:Vba Excel目录返回意外的空值,vba,excel,Vba,Excel,我正在尝试编写一个简单的例程,将所有Excel工作表放在一个目录中,并将它们复制到主工作表的选项卡中。以下是我正在尝试的: Sub GetSheets() myPath = "C:\Users\Brian.Scott\Documents\2017_INVENTORY\TestInv" Filename = Dir(myPath) MsgBox (Filename) Do While Filename <> "" Workbook
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
Sub-GetSheets()
myPath=“C:\Users\Brian.Scott\Documents\2017\u INVENTORY\TestInv”
Filename=Dir(myPath)
MsgBox(文件名)
文件名“”时执行此操作
工作簿。打开文件名:=myPath&Filename,只读:=True
对于ActiveWorkbook.Sheets中的每个工作表
Sheet.Copy After:=此工作簿.Sheets(1)
下一页
工作簿(文件名)。关闭
Filename=Dir()
环
端接头
当什么都没发生的时候,我把它放进了MsgBox。它返回空值。myPath返回正确的名称-我从资源管理器复制并粘贴了该名称以避免拼写错误。我的目录中只有excel文件,所以我不会检查错误。这是一个一次性的需求,但是目录中有200多个文件,所以我想我可以在代码上花点时间。
如果有任何想法,我将不胜感激,因为我对此非常熟悉。声明所有变量-在每个模块的顶部指定
Option Explicit
,然后声明您使用的每个变量,直到代码再次编译。不这样做只会自找麻烦;VBA很乐意编译和运行一个打字错误,调试一点也不有趣。使用选项显式。总是
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
这就是为什么我将
myPath
字符串拆分为一个路径和一个过滤器:您将过滤器提供给Dir
函数,并提供工作簿。打开函数时,使用返回的Dir
文件名的路径。类似的东西应该可以工作
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
Sub-GetSheets()
myPath=“C:\Users\Brian.Scott\Documents\2017\u INVENTORY\TestInv\”
Filename=Dir(myPath,vbNormal)
MsgBox(文件名)
文件名“”时执行此操作
工作簿。打开文件名:=myPath&Filename,只读:=True
对于ActiveWorkbook.Sheets中的每个工作表
Sheet.Copy After:=此工作簿.Sheets(1)
下一页
工作簿(文件名)。关闭
Filename=Dir()
环
端接头
您忘记文件通配符了吗?-<代码>“C:\Users\Brian.Scott\Documents\2017\u INVENTORY\TestInv\*.XLS*”
在myPath和文件名之间还需要一个反斜杠。对于记录,Null
不是vbNullString
或”
Null
是一个非常特殊的值,在针对Excel对象模型编写的VBA代码中,您不太可能需要它,甚至不会遇到它。请发布答案,不要在注释中回答;-)文件是xlsx,这是第二个的原因*我可能需要一些小的修改(我想我的解释是不够的),它就像一个魅力!我需要重命名选项卡-我可以使用特定的单元格作为名称。我应该在进门的路上,还是在我把它们写进母版纸之后再做呢?你可以用你想用的任何方式来做——只要你永远不会得到两张同名的纸,一切都会顺利的。我会尝试在循环体中进行。我想sh.Copy
会激活创建的工作表,所以你应该去ActiveSheet.Name=whateverYouMakeItBe
出于某种原因,我没有得到目录中的所有工作表-只有4/6检查你的过滤器,比较缺少的文件名,相应地调整。如果它们看起来相同,请注意前导/尾随空格。我是否将过滤器设置为*.xls?我想这会抓住一切。名字之间唯一的区别是前导日期。“1-3-2017库存”未被使用,但“1-9-2017库存”正在被提取
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