【问题标题】:For Loop with Array subscript out of range error数组下标超出范围错误的 For 循环
【发布时间】: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 VariantDim arr() As Variant 之间的差异,以及他对.Value.Value2 道具与UsedRange 相关的特殊行为的评论。

标签: excel vba for-loop


【解决方案1】:

要将范围内的所有值放入二维数组,请将范围的 Value 属性分配给 Variant,例如

Dim arr As Variant
arr = Worksheets("Assignments").UsedRange.Value

您可以使用Dim arr() as Variant,但这不是必需的。它只是将数组的每个元素强制转换为 Variant。但是Dim arr As Variant 将创建一个变体数组(不是变体数组),并且将根据需要键入元素。

当您创建这种数组时,它是基数为 1 的数组。所以你的 3、5 和 7 需要考虑到这一点。

Sub data2()

    Dim arr As Variant
    Dim CAR As Variant
    Dim x As Long, i As Long
    
    arr = Worksheets("Assignments").UsedRange.Value
    CAR = Worksheets("CARMA2").UsedRange.Value
    
    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

【讨论】:

  • 看起来我已经写了我们的订单,我复制粘贴了你的订单,它起作用了。我的 CAR= 在昏暗之上。掌心。谢谢
  • 像你一样调暗东西没关系,我只是从不这样做。缺少的部分是UsedRange 末尾的.Value。 Value 属性是 Range 的默认属性(通常),但 Range 对象非常特殊,在这种情况下它试图将 Cells 属性用作默认属性。也许,我有点猜测。
  • 这很奇怪。当我使用代号时,我也没有收到错误。但是当我使用 Worksheets 对象时,我会这样做。我想知道为什么它们的行为不同。
  • Dim arr() as Variant arr = Worksheets(1).UsedRange 因类型不匹配而失败。但是Dim arr As Variant 不会失败。此外,Dim arr() As Variant arr = Sheet1.UsedRange 不会失败。
  • 我认为您正在做某事。 Worksheets 属性返回一个 Sheets 集合对象,其中包含 WorksheetChart 对象。我敢打赌,是“通用”集合对象破坏了它确定默认属性的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多