Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Excel VBA UDF数组函数为所有CEL返回相同的值_Arrays_Excel_User Defined Functions_Vba - Fatal编程技术网

Arrays Excel VBA UDF数组函数为所有CEL返回相同的值

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

我正在尝试使用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
我通过以下方式调用电子表格中的函数:

列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说“我崩溃了,我不告诉你为什么!”)