簡體   English   中英

Excel VBA UDF-無法將UDF產生的變量數組作為第二個UDF中的輸入傳遞

[英]Excel VBA UDF - Fail to pass a variant array resulting from UDFas an input in second UDF

我正在努力使用我編寫的UDF產生的數組作為另一個UDF的參數。

該函數返回#value錯誤。

我不知道問題出在哪里。

下面是代碼。

任何幫助/建議將不勝感激;)

這個作品..

Function fTA_GetSMA(ByRef varData As Variant, ByRef lPeriod As Long) As Variant

' This function computes a simple moving average over a defined period.

Dim l As Long
Dim dSum As Double
Dim var() As Variant

    Application.Volatile
    varData = varData.Value2
    ReDim var(LBound(varData, 1) To UBound(varData, 1), 1)
    For l = LBound(varData, 1) To UBound(varData, 1)
        If l < lPeriod Then
            dSum = dSum + varData(l, 1)
        ElseIf l = lPeriod Then
            dSum = dSum + varData(l, 1)
            var(l, 1) = dSum / lPeriod
        ElseIf l > lPeriod Then
            dSum = dSum + varData(l, 1) - varData(l - lPeriod, 1)
            var(l, 1) = dSum / lPeriod
        End If
    Next l
    fTA_GetSMA = var

結束功能

這個也可以。

函數fTA_GetTR(ByRef varData As Variant)As Variant'此函數計算財務時間序列的真實范圍。 輸入的數據必須是包含O,H,L,C的矩陣。

Dim var() As Variant
Dim l As Long
Dim dMaxTR As Double
Dim dMinTR As Double

    Application.Volatile
    varData = varData.Value2
    ReDim var(LBound(varData, 1) To UBound(varData, 1), 1)
    For l = LBound(varData, 1) To UBound(varData, 1)
        If l = 1 Then
            dMinTR = varData(l, 3)
            dMaxTR = varData(l, 2)
        ElseIf l > 1 Then
            dMaxTR = Application.WorksheetFunction.Max(varData(l, 2), varData(l - 1, 4))
            dMinTR = Application.WorksheetFunction.Min(varData(l, 3), varData(l - 1, 4))
        End If
        var(l, 1) = dMaxTR - dMinTR
    Next l

    fTA_GetTR = var

結束功能

這是一個不起作用的..

函數fTA_GetATR(ByRef varData為變體,ByRef lPeriod為長)作為變體'此函數計算給定期間內金融時間序列的平均真實范圍。 “輸入數據必須是包含O,H,L,C的矩陣。”平均公式是SMA

Dim var() As Variant
Dim varATR() As Variant

    ReDim var(LBound(varData, 1) To UBound(varData, 1), 1)
    ReDim varATR(LBound(varData, 1) To UBound(varData, 1), 1)
    var = fTA_GetTR(varData)
    varATR = fTA_GetSMA(var, lPeriod)
    Debug.Print varATR
    fTA_GetATR = varATR

結束功能

如果Var包含范圍引用,則只能使用VarData.Value2:如果VarData是變量數組,則它將不起作用。
您的UDF希望將Range參數作為輸入(因為您使用.Value2),但是返回包含數組的變量。 因此,當您使用其他UDF的輸出調用其中之一時,由於輸入不是范圍,因此它會失敗。
您可以通過設置一個斷點並顯示Locals窗口來檢查Var變量包含的內容來檢測到這一點。
解決這個問題的方法是做這樣的事情

if IsObject(VarData) then VarData=VarData.Value2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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