Excel VBA - 下标超出一维数组的范围

Posted

技术标签:

【中文标题】Excel VBA - 下标超出一维数组的范围【英文标题】:Excel VBA -- Subscript out of range with single-dimension array 【发布时间】:2012-08-30 18:07:09 【问题描述】:

这是一个非常简单的问题,但我已经为此头疼了一个小时。我正在尝试执行以下操作:

    从我的电子表格中的命名范围定义 VBA 数组 访问该数组中的项目

现在,如果命名范围恰好覆盖了多维区域(行和列),那么这可以正常工作:

foobar = Range("two_dimensional_range")
MsgBox foobar(1,1)

但是,如果命名范围由单个维度(只是一列)数据组成,则会产生“下标超出范围”错误:

foobar = Range("one_dimensional_range")
MsgBox foobar(1)

我已经验证 foobar 确实是一个数组。我可以用 For Each ... Next 遍历它。如果我调用 Ubound(foobar) 那么它会给我正确的大小。我只是不能直接访问它的单个元素!

我做错了什么?

【问题讨论】:

【参考方案1】:

当您将范围(不是单个单元格)分配给变量数组时,它将始终是多维数组,因此此 MsgBox foobar(1,1) 在第二个实例中仍然有效。

看这个例子

Option Explicit

Sub Sample()
    Dim Ar As Variant

    Ar = Range("A1:A2")

    Debug.Print Ar(1, 1)
    Debug.Print Ar(2, 1)
End Sub

另一个例子

Option Explicit

Sub Sample()
    Dim Ar As Variant

    Ar = Range("A1:B2")

    '~~> Get Values from Col A
    Debug.Print Ar(1, 1)
    Debug.Print Ar(2, 1)

    '~~> Get Values from Col B
    Debug.Print Ar(1, 2)
    Debug.Print Ar(2, 2)
End Sub

【讨论】:

以上是关于Excel VBA - 下标超出一维数组的范围的主要内容,如果未能解决你的问题,请参考以下文章

打印来自 For Each 函数 VBA 的数组结果得到下标超出范围错误

Excel VBA函数:如何传递范围、转换为数组、反转和返回数组

PHP 把二维数组按下标拆分成一维数组

实验十——一维数组的定义及引用

用C语言如何将一个一维数组中的元素随机排序

Java入门_一维数组_第二题_随机生成数