在VBA中将数组值分配给变量会导致我的UDF退出。

4

我似乎无法弄清楚为什么这个UDF在 currentInput = inputArray(i) 处退出。以下是相关的代码:

Function OrderRange(inputRange As Range) As Variant

    Dim length As Integer
    inputHeight = inputRange.Count

    Dim inputArray As Variant
    inputArray = inputRange

    Dim strippedArray() As Variant
    ReDim strippedArray(0 To (inputHeight - 1))

    Dim currentInput As String

    Dim i As Integer

    For i = 0 To (inputHeight - 1)

        currentInput = inputArray(i)
        '...computations on currentInput...'
        strippedArray(i) = currentInput
    Next i
    OrderRange = strippedArray
End Function

调试器到达currentInput = inputArray(i),但一旦我移动到下一行,函数终止并在调用函数的单元格中输入#VALUE!错误。我知道这是一个具体问题,但我相信这是一个普遍问题,我将编辑此原始帖子以反映一般问题。
编辑:这是关于将范围分配给变量数组的问题。

你应该使用 Option Explicit。在这里,你没有使用它,导致声明了一个变量但没有使用(length),并且隐式声明了 inputHeight 为 Variant 类型。 - Jean-François Corbett
很好的发现,Jean,我修改了帖子中的代码以更清晰地表达我的问题;我忘记将“length”更改为“inputHeight”。 - nightTrevors
是的,这是一个经典问题……这就是为什么人们使用“Option Explicit”:它不会让你忘记! - Jean-François Corbett
1个回答

7

将变量数组设置为范围值时,即使它们只有一列或一行,也会有两个维度。因此,如果您使用A1:A10调用函数,则会得到一个10 * 1的数组。另外,维度的下限将为1而不是0。因此,您需要执行类似以下操作:

For i = 1 To (inputHeight)
    currentInput = inputArray(i, 1)

此外,您应该使用Option Explicit,这样就会提醒您声明所有变量。InputHeight从未被声明。

1
或者使用 Application.Transpose 强制将范围转换为单维变量(如果范围是一列或一行)。 - brettdj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接