[英]Excel VBA - User Defined Function - converting array related formula (CTRL + SHIFT + ENTER on a normal formula) to a UDF
[英]Excel VBA UDF Array function returns the same value for all cels
我正在尝试使我的Excel VBA UDF函数返回一个数组。 到目前为止,该函数要么返回#VALUE! 如果我将参数定义为双精度数组,或者即使我在VBE中的“本地”窗口中检查了返回数组变量实际上包含不同的值的情况下,即使将参数定义为变量,则将数组中的所有单元格都具有相同的值,也会发生错误。
这是我的代码:
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
我通过以下方式在电子表格中调用该函数: 在excel中使用dblRealRates()作为Double / Variant进行函数调用
E列包含函数的输入,F列包含函数应返回的值,G列包含函数本身。 如果将dblRealRates()变量类型定义为double,则该公式将返回#VALUE! 错误。 如果我将其定义为变体,则电子表格中的返回值相同。 如果我在“结束功能”行中暂停执行代码,并查看“局部变量”窗口,则实际上可以看到数组中的值是不同的,并非全部等于0.000016287,这是电子表格中的输出所提示的: 局部变量中的函数数组值窗口
有人可以告诉我为什么当dblRealRates()变量定义为double时,该公式为什么会返回错误;如果将其定义为variant,为什么它会返回相同的值?
一维数组被视为由x列整形为一行,因此这就是为什么您的值总是相同的原因。 (为整个结果列分配了返回的第一列的值。)
以下代码适用于您的情况(但是,如果您将内容更改为在行而不是列上工作,无疑会出现问题):
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 Variant()
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 = Application.Transpose(dblTemp)
End Function
或者,通过在Excel公式本身中对Range2dblArray
的结果进行转置
{=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
并通过在Excel公式本身中对VaRScenariosTest
的结果进行转置
{=TRANSPOSE(VaRScenariosTest(TRANSPOSE(Range2dblArray(E2:E21))))}
您可以允许VaRScenariosTest
还返回一维数组(但仍然需要将dblRealRates
作为二维Variant
数组传递给函数):
Function VaRScenariosTest(ByRef dblRealRates() As Variant) As Double()
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 = 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
最终根据@ 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
在电子表格中使用时效果很好,并且如果我想仅在VBA中使用而不是在电子表格中使用,则只有变量VarScenariosTest
和数组参数dblRealRates()
的数据类型必须改回两倍,尽管变体版本也可以使用这里也是。 @ YowE3K谢谢您的帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.