【问题标题】:VBA - Subscript out of Range when Workbooks().CloseVBA - Workbooks().Close 时下标超出范围
【发布时间】:2017-08-18 04:17:51
【问题描述】:

我想遍历文件夹中的所有 excel 工作簿,并在每个工作簿的每个工作表的单元格 A1 中写入字符串“Test”。 以下代码导致“下标超出范围(错误 9)”。 当我逐行运行代码时,结果发现错误是由 行:
Workbooks(FName).Close Savechanges:=True
Dir("C\...") 存储在 FName 中仅返回文件名,因此错误不可能是因为将完整路径名提供给 Workboooks(...).Close 这似乎通常是错误。
最重要的是这段代码真正打开了工作簿,而不是只是写入它。我不想要它 以可视方式打开。

Sub multWB()

Dim FName As String
Dim wb As Workbook
Dim sht As Worksheet
Dim directory As String

directory = "C:\Users\...\Desktop\multipleWorkbooks\"
FName = Dir("C:\Users\...\Desktop\multipleWorkbooks\*.xls*")

Do While FName <> ""


            Set wb = Workbooks.Open(directory & FName)
                   For Each sht In wb.Worksheets
                    sht.Cells(1, 1) = "Test"
                   Next
            FName = Dir

            Workbooks(FName).Close Savechanges:=True 'causes error


Loop
     Set wb = Nothing

End Sub

【问题讨论】:

  • 试试Workbooks(FName).Close True
  • @dwirony 我试过了,但错误仍然存​​在

标签: vba excel file-io


【解决方案1】:

您已经使用wb 引用了工作簿。只需使用那个参考!

wb.Close SaveChanges:=True

其他任何东西都会无缘无故地取消引用对象。

【讨论】:

    【解决方案2】:

    在关闭当前打开的工作簿之前,您正在检索下一个工作簿的名称。切换这两行代码的顺序:

            Workbooks(FName).Close Savechanges:=True 
            FName = Dir()
    

    【讨论】:

    • Dir 在这段代码中做什么,后面没有文件路径?
    • 在 "FName = Dir("C:\Users\...\Desktop\multipleWorkbooks*.xls*")" 行,他开始搜索所有 Office 97-2003 样式的 .xls multipleWorkbooks 目录中的工作簿。下次调用 Dir() 从搜索中检索下一个结果。
    【解决方案3】:

    这个:FName = Dir 缺少文件夹名称。改成这样:

    FName = directory &amp; Dir()

    【讨论】:

    • (a) 这将创建一个无限循环,因为FName 永远不会等于""。 (b) 原始代码已经将路径和文件名连接在一个应该组合的位置 (Workbooks.Open(directory &amp; FName))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多