2016-09-11 65 views
1

我有一個函數,它接受一個數組並輸出另一個數組。其內部比下面的玩具例子更復雜。接受範圍作爲數組參數

Public Function divide_by_2_5(ByRef coeffs() As Double) As Double() 
    Dim Columns As Integer 
    Columns = UBound(coeffs, 2) - LBound(coeffs, 2) + 1 
    Dim output() As Double 
    ReDim output(1 To 1, 1 To Columns) 
    Dim i As Integer 
    For i = 1 To Columns 
     output(1, i) = coeffs(1, i)/2.5 
    Next i 
    divide_by_2_5 = output 
End Function 

這是我看到:

enter image description here

我想在第二排,而不是包含函數的輸出。在這種情況下,那將是0.4, 0.4, 0.4, 0.4

不幸的是,我得到一個#VALUE!錯誤,我不知道如何調試。

一些澄清:顯然有可能有相同的函數返回一個數組或寫入電子表格(與Ctrl - Shift - Enter)。以類似的方式,輸入是來自範圍還是數組?

+0

如果您想要將一系列單元格傳遞給該函數,則需要將傳遞的參數聲明爲Range或Variant。 – YowE3K

+0

您的'ReDim輸出(1,coeffs)'語句應該是'ReDim output(1,columns)'。 – YowE3K

+0

@ YowE3K,謝謝,編輯 – user357269

回答

4
Public Function divide_by_2_5(coeffs As Variant) As Double() 
    Dim v() As Variant 
    If TypeName(coeffs) = "Range" Then 
     v = coeffs.Value 
    Else 
     v = coeffs 
    End If 
    Dim output() As Double 
    ReDim output(LBound(v, 1) To UBound(v, 1), LBound(v, 2) To UBound(v, 2)) 
    Dim r As Long 
    Dim c As Long 
    For r = LBound(v, 1) To UBound(v, 1) 
     For c = LBound(v, 2) To UBound(v, 2) 
      output(r, c) = v(r, c)/2.5 
     Next 
    Next 
    divide_by_2_5 = output 
End Function 

調用此爲UDF的一個例子是:

{=divide_by_2_5(C2:F2)} 

從VBA調用此的一個例子使用範圍可能是:

Dim v As Variant 
v = divide_by_2_5(Worksheets("Sheet1").Range("C2:F2")) 

一個使用數組從VBA調用此示例的示例可能是:

Sub test() 
    Dim x(1, 4) As Variant 
    Dim v As Variant 
    x(1, 1) = 6 
    x(1, 2) = 7 
    x(1, 3) = 8 
    x(1, 4) = 9 
    v = divide_by_2_5(x) 
    MsgBox v(1, 3) 
End Sub 
0

將傳遞的參數更改爲Range變量。

Public Function divide_by_2_5(ByRef inputRange As Range) As Double() 
    Dim output() As Double 
    ReDim output(1 To inputRange.Rows.Count, 1 To inputRange.Columns.Count) As Double 
    Dim r As Long 
    Dim c As Long 
    For r = 1 To inputRange.Rows.Count 
     For c = 1 To inputRange.Columns.Count 
      output(r, c) = inputRange.Cells(r, c).Value/2.5 
     Next 
    Next 
    divide_by_2_5 = output 
End Function 

注:我本來想我可能只是有一個Variant數組傳遞到函數,但是很困惑,因爲我測試使用的

Public Function divide_by_2_5(ByRef x As Variant) As Double() 

,而不是

Public Function divide_by_2_5(ByRef x() As Variant) As Double() 

所以我測試的版本不接受Variant array,只是一個包含Range對象的Variant。然後在我的後續測試代碼中,我成功地訪問了像x(i)這樣的東西,但那不是返回Variant數組的第i個元素 - 它只是返回Range的第i個單元格。

+0

感謝您清理我的代碼。你測試了這個順便說一句嗎?我仍然得到相同的錯誤 – user357269

+0

我測試了類似的東西 - 我可能犯了一個錯誤,將它「翻譯」回你的變量等。給我一秒鐘,我會檢查。 – YowE3K

+0

嘆息 - 這是UBound導致的問題 - 我要刪除我的回答 – YowE3K

0

如果您想D2,E2,F2,G2等於0.4,則需要一個燒毛值傳遞給你的功能,如:

Public Function divide_by_2_5 (ByRef coeff As Range) As Double 
     divide_by_2_5 = coeff.Value/2.5 
End Function 

進行下面的調用:=divide_by_2_5(D1)上D2然後拖動它直到G2。

我覺得一個UDF只能值添加到它的呼叫單元只有

+0

我最初認爲UDF也只能對單個單元格起作用,但如果它可以實際輸出到多個單元格作爲數組公式輸入。 – YowE3K

+0

你是對的。我從來沒有聽說過,直到現在。 – suisgrand

+0

我學會了更多的東西,只是試圖回答SO問題,而不是我在使用Excel的年份和年份。 – YowE3K