为什么当将范围值传递给数组时,数组索引从1开始

时间:2014-06-03 04:47:44

标签: excel-vba vba excel

在这个VBA程序中,我要做的就是从电子表格传递一个数组,并为每个数组的单元格添加1。我的问题是数组的索引。当我开始循环数组时它不会 当我从零开始索引时工作(我得到错误下标超出范围)但是当我从1开始数组时它工作得很好。为什么会这样? (我认为只有我在顶部 Option Base 1 指定

的情况才是这种情况
Sub Passarray()
    Dim Array As Variant
    Dim i, j As Integer
    'Pass array and manipulate
    Vol = Range("Volatility")
    For i = 0 To 2
       For j = 0 To 2
          Vol(i, j) = 1+ Vol(i,j)
       Next j
    Next i
End Sub

1 个答案:

答案 0 :(得分:1)

根据我的经验将 Range 传递给数组时,情况并非如此。
我不知道背后的具体原因,但this link表示您无法改变此行为。

  

QUOTE:加载工作表数据的数组始终具有等于1的下限(LBound),无论模块中可能包含哪个Option Base指令。你无法改变这种行为。

你能做的就是像这样利用 LBound / UBound

Vol = Range("Volatility")
For i = LBound(Vol, 1) To UBound(Vol, 1)
    For j = Lbound(Vol, 2) To Ubound(Vol, 2)
        '~~> do stuff here
        Vol(i, j) = 1 + Vol(i, j)
    Next j
Next i

但是,如果您的 Range 只是一行包含多行,则将其传递给Array,如下所示:

Vol = Application.Transpose(Range("Volatility"))
For i = LBound(Vol) To UBound(Vol)
    '~~> do stuff here
    Vol(i) = 1 + Vol(i)
Next

这样,您将生成一维阵列而不是二维阵列 要迭代上面可以使用的值,或者也可以使用 For Each

Dim x As Variant '~~> dimension another variant variable
For Each x In Vol
    '~~> do stuff here
    x = 1 + x
Next