Vba 运行时错误';1004';当循环通过大量行样本时

Vba 运行时错误';1004';当循环通过大量行样本时,vba,excel,for-loop,runtime-error,Vba,Excel,For Loop,Runtime Error,为了实现在大量行样本中循环的最有效方式,我在Sheet3中创建了以下代码,其灵感来自: 运行代码后,出现运行时错误“1004”:应用程序定义或对象定义错误。如何修复它 VArray = Range("A:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value 不是引用图纸2,而是当前显示的图纸。使用 With S2 VArray = .Range("A1:A" & .Cells(Rows.Count, "A").End(xl

为了实现在大量行样本中循环的最有效方式,我在Sheet3中创建了以下代码,其灵感来自:

运行代码后,出现运行时错误“1004”:应用程序定义或对象定义错误。如何修复它

VArray = Range("A:A" & Cells(Rows.Count, "A").End(xlUp).Row).Value  
不是引用图纸2,而是当前显示的图纸。使用

With S2
    VArray = .Range("A1:A" & .Cells(Rows.Count, "A").End(xlUp).Row).Value
End With  
注意从“A:A”到“A1:A”的变化。
范围
对象需要一个以冒号分隔的起始单元格和结束单元格引用


出于性能原因,还应将以下语句放入
With
块中。这样,对工作表的引用将只搜索一次,而不是多次。

单步执行代码后,错误出现在
VArray=
行,这里有两件事:

  • 范围(“A:A”…
    应改为
    范围(“A”…
    ),因为您指定的是一行,而不是从整个工作表的顶部到底部选择整个列
  • 多个后续单元格的
    范围可以通过使用
    
    Range(FirstCell,LastCell)
    。您的代码仅选择底部单元格,因此通过在范围引用的开头添加
    “A1”
    ,它将选择您需要的所有单元格


  • user1016274是正确的,您需要为范围和单元格添加S2

    VArray = S2.Range("A:A" & S2.Cells(Rows.Count, "A").End(xlUp).Row).Value
    
    或者听从他的建议:

    With S2
        VArray = .Range("A:A" & .Cells(Rows.Count, "A").End(xlUp).Row).Value
    End With
    
    这是非常有用的。当你有多个工位时,它可以节省时间和空间

    另一个错误是在您的
    范围内
    。您必须定义两个以逗号分隔的单元格,此处定义a列和最后一行中以
    分隔的单元格。请尝试以下操作:

    VArray = Range(S2.Cells(1, 1), S2.Cells(Rows.Count, "A").End(xlUp))
    
    编辑: 当我运行此功能时,它对我来说运行良好:

    Sub Testing_Data()
    Dim k As Long, S2 As Worksheet, VArray
    
    Application.ScreenUpdating = False
    Set S2 = ThisWorkbook.Sheets("Sheet2")
    
    VArray = Range(S2.Cells(1, 1), S2.Cells(Rows.Count, "A").End(xlUp)).Value
    
    For k = 2 To UBound(VArray, 1)
        S2.Cells(k, "B") = VArray(k, 1) / 100
        S2.Cells(k, "C") = VArray(k, 1) * S2.Cells(k, "B")
    Next
    End Sub
    


    哪一行返回错误?错误发生时;变量的值是多少?@destination data它不指向任何行。@Anastasiya Romanova秀 当您的代码出现问题时,您可以使用F8键一步一步地运行它,这样您就可以看到哪些行可以执行,以及在什么时候抛出错误。@OliverCarr感谢您提供的提示。让我在VBA编辑器compile error中尝试您的答案:无效或不合格reference@Anastasiya-罗曼诺娃秀 我已经更新了我的答案,对你的代码做了一些额外的调整。@Anastasiya Romanova秀 很高兴听到这个消息,我已经更新了我的答案以提供进一步的解释。@Anastasiya Romanova秀 你应该接受答案,而不仅仅是投票。@Tom我知道这个练习。我也是其他SE网络的用户。我习惯在接受答案之前等待片刻。不过,谢谢提醒。:)错过了
    行前面可能需要的额外
    。count
    ?这与问题相同:
    范围(“A:A100”)
    (例如)不是有效范围…我知道。请看我对奥利弗帖子的评论。基本上,缺少
    1
    范围(A1:A100)
    将是有效的。如果您知道您的答案有错误,那么可能会更正错误?使用您的代码或用户1016274,运行时错误“1004”:仍会发生应用程序定义或对象定义的错误。这对我很有用。我刚刚用全部代码编辑了我的答案。如果仍然不起作用,请告诉我。我发誓使用您更新的答案仍然会出现错误,这很奇怪。。。我不知道为什么它对你不起作用。也许您应该将数组正确地声明为variant:VArray()作为variant。很抱歉,我无法解决这个问题。即使我在@OliverCarr的回答中省略了变量
    ()部分,他的代码仍然可以正常工作。不用道歉
    
    VArray = Range(S2.Cells(1, 1), S2.Cells(Rows.Count, "A").End(xlUp))
    
    Sub Testing_Data()
    Dim k As Long, S2 As Worksheet, VArray
    
    Application.ScreenUpdating = False
    Set S2 = ThisWorkbook.Sheets("Sheet2")
    
    VArray = Range(S2.Cells(1, 1), S2.Cells(Rows.Count, "A").End(xlUp)).Value
    
    For k = 2 To UBound(VArray, 1)
        S2.Cells(k, "B") = VArray(k, 1) / 100
        S2.Cells(k, "C") = VArray(k, 1) * S2.Cells(k, "B")
    Next
    End Sub