2017-08-25 46 views
0

我試圖開發一個數組作爲輸入函數。但是,我收到了#VALUE!錯誤。功能碼是如下:VBA - 錯誤數組雙作爲函數參數

Function foo(x() As Double) As Double 
    foo = x(1) + x(2) 
End Function 

該呼叫被用下面的公式完成的:

=foo($E$8:$E$9) 

E8和E9對應於兩個數字。

我的代碼有什麼問題?

+1

從內存怎麼回事少...不過我想你可能會及彼一個二維數組,而不是一維數組的你正在期待。 –

回答

4

$E$8:$E$9的類型是Range而不是Double類型的數組。你的UDF在那裏失敗。


一旦你改變你的參數類型,以Range那麼它將只要你通過2X1(2Rows,1Column)與數值範圍x(1) + x(2)工作。

Function foo(rng As Range) As Double 
    foo = rng(1) + rng(2) 
End Function 

要做出有意義的UDF,你將需要檢查的尺寸,該範圍內的數據類型,在你的代碼。

+1

Upvoted,但在此代碼中進行的隱式轉換和隱式默認成員調用的數量是......可怕的。 –

+2

@ Mat'sMug同意。 'foo = rng(1)+ rng(2)'部分僅僅是爲了證明OP代碼的垂直首次問題是參數數據類型。只要使用'Range'作爲輸入,就必然需要處理尺寸,數據類型等來提供一些有用的東西。 – cyboashu

0

我建議使用一個變量作爲參數:更高效,更容易出錯

Function foo(x As Variant) As Double 
    x=x.value2 
    foo = x(1, 1) + x(2, 1) 
    End Function 
+0

對不起......如何使用遲綁定成員調用,隱式轉換和隱式默認成員調用比使用早期綁定的'Range'更有效? UDF在這裏顯然被賦予了一個'Range'。當你是一個綠色的編碼器,不知道引擎蓋下發生的所有事情時,失去智能感知可能是一個壞主意。 –

+0

忘記添加轉換 - 通常將範圍轉換爲變體數組要比對範圍對象進行多次調用要快得多。同樣,它更容易推廣代碼來處理常量數組和子表達式參數等。 –

+0

同意,使用變體二維數組絕對是一種好方法(如果不是最好的) - 但如果使用了「Variant」參數,則會變得具有誤導性函數真的只能用於'Variant/Range' - 我想用'Range'來代替,並且讓數組成爲局部變量,而不是重新分配參數,這會通過引用隱式傳遞,因此在常規VBA中使用UDF代碼會在調用代碼中產生意想不到的後果;可能是一個相當混亂的運行時*類型不匹配*。 –