這是我第一次使用默認成員上課,我仍然對它有一些感覺。我有一個 let / get 屬性資料:
class ArrayClass
private D as variant
Property Get data() As Variant
data = D
End Property
Property Let data(arg1 As Variant)
D = arg1
End Property
我在我的 .cls 檔案中添加了以下內容(使用記事本)以使資料成為默認引數,如下所示:
Property Get data() As Variant
Attribute data.VB_UserMemId = 0
data = D
End Property
我只是在測驗它,看看它使用“D”陣列的效果如何:
Dim testArray As ArrayClass
Dim passArray(5, 1) As Variant
passArray(0, 0) = 1
passArray(1, 0) = 2
passArray(2, 0) = 3
passArray(3, 0) = 4
passArray(4, 0) = 5
passArray(5, 0) = 6
passArray(0, 1) = 7
passArray(1, 1) = 8
passArray(2, 1) = 9
passArray(3, 1) = 10
passArray(4, 1) = 11
passArray(5, 1) = 12
Set testArray = new ArrayClass
testArray = passArray
testArray(1, 1) = 5
Debug.Print testArray(2, 1)
它“大部分”有效。“testArray = passArray”呼叫“Let Data”屬性,并將 passArray 分配給物件內部的引數“D”。
此外,“Debug.Print testArray(2,1)”也有效。這將呼叫“獲取資料”屬性,并回傳物件中“D”引數的索引值 2,1。
我的問題是“testArray(1,1) = 5”指令。目的是將 1,1 索引分配給引數 D 和數字 5。但發生的是它呼叫“獲取資料”屬性,而不是“讓資料”屬性。
需要明確的是,我并不是真的期望它能起作用,因為我還不確定該怎么做。但是我不知道為什么它呼叫“get property”而不是“let property”是因為指令在等號的左側。
有人對如何讓它發揮作用有任何想法嗎?謝謝。
uj5u.com熱心網友回復:
您遇到的是標準 VBA 行為。
該行testArray(1,1) = 5首先制作陣列的副本D(實際上是呼叫Get),然后將值 5 分配給新/副本陣列的 1,1 索引。
您只能呼叫Let傳遞單個值,因為這是您定義的期望值:
Property Let data(arg1 As Variant)
D = arg1
End Property
你不能呼叫它testArray(1,1)因為它傳遞了 2 個值。顯然,您明確表示您打算只更新內部陣列的一個成員,但通過該屬性D根本不可能。Let
您可以做的是定義一個需要 3 個引數的新屬性:
Property Let item(ByVal index1 As Long, ByVal index2 As Long, ByVal newValue As Variant)
D(index1, index2) = newValue
End Property
并呼叫它testArray.item(1, 1) = 5或將此新屬性定義為默認值。
考慮宣告D為一個陣列——就目前而言,你可以傳遞任何東西,例如testArray = "test"我認為不是你想要的東西。因此,也許將其宣告為Private D() As Variant然后更新data屬性以接收并回傳 Variant 型別的陣列:
Property Get data() As Variant()
data = D
End Property
Property Let data(arg1() As Variant)
D = arg1
End Property
uj5u.com熱心網友回復:
我能夠按照我想要的方式弄清楚如何做到這一點。秘密是在我的 Get / Let 屬性的輸入欄位中使用引數陣列。
Property Let data(ParamArray sizes() As Variant, data As Variant)
end property
Property Get data(ParamArray sizes() As Variant) As Variant
Attribute data.VB_UserMemID = 0 'This line makes the data property the default property.
'It is Only visible/editable in .cls file opened in text editer
end property
所以事實證明 let 屬性有兩種不同型別的輸入引數,一個“arglist”和一個值。串列中的最后一個引數是您的值(并且是等號右邊的數字)。但是由于 VBA(以及我所知的所有其他語言)要求如果您使用可選輸入,那么它右側的所有輸入也必須是可選的,包括值輸入。
但是,如果您使用 ParamArray,則 VBA 知道哪些引數是輸入,哪些是值,從而使您能夠在 let 屬性上擁有可選輸入。我對這些屬性的所有輸入都是可選的。然后我只使用 if 陳述句根據輸入值的數量映射我應該輸出的內容。
所以現在我可以使用與類外陣列完全相同的語法在類內訪問我的陣列引數:
passArray(0, 0) = 1
passArray(1, 0) = 2
passArray(2, 0) = 3
passArray(0, 1) = 4
passArray(1, 1) = 5
passArray(2, 1) = 6
testArray = passArray
Debug.Print testArray(2, 1) 'returns 6
testArray(2, 1) = 7.5
Debug.Print testArray(2, 1) 'returns 7.5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/534685.html
標籤:VBA特性
上一篇:帶階乘的VBASigma公式
下一篇:自動選擇資料風險分類為內部
