【问题标题】:Runtime Error 9 on Loop循环运行时错误 9
【发布时间】:2017-03-01 17:04:01
【问题描述】:

我有三本工作簿;所有这些都包含有关相同政策的信息,但来自不同的文件。我正在尝试从工作簿 1 和工作簿 3 中具有相同工作表名称的每个工作表中复制相同单元格的值。这是我拥有的代码:

Sub foo()

    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
    Dim wkb3 As Workbook
    Dim shtName As String
    Dim i As Integer

    Set wkb1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx")
    Set wkb2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx")
    Set wkb3 = Workbooks.Open("C:\Users\lliao\Documents\Measure Trad Recon LS.xlsx")

    shtName = wkb2.Worksheets(i).Name

    For i = 2 To wkb2.Worksheets.Count
        wkb2.Sheets(shtName).Range("D3").Value = wkb1.Sheets(shtName).Range("D2")
        wkb2.Sheets(shtName).Range("E3").Value = wkb1.Sheets(shtName).Range("E2")
        wkb2.Sheets(shtName).Range("F3").Value = wkb1.Sheets(shtName).Range("F2")
        wkb2.Sheets(shtName).Range("D4").Value = wkb3.Sheets(shtName).Range("D2")
        wkb2.Sheets(shtName).Range("E4").Value = wkb3.Sheets(shtName).Range("E2")
        wkb2.Sheets(shtName).Range("F4").Value = wkb3.Sheets(shtName).Range("F2")
    Next i

End Sub

我不明白我是如何错误地使用下标的。这是我第一次编写 VBA 代码(5 年多来的第一次),所以我不熟悉代码错误。

谢谢!

【问题讨论】:

  • 所有 3 个工作簿中的所有工作表名称是否相同?

标签: excel vba runtime-error


【解决方案1】:
Dim i As Integer

Set wkb1 = Workbooks.Open("C:\Users\lliao\Documents\Trad Reconciliation.xlsx")
Set wkb2 = Workbooks.Open("C:\Users\lliao\Documents\TradReconciliation.xlsx")
Set wkb3 = Workbooks.Open("C:\Users\lliao\Documents\Measure Trad Recon LS.xlsx")

shtName = wkb2.Worksheets(i).Name

变量 i 已声明,但在分配之前使用 - 因此它的值是隐含的 0

由于 VBA 集合是从 1 开始的,这使得 wkb2.Worksheets(i) 越界。

Dim i As Integer
i = 1

'...

shtName = wkb2.Worksheets(i).Name

会解决的。

你可能想把它移到循环中。

【讨论】:

  • 也许将shtName = wkb2.Worksheets(i).Name移动到For i = ...之后
  • @A.S.H 可能...目前尚不清楚shtName 应该是什么 ;-)
  • 谢谢!这修复了该错误,但它在第一行给了我一个错误 9,wkb2.Sheets(shtName).Range("D2").Value = wkb1.Sheets(shtName).Range("D2")
  • @leetontea 您需要大声朗读您的代码。它会做它应该 做的事情吗? wkb1wkb2 都没有名为 shtName 的工作表 - 您需要在此处确定要执行的操作。
  • 是的,在使用之前验证工作表是否存在听起来是个好主意
【解决方案2】:

可能是你追求这个:

For i = 2 To wkb2.Worksheets.Count
    wkb2.Sheets(i).Range("D3:F3").Value = wkb1.Sheets(i).Range("D2:F2")
    wkb2.Sheets(i).Range("D4:F4").Value = wkb3.Sheets(i).Range("D2:F2")
Next i

【讨论】:

  • 这是很有潜力的。假设工作表名称全部匹配并且顺序相同。如果不是这种情况,这将非常有效,但不会产生所需的输出。如果wkb1 和/或wkb3 的工作表数量与wkb2 不同,它也会失败。这是一个很好的基础来进行一些错误检查。
猜你喜欢
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多