当前位置: 首页 > 知识库问答 >
问题:

Excel 宏 - 运行时错误“9”:下标超出范围(在要复制的 For 循环内)

桑博远
2023-03-14

这是一个简单的宏代码,用于从一个工作簿复制范围A2直到最后一行,并将其粘贴到另一个工作簿中。我是一个新手,用谷歌搜索了很多页面,但未能帮助自己。代码粘贴如下-

'

Sub TC_Creation_Sample()
Dim aPath As String, aFile As String, bFile As String
Dim FinalRow As Integer, x As Integer

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
End With

aPath = "C:\temp\"
aFile = aPath & "Config"
bFile = aPath & "TC_Template"
Workbooks.Open (aFile)
Sheets("Config").Activate
'FinalRow = Cells(Rows.Count, "A").End(xlUp).Row
FinalRow = Worksheets("Config").Range("A2").End(xlDown)

For x = 2 To FinalRow
            Worksheets("Config").Range("A" & x).Select
            Selection.Copy
            Workbooks.Open (bFile)
            Worksheets("TestCases").Range("A" & x).Select
            ActiveSheet.Paste
Next x       
End Sub

'

结果-调试后,发现代码成功复制粘贴A2值。然而,它引发了运行时错误9:Subscript超出范围。当工作表(“Config”).Range(“A”)

共有3个答案

丁淇
2023-03-14

需要提及的几点。

首先 - Excel 工作簿可以包含数百万行 - 但您的代码仅限于 32,768 行,因为您将 FinalRow 和 X 定义为整数。请改用长整数(将 X 调暗为长,最后一行为长),以防您打开的工作簿之一超过 32,000 行。

现在谈谈错误的原因。当您通过For-Next循环第二次运行代码时,系统挂起,因为就它而言,活动工作簿是bFile,并且因为配置选项卡在bFile上不存在(它在aFile上),它会崩溃,并出现无益的错误消息(因为它找不到正确的选项卡,因为它在错误的地方查找)。

顺便说一句,每次For… Next循环触发时,您的代码都会尝试打开(bFile)。每次都需要打开文件吗?当然,这只是将详细信息从一个工作表复制到下一个工作表的情况?

您还应该有一些错误处理。如果 aFile 不包含“配置”选项卡,或者 bFile 不包含“测试用例”选项卡,则代码将崩溃。我强烈建议您进行一些错误处理来处理这些实例。

瞿子濯
2023-03-14

您尚未将行号分配给FinalRow变量。尝试:

FinalRow = Worksheets("Config").Range("A2").End(xlDown).Row
狄玮
2023-03-14

这样更好吗?我将您的工作簿分配给工作簿变量,并取出了选择复制方法。我还添加了.行,正如其他人也建议的那样

Sub TC_Creation_Sample()
    Dim aPath As String, aFile As String, bFile As String
    Dim FinalRow As Long, x As Long
    Dim wbA As Workbook, wbB As Workbook

    With Application
        .ScreenUpdating = False
        .DisplayAlerts = False
    End With

    aPath = "C:\temp\"
    aFile = aPath & "Config"
    bFile = aPath & "TC_Template"

    Set wbA = Workbook.Open(aFile)
    Set wbB = Workbooks.Open(bFile)

    FinalRow = wbA.Worksheets("Config").Range("A2").End(xlDown).Row
    'FinalRow = wbA.Worksheets("Config").Cells(Rows.Count, "A").End(xlUp).Row

    For x = 2 To FinalRow
        wbB.Worksheets("TestCases").Range("A" & x).Value = wbA.Worksheets("Config").Range("A" & x)
    Next x
End Sub
 类似资料:
  • 非常感谢。最好的问候。

  • 我有一个基于Euler项目问题3的代码:“13195的素数因子是5、7、13和29。600851475143中最大的素数因子是什么?” 我在下面有一个我认为可行的代码,但第9行()不断返回错误:“索引器:列表索引超出范围”。当我在for循环中移动时,似乎并没有修改列表,所以我不确定出了什么问题。 有人知道我哪里错了吗? 非常感谢。

  • 我正试图从另一个excel文件复制工作表到其中一个工作表,但我得到了一个下标超出范围的错误。此错误来自行'.worksheet(1).usedrange.copy thisworkbook.worksheets(“sheet1”).range(“a1”)‘。

  • 我在实验基于范围的for循环时发现,如果你使用基于范围的for循环来循环一个向量,它会出现超出范围的错误,如果你使用基于范围的for循环,有没有办法避免这个错误 它会显示此错误

  • 为了完成这项任务,我花了几周时间试图从其他建议中拼凑出一个完整的VBA,但现在我要向大家寻求答案。我试图从ws2中的a:K列中复制一个范围,该行以值c开头,该值与ws1中的值I匹配,该行以ws1中的值I开头。正在复制的条件是1和0。它基本上是一个美化的循环v形查找,粘贴动态范围。 我弄清楚了循环机制,现在我只需要帮助编写代码来复制选定的单元格。 这是我到目前为止所拥有的:

  • 由于valgrind中出现了一些分段错误和警告,我发现这段代码不正确,并且在for range循环中有一些悬而未决的引用。 看起来好像开始和结束是从一个临时循环中提取的,并且在循环中丢失了。 当然,一种方法是 然而,我想知道为什么for(auto e:f()[5])是一个错误,以及是否有更好的方法或某种方法来设计f,甚至容器(