簡體   English   中英

Excel VBA UDF數組函數對所有cel返回相同的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM