VBA 将 Excel.Range 作为数组传递给函数

问题描述 投票:0回答:2

我是 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 是否返回完全相同的结果?

excel vba
2个回答
1
投票

这取决于您通过的范围。

  • 如果

    ticker
    是单细胞,例如
    Range("A1")
    ,那么它的
    .Value
    就不是一个数组。

  • 如果

    ticker
    是多单元格连续范围,例如
    Range("A1:A2")
    ,那么它的
    .Value
    就是一个二维数组

  • 如果

    ticker
    是多单元格不连续范围,例如
    Range("A1:A2,C1:C2")
    ,则
    .Value
    仅指第一个区域,即
    A1:A2
    .

无论如何,这两个函数返回不同的东西。

推荐阅读:Chip Pearson on Arrays and Ranges.


-1
投票

正如 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
© www.soinside.com 2019 - 2024. All rights reserved.