【问题标题】:Dealing with Run-time error '9': Subscript out of range when iterating over Worksheet处理运行时错误“9”:迭代工作表时下标超出范围
【发布时间】:2015-05-05 05:26:58
【问题描述】:

不是 Excel/VB 专家,但我一直在学习

运行时错误:9:下标超出范围

错误发生在For Each 行。不知道为什么。我正在尝试将工作表从一个工作簿复制到另一个工作簿。

工作簿strFileName 正在成功打开,并且工作簿确实包含另外两个工作表,但代码在下一行失败。我看过关于类似问题的类似帖子,但没有任何运气。任何建议都会很棒。 (我使用的是 Excel 2010)谢谢

Workbooks.Open (strFileName)

For Each sheet In Workbooks(strFileName).Worksheets
    total = Workbooks(activeWKBook).Worksheets.Count
    Workbooks(strFileName).Worksheets(sheet.Name).Copy _
    after:=Workbooks(activeWKBook).Worksheets(total)
Next sheet

【问题讨论】:

  • 试试这个Workbooks(strFileName).Worksheets(sheet.Name).Copy after:=Workbooks(activeWKBook).Sheets(Sheets.Count)

标签: vba excel excel-2010


【解决方案1】:

strFileName 包含工作簿的完整路径。
所以你不能在Workbooks(strFileName) 中使用它,因为它只需要工作簿名称。

你应该这样做:

Dim wbName As String
wbName = Split(strFileName, "\")(Ubound(Split(strFileName, "\"))) ' Get the WB Name

For Each sheet In Workbooks(wbName).Worksheets
   ' Other cool stuff goes here
Next

但最好立即明确,这样您就不必担心默认路径分隔符。
请记住,它并不总是\。所以我建议你在下面试试。

Dim myWB As Workbook
Set myWB = Workbooks.Open(strFileName)

Dim sheet As Worksheet
For Each sheet In myWB.Worksheets
    With Thisworkbook ' Explicitly refer to the workbook that contains the code
        sheet.Copy After:=.Sheets(.Sheets.Count)
    End With
Next

请记住,您需要使用ThisWorkbook 代替ActiveWorkbook
为什么?因为在您打开另一个工作簿的那一刻,当前打开的工作簿就变成了ActiveWorkbook

所以要将所有工作表从打开的工作簿复制到包含代码的工作簿,请改用ThisWorkbook

【讨论】:

  • 谢谢!!使用了你的第二种方法,它奏效了。一个问题,而不是将新工作表附加到“Thisworkbook”工作簿中,有一种方法可以显式声明应将数据加载到的工作表。假设我在 Thisworkbook 中有一个名为“复制数据”的工作表,有没有办法将数据复制到这个特定的工作表中?
  • @tony 是的。但是您必须复制并粘贴工作表的内容。
猜你喜欢
  • 2017-04-22
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多