我正在創建一個用戶表單,它將不同的資訊集收集到不同的字典中進行處理。字典在用戶表單模塊級別宣告,并在激活用戶表單時在另一個程序中初始化。為了簡化我的代碼,我有一個將專案插入適當字典的子例程。我已將 Microsoft Scripting Runtime 添加到 VBA 參考這里是代碼示例
在用戶表單模塊宣告處
Option Explicit
Option Compare Text
Dim Ref_Dict, Client_Dict, Service_Dict As Scripting.Dictionary
字典在同一模塊的另一個程序中初始化。該模塊在表單激活時被呼叫。激活模塊的一部分是
Set Ref_Dict = New Scripting.Dictionary
Set Client_Dict = New Scripting.Dictionary
Set Service_Dict = New Scripting.Dictionary
這是將專案插入適當字典的程序
Private Sub Update_Dict(ByRef Dict As Scripting.Dictionary, ByVal Item As Variant, ByVal Key As Variant)
Dict(Key) = Item
End Sub
上述程序是從 Textbox 或 ComboBox _AfterUpdate 程序中呼叫的(視情況而定),例如
Private Sub ComboBox_1_AfterUpdate()
Dim Item, Key As Variant
Item = Me.ComboBox_1.Value
Key = "Name"
Update_Dict Ref_Dict, Item, Key
End Sub
在 ComboBox_1 中輸入值會引發錯誤“ByRef 引數型別不匹配。
但是,如果我在常規模塊中復制相同的場景,它會完美運行。請問我做錯了什么?
uj5u.com熱心網友回復:
您是典型 VBA 陷阱的受害者。
正如羅里在評論中所寫,當你寫
Dim Ref_Dict, Client_Dict, Service_Dict As Scripting.Dictionary
您僅宣告Service_Dict為字典。其他兩個變數宣告為Variant. 由于 aVariant可以包含任何內容(任何資料型別),因此您可以像在激活例程中那樣為其分配一個字典物件。
但是,Variant持有字典與字典不同,因此您會收到“型別不匹配”錯誤。
易于糾正,為所有變數提供資料型別:
Dim Ref_Dict As Scripting.Dictionary, Client_Dict As Scripting.Dictionary, Service_Dict As Scripting.Dictionary
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/432095.html
