Arrays Excel VBA UDF数组函数为所有CEL返回相同的值
我正在尝试使用Excel VBA UDF函数返回数组。到目前为止,函数要么返回#VALUE!如果我将参数定义为双数组,或者如果我将参数定义为变量(即使我在VBE中的“局部变量”窗口中进行了检查,并且返回的数组变量实际上包含不同的值),那么如果我将参数定义为双数组,或者数组中的所有单元格都具有相同的值,则会出现错误 这是我的密码:Arrays Excel VBA UDF数组函数为所有CEL返回相同的值,arrays,excel,user-defined-functions,vba,Arrays,Excel,User Defined Functions,Vba,我正在尝试使用Excel VBA UDF函数返回数组。到目前为止,函数要么返回#VALUE!如果我将参数定义为双数组,或者如果我将参数定义为变量(即使我在VBE中的“局部变量”窗口中进行了检查,并且返回的数组变量实际上包含不同的值),那么如果我将参数定义为双数组,或者数组中的所有单元格都具有相同的值,则会出现错误 这是我的密码: Function VaRScenariosTest(ByRef dblRealRates() As Double/Variant) As Double() 'dblRe
Function VaRScenariosTest(ByRef dblRealRates() As Double/Variant) As Double()
'dblRealRates() is defined as either Double or Variant
Dim intCount As Integer
Dim dblTemp() As Double
For intCount = LBound(dblRealRates) To (UBound(dblRealRates) - 1)
ReDim Preserve dblTemp(1 To intCount)
dblTemp(intCount) = dblRealRates(intCount + 1) - dblRealRates(intCount)
Next intCount
VaRScenariosTest = dblTemp
End Function
Function Range2dblArray(ByRef rngRange As Range) As Double()
Dim dblTemp() As Double
Dim intCount As Integer
For intCount = 1 To rngRange.Count
ReDim Preserve dblTemp(1 To intCount)
dblTemp(intCount) = rngRange.Cells(intCount)
Next intCount
Range2dblArray = dblTemp
End Function
我通过以下方式调用电子表格中的函数:
列E包含函数的输入,列F包含函数应返回的值,列G包含函数本身。如果我将dblreallates()变量类型定义为double,则公式将返回#值!错误。如果我将其定义为variant,则电子表格中返回的值是相同的。
如果我在结束函数行暂停代码的执行并查看“局部变量”窗口,您实际上可以看到数组中的值是不同的,并非如电子表格中的输出所示全部等于0.000016287:
有人能告诉我们,当dblRealRates()变量被定义为double时,为什么公式会返回一个错误,如果它被定义为variant,为什么它会返回相同的值?一维数组被视为一行x列的形状,这就是为什么您的值总是相同的。(将为整个结果列指定返回的第一列的值。) 以下代码适用于您的情况(但如果您将内容更改为处理行而不是列,则无疑会出现问题):
或者,在Excel公式本身中对
Range2dblArray
的结果进行转置
{=VaRScenariosTest(TRANSPOSE(Range2dblArray(E2:E21)))}
{=TRANSPOSE(VaRScenariosTest(TRANSPOSE(Range2dblArray(E2:E21))))}
您可以保持原始Range2dblArray
不变,只修改VaRScenariosTest
:
Function VaRScenariosTest(ByRef dblRealRates() As Variant) As Variant()
Dim intCount As Integer
Dim dblTemp() As Double
For intCount = LBound(dblRealRates) To (UBound(dblRealRates) - 1)
ReDim Preserve dblTemp(1 To intCount)
dblTemp(intCount) = dblRealRates(intCount + 1, 1) - dblRealRates(intCount, 1)
Next intCount
VaRScenariosTest = Application.Transpose(dblTemp)
End Function
Function Range2dblArray(ByRef rngRange As Range) As Double()
Dim dblTemp() As Double
Dim intCount As Integer
For intCount = 1 To rngRange.Count
ReDim Preserve dblTemp(1 To intCount)
dblTemp(intCount) = rngRange.Cells(intCount)
Next intCount
Range2dblArray = dblTemp
End Function
还可以将
VaRScenariosTest
的结果转置到Excel公式本身中
{=VaRScenariosTest(TRANSPOSE(Range2dblArray(E2:E21)))}
{=TRANSPOSE(VaRScenariosTest(TRANSPOSE(Range2dblArray(E2:E21))))}
您可以允许VaRScenariosTest
也返回一维数组(但仍需要将dblreallates
作为二维Variant
数组传递到函数中):
根据@YowE3K指南,最终确定以下版本:
Function VaRScenariosTest(ByRef dblRealRates() As Variant) As Variant()
Dim intCount As Integer
Dim dblTemp() As Double
For intCount = LBound(dblRealRates) To (UBound(dblRealRates) - 1)
ReDim Preserve dblTemp(1 To intCount)
dblTemp(intCount) = dblRealRates(intCount + 1) - dblRealRates(intCount)
Next intCount
VaRScenariosTest = Application.Transpose(dblTemp)
End Function
Function Range2Array(ByRef rngRange As Range) As Variant()
Dim varTemp() As variant
Dim intCount As Integer
For intCount = 1 To rngRange.Count
ReDim Preserve varTemp(1 To intCount)
varTemp(intCount) = rngRange.Cells(intCount)
Next intCount
Range2Array = varTemp
End Function
在电子表格中使用时效果很好,只有函数
VarScenariosTest
和数组参数dblreallates()
的数据类型必须更改回double,如果我想在VBA中专门使用,而不是在电子表格中使用,尽管变体版本也可以在这里使用@谢谢你的帮助 是否有理由需要将Range2dblArray
用作自定义项?如果它不需要从Excel单元格中使用,事情会变得更容易,而且我不确定它作为一个独立的Excel函数会有什么用途。如果它也不需要是UDF,那么您可以将Range
传递给VaRScenariosTest
,然后它可以像第一件事一样调用Range2dblArray
。VaRScenariosTest函数是更大计算中的中间步骤,因此,它将采用vba变量作为参数,而不是Range
对象。但是出于测试目的,我希望能够查看所有中间步骤,因此我实现了Range2dblArray
函数,以便能够将Range
对象传递到中间函数中,我想检查中间结果的地方这似乎是为了避免使用“局部变量”窗口来查看中间结果而做的大量工作。这是因为该函数稍后将有更多参数,因此需要测试这些参数的所有可能组合,这些参数可能是100或更多。对于我来说,将参数放在单元格中更容易,只需将公式拖动到相应的单元格中即可。它还允许我更容易地比较这些值。我仍然建议您不要让您的最终代码作为UDF工作。使用一个UDF作为一个简单的包装器,它只调用适当的代码。这样,您只需要担心从Excel数据类型到内部数据类型在一个层上的转换,而不是在每个函数中。我看到您将VaRScenariosTest
的变量类型从Double()
更改为Variant()
,这是否意味着Double()
变量在这种情况下不起作用,即使我应用了换位?我可以在函数的开头引入验证检查来检查维度,以避免从行切换到列时出现问题,反之亦然。另外,您知道函数返回#值的原因吗!dblRealRates()变量定义为double时出错,即使Range2dblArray
函数返回的正是这种类型(一个double
数组)?@vbaenthusist将数组返回到Excel后,Excel将其转换为Variant
,然后将该Variant
数组传递给函数。因为它无法处理转换回Double
,并且崩溃,所以UDF返回一个#值代码>错误(这只是UDF说“我崩溃了,我不告诉你为什么!”)