【问题标题】:Subscript out of range error with an array - no idea why?数组下标超出范围错误 - 不知道为什么?
【发布时间】:2021-12-25 06:56:35
【问题描述】:

我已经声明了一个这样的数组Dim rArray() As Variant但是当我尝试使用存储在其中的值时(如下所示),我得到一个下标超出范围错误。 UBound(rArray)LBound(rArray) 都返回值 14 和 1,但错误发生在 Debug.Print 行。

如果我使用下面的 for 语句

For Each rArr in rArray

然后它可以正常工作,但出于创建此数组的目的,我需要灵活地选择按该顺序存储的每个项目——这意味着我需要使用下标来引用它们。

我尝试了多种方法来尝试解决这个问题,但没有成功,我几乎半天的时间都在这个问题上。谁能指出我需要改变什么才能让它工作。

Set rng = Range("D4", Range("D4").End(xlDown))
rng.NumberFormat = "0"
rArray = rng.Value

For x = UBound(rArray) To LBound(rArray) Step -1
    Debug.Print rArray(x)
Next x

编辑:另一个值得一提的事实是,数组是在函数中声明和使用的,但它没有从函数传递或传递给函数。 Functions中不能声明和使用数组吗?

【问题讨论】:

  • 我不是专家,但如果你打印 x,看看 x 的值是多少,问题发生在
  • 谢谢。我不必打印 x,在调试时我可以看到 x 的值为 14,这是循环开始的地方 - 数组中存储了 14 个项目。
  • 作为故障排除步骤,如果您删除循环并尝试 x=13 会怎样?并尝试 x=1
  • 试过了——我得到了同样的错误——下标超出范围。这就是让我认为这是我将值存储在数组中的方式。
  • 我不知道,我并没有真正使用VBA,但你这个问题问得很好,听起来很琐碎,你会得到答复的。

标签: arrays vba excel


【解决方案1】:

当您将工作表值分配给变量数组时,您总是最终得到一个基于 1 的二维数组(例如,1 到某物,1 到某物; 从不 0 表示某事,0 表示某事)。如果您从单个列中获取值,则第二个 Rank 仅为 1 到 1。

这可以用以下来证明。

Dim x As Long, rArray As Variant, rng As Range

Set rng = Range("D4", Range("D4").End(xlDown))
rng.NumberFormat = "0" 'don't really understand why this is here
rArray = rng.Value

Debug.Print LBound(rArray, 1) & ":" & UBound(rArray, 1)
Debug.Print LBound(rArray, 2) & ":" & UBound(rArray, 2)

For x = UBound(rArray, 1) To LBound(rArray, 1) Step -1
    Debug.Print rArray(x, 1)
Next x

所以你需要求数组第一排的元素;仅仅要求元素是不够的。

【讨论】:

  • 再次感谢 Jeeped。因此,如果我将数组更改为 Integer Dim rArray () As Integer 那么它应该可以正常工作 - 但事实并非如此?
  • 老实说,我不认为您可以将工作表值填充到变量数组中,除非您循环遍历单元格并单独填充数组。有时,开箱即用的想法是行不通的。坚持使用变体数组。
  • 谢谢!珍惜时间和精力。我之所以问是因为我以前从未使用过二维数组,所以这对我来说可能会花费更多时间。但我很高兴学习 - 只是时间紧迫。
  • 工作就像一个魅力 - 再次感谢。在我尝试应用我的小知识之前应该在这里发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-27
相关资源
最近更新 更多