【发布时间】:2021-11-12 13:53:03
【问题描述】:
任何人都知道为什么我在 IF 语句中得到一个下标超出范围的错误。我只是在学习数组,所以我只能假设它与此有关。
Dim CARMA2 As Worksheet
Dim Assignments As Worksheet
Sub data2()
Dim arr() As Variant
Dim CAR() As Variant
arr = Array(Worksheets("Assignments").UsedRange)
CAR = Array(Worksheets("CARMA2").UsedRange)
Dim i As Variant
For x = LBound(CAR, 1) To UBound(CAR, 1)
For i = LBound(arr, 1) To UBound(arr, 1)
If arr(i, 5) = CAR(x, 1) And arr(i, 7) = """" Then
arr(i, 7) = CAR(x, 3)
End If
Next i
Next x
End Sub
【问题讨论】:
-
这表明第二维(以
arr(i, 7)中的7为例)可能超出范围/不存在。当您的代码遇到if语句时,这两个数组的大小是多少?请注意,由于您是数组新手,因此数组几乎总是从索引 0 开始,而不是索引 1。所以也许您的意思是If arr(i, 4) = CAR(x, 0) And arr(i, 6) = """" Then arr(i, 6) = CAR(x, 2)? -
所以我需要它是动态的,因为工作表的大小可能会改变,这就是我使用 UsedRange 的原因。但我有一种不正确的感觉。
-
使用
Array(),您将单个范围对象分配给数组arr,与数组CAR相同。因此,您有0 To 0的索引边界,它引用了从零开始的 1 维 数组中的单个对象。 - 因此,我怀疑您打算创建一个(基于 1 的!)2-dim 数据字段数组,例如可以这样做改为arr = ThisWorkbook.Worksheets("Assignments").UsedRange;现在您可以参考索引值,例如通过arr(i, 5)和arr(i, 7)等@JoshHudson -
这给了我 arr= 行的类型不匹配。基本上我的工作簿中有 2 个大选项卡,需要比较每个选项卡中的数据。由于它们太大了,我认为数组会加快速度,因为正常的 for 循环需要一个多小时才能运行。
-
@JoshHudson 抱歉回复晚了:测试我的代码通过例如引用项目的工作表代码(名称)没有问题。
arr = Sheet1.UsedRange没有显式添加.Value属性。同时,迪克已经在他接受的答案中总结了一些值得了解的要点,尤其是关于Dim arr As Variant和Dim arr() As Variant之间的差异,以及他对.Value或.Value2道具与UsedRange相关的特殊行为的评论。