Excel Dir返回意外的null

时间:2017-11-08 14:28:13

标签: excel vba excel-vba

我正在尝试编写我认为将目录中的所有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多个文件,所以我想我可以在代码上花一点时间。 任何想法都会受到高度赞赏,因为我对此非常满意。

2 个答案:

答案 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}