我試圖開發一個數組作爲輸入函數。但是,我收到了#VALUE!
錯誤。功能碼是如下:VBA - 錯誤數組雙作爲函數參數
Function foo(x() As Double) As Double
foo = x(1) + x(2)
End Function
該呼叫被用下面的公式完成的:
=foo($E$8:$E$9)
E8和E9對應於兩個數字。
我的代碼有什麼問題?
我試圖開發一個數組作爲輸入函數。但是,我收到了#VALUE!
錯誤。功能碼是如下:VBA - 錯誤數組雙作爲函數參數
Function foo(x() As Double) As Double
foo = x(1) + x(2)
End Function
該呼叫被用下面的公式完成的:
=foo($E$8:$E$9)
E8和E9對應於兩個數字。
我的代碼有什麼問題?
$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,你將需要檢查的尺寸,該範圍內的數據類型,在你的代碼。
Upvoted,但在此代碼中進行的隱式轉換和隱式默認成員調用的數量是......可怕的。 –
@ Mat'sMug同意。 'foo = rng(1)+ rng(2)'部分僅僅是爲了證明OP代碼的垂直首次問題是參數數據類型。只要使用'Range'作爲輸入,就必然需要處理尺寸,數據類型等來提供一些有用的東西。 – cyboashu
我建議使用一個變量作爲參數:更高效,更容易出錯
Function foo(x As Variant) As Double
x=x.value2
foo = x(1, 1) + x(2, 1)
End Function
對不起......如何使用遲綁定成員調用,隱式轉換和隱式默認成員調用比使用早期綁定的'Range'更有效? UDF在這裏顯然被賦予了一個'Range'。當你是一個綠色的編碼器,不知道引擎蓋下發生的所有事情時,失去智能感知可能是一個壞主意。 –
忘記添加轉換 - 通常將範圍轉換爲變體數組要比對範圍對象進行多次調用要快得多。同樣,它更容易推廣代碼來處理常量數組和子表達式參數等。 –
同意,使用變體二維數組絕對是一種好方法(如果不是最好的) - 但如果使用了「Variant」參數,則會變得具有誤導性函數真的只能用於'Variant/Range' - 我想用'Range'來代替,並且讓數組成爲局部變量,而不是重新分配參數,這會通過引用隱式傳遞,因此在常規VBA中使用UDF代碼會在調用代碼中產生意想不到的後果;可能是一個相當混亂的運行時*類型不匹配*。 –
從內存怎麼回事少...不過我想你可能會及彼一個二維數組,而不是一維數組的你正在期待。 –