我是在excel中使用VBA的新手,我试图实现一个函数来执行对数字数组的代数操作。这个函数需要创建子数组,子数组的大小相对于参数数组的上界和下界。
我有以下函数和TestFEMISS()子函数。
Function FEMISS(ParamArray arr() As Variant) As Variant
Dim a() As Variant
Dim b() As Variant
Dim i() As Variant
i = arr
Dim maxA As Long
Dim minB As Long
Dim maxB As Long
maxA = UBound(i) - 1
minB = LBound(i) + 1
maxB = UBound(i)
ReDim a(0 To maxA)
ReDim b(minB To maxB)
For x = 0 To maxA
a(x) = i(x)
Next x
For x = minB To maxB
b(x) = i(x)
Next x
Dim tempArr() As Variant
ReDim tempArr(0 To maxA)
For x = 0 To maxA
tempArr(x) = 1 / ((1 / a(x)) + (1 / b(x + 1)) - 1)
Next x
FEMISS = tempArr
End Function
Sub TestFEMISS()
Dim testArr(0 To 2) As Variant
Dim outputArr() As Variant
testArr(0) = 0.1
testArr(1) = 0.8
testArr(2) = 0.8
outputArr = FEMISS(testArr)
MsgBox outputArr(0) & "," & outputArr(1)
End Sub
当我运行时,它会出现错误,因为它为UBound和LBound限制返回0,我不确定为什么。在我的excel表格中,我有两个不同的单元格:B21和B22,我正在测试这个公式。在B21中,我有=FEMISS('Fenestration Eqns'!B16#)
,它应该引用一个动态数组,该数组当前包含三个单元格,值为0.1,0.8,0.8;但它只给了我一个错误。B22包含=FEMISS(0.1,0.8,0.8)
,目前正在输出2个计算单元,完全按照预期完成。
我试过将动态数组转换为单个单元格中的文本字符串并修改UBound尺寸,但都没有奏效。一旦我将它设置为引用动态数组的任何参数,即使在嵌套公式中,它也会崩溃。
你可能误解了ParamArray
的概念。当你有一个未定义数量的参数(任何类型)时使用ParamArray,例如当你想用
FEMISS p1
FEMISS p1, p2
FEMISS "ABC", p2, 123
有关paramArray的更多信息,请参阅文档
你用一个参数调用你的例程(这是一个数组,但它可以是任何其他类型),所以LBound(arr)
和UBound(arr)
是0。
arr(0)
会给你传递的数组作为(唯一的)参数,所以LBound(arr(0))
和UBound(arr(0))
会给你0和2。
Function FEMISS(ParamArray arr() As Variant) As Variant
i = arr
Debug.Print LBound(i), UBound(i)
i = arr(0)
Debug.Print LBound(i), UBound(i)
这可以工作,但是使它变得比必要的更复杂。只需删除函数声明中的ParamArray
。现在函数只需要一个参数,并且该参数需要是一个数组(类型为Variant)。
Function FEMISS(arr() As Variant) As Variant
Debug.Print LBound(arr), UBound(arr)