我是 VBA 的新手,对下面的两个代码有点困惑。有人能告诉我这里有什么区别吗?第一个代码工作正常,但第二个代码将返回#VALUE!错误。
例一
Function Example1()
Dim vtSecurities As Variant
vtSecurities = Array("AAPL US Equity", "GOOG US Equity")
Example1 = vtSecurites
End Function
例二
Function Example2(ticker As Excel.Range)
Dim vtSecurities As Variant
vtSecurities = ticker.Value
Example2 = vtSecurites
End Function
所以我试过了,他们似乎在工作表中返回了相同的数组。然而,在实际的大型应用程序中,数组(vtSecurities)将被传递给另一个函数,Example2 不起作用。所以我想我的问题是 - Example1 和 Example2 是否返回完全相同的结果?
这取决于您通过的范围。
如果
ticker
是单细胞,例如Range("A1")
,那么它的.Value
就不是一个数组。
如果
ticker
是多单元格连续范围,例如Range("A1:A2")
,那么它的.Value
就是一个二维数组
如果
ticker
是多单元格不连续范围,例如Range("A1:A2,C1:C2")
,则.Value
仅指第一个区域,即A1:A2
.
无论如何,这两个函数返回不同的东西。
正如 BigBen 提到的
.Value
给你一个二维数组,但如果你确实希望它是一维的(并且它来自一个单一的列),那么它只是一个小修复:
Function Example2(ticker As Range)
Dim vtSecurities As Variant, arr(), i As Long
arr = ticker.Value
ReDim vtSecurities(1 To UBound(arr, 1))
For i = 1 To UBound(arr, 1)
vtSecurities(i) = arr(i, 1)
Next i
Example2 = vtSecurities 'there was a typo here, just fyi
End Function
正如 freeflow 和 BigBen 所提到的:在 VBA 中对数组进行转置,该数组的长度不得超过 65,536 (2^16) 行,但如果您处理的范围更小,则更容易使用:
Function Example2(ticker As Range)
Dim vtSecurities As Variant, arr(), i As Long
vtSecurities = Application.Transpose(ticker.Value)
Example2 = vtSecurities
End Function