【问题标题】:Can't see what "subscript out of range"看不到什么“下标超出范围”
【发布时间】:2015-10-29 07:46:11
【问题描述】:

我正在尝试在 Excel 中的 VBA 中创建一个宏,以将一个工作表的内容复制到另一个工作表(最终将升级为将内容从一个工作簿复制到另一个工作簿,但需要先证明这个概念)但我一直遇到 Run -时间错误'9':“下标超出范围”。问题是,我看不到突出显示的行的哪一部分可能超出范围。

我正在使用一个名为“MetaTesting”的工作簿,它有 3 个工作表,下面的代码位从 A1 开始,并且只会向上递增。我以前能够参考这两个工作表以便能够跨单行进行复制,所以我知道问题不存在。这是调试器突出显示的第四行文本(以“Do While Trim(Application...”开头的行)。

注意:已编辑以考虑文件扩展名(如 cmets 中的建议)。同样的错误仍然被抛出,但现在它被抛出在第 11 行(在第一条评论下)

Private Sub CommandButton21_Click()

Dim i As Integer, j As Integer, k As Integer
i = 1

Do While Trim(Application.Workbooks("MetaTesting.xlsm").Worksheets(3).Cells(i, 1).Value) <> ""
    j = 1
    Do While Trim(Application.Workbooks("MetaTesting.xlsm").Worksheets(3).Cells(1, j).Value) <> ""

        'Copy cell data from one sheet to the other
        Application.Workbooks("MetaTesting.xlsm").Worksheets(1).Cells(i, j).Value = Application.Workbooks("MetaTesting.xlms").Worksheets(3).Cells(i, j).Value

        j = j + 1
    Loop

    'Copy formatting of previous row and paste it on current row. Starts at row 3, copying formatting from row 2
    If i > 2 Then
        k = i - 1
        Application.Workbooks("MetaTesting.xlsm").Worksheets(1).Cells(k, j).Copy
        Application.Workbooks("MetaTesting.xlsm").Worksheets(1).Range(Cells(i, 1), Cells(i, j)).PasteSpecial Paste:=xlPasteFormats
    End If

    i = i + 1
Loop

End Sub

任何和所有帮助表示赞赏。

【问题讨论】:

  • 你使用Dim i As Long, j As Long, k As Long时是否也出现同样的错误?
  • 视情况使用Workbooks("MetaTesting.xlsm")Workbooks("MetaTesting.xlsb")?thisworkbook.Name 在 VBE 的即时窗口 (Ctrl+G) 中报告的任何内容。 (顺便说一句,那些Application 电话似乎都没有必要)
  • @Jeeped 它不应该被声明为 Long 因为我正在测试的部分只有大约 10 x 10。但是,将 .xlsm 添加到工作簿名称的末尾确实将错误迁移到第 11 行(在第一条评论下)。但同样的错误。

标签: vba excel


【解决方案1】:

您可以在没有所有循环的情况下执行此操作,只需复制整个工作表 - 复制功能将为您处理跳过空白区域。

Workbooks("MetaTesting").Worksheets(1).Cells.Copy
Workbooks("MetaTesting").Worksheets(2).Cells.PasteSpecial xlPasteValues

只复制一个单元格:

Workbooks("MetaTesting").Worksheets(1).Range("A1:M100").Copy
Workbooks("MetaTesting").Worksheets(2).Range("F12").PasteSpecial xlPasteValues  ' this is the top-left corner of the paste, it'll fill in the rest

【讨论】:

  • 由于问题似乎起源于任何复制开始之前,我相信实际问题出在Workbooks("MetaTesting") 或变量分配中。虽然您提出了一个有效的观点,但我认为它并没有解决手头的问题。
  • 如果要复制的单元格块的长度未知,这种复制方法会起作用吗?
  • 这确实有效,它让我的生活更轻松!只是想知道,除了第一行之外,我如何引用整列?
  • @Imamadmad - 当您将问题的条件更改为以前正确答案变为错误的程度时,接受提供的答案并继续处理另一个问题被认为是良好的SO 礼节。
  • @Jeeped 问题的条件没有改变。当我按照自己的方式进行操作并寻求帮助时,我收到了一个错误,有人提供了一种更简单的方法来解决避免错误的问题。您通过建议将扩展名放在您的一个 cmets 中的问题末尾确实有所帮助,但它并没有解决整个问题,我只能接受 1 个答案。但是,我会赞成所有三个答案,因为它们都在帮助解决问题方面发挥了作用。
【解决方案2】:

第 11 行的问题可能是由于 ("MetaTesting.xlms")。文件扩展名似乎有点错误;应该是 .xlsm,就像等式的前半部分一样。

【讨论】:

  • 啊,这确实解决了我的一个问题,但我标记了另一个答案,因为它解决了更多问题。谢谢您的帮助!错过的总是那些小事!
【解决方案3】:

好的,既然确定需要工作簿扩展,让我们将您的代码缩减为必要的部分。

with Workbooks("MetaTesting.xlsm")
    .Worksheets(3).Cells.Copy Destination:=.Worksheets(1).Cells
    .Worksheets(1).Cells = .Worksheets(1).Cells.Value
end with

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2015-05-27
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多