在UserForm属性中使用Dictionary.Exists需要提供Error 404对象

Gab*_*Gab 11 excel vba dictionary excel-vba

我正在尝试使用类属性GetLet在一个被调用的UserForm UBidStatus中填充一个名为的字典DicOption.
一切正常,直到该If Not DicOption(OptName).Exists行(需要错误404对象).
注意:如果我替换Public Property Letby中的整个代码,代码工作正常DicOption.Add key:=OptName, Item:=OptValue.
这是我试图解决的Userform类中的代码.

'Userform Class Module
Private DicOption As scripting.Dictionary

Public Property Get ProjectOption(ByVal OptName As String) As String
    ProjectOption = UBidStatus.ProjectOption(OptName)
End Property

Public Property Let ProjectOption(ByVal OptName As String, ByVal OptValue As String)
    If Not DicOption(OptName).Exists Then
        DicOption.Add key:=OptName, Item:=OptValue
    Else
        DicOption(OptName) = OptValue
    End If
End Property

Public Sub UserForm_Initialize()
    Set DicOption = New scripting.Dictionary
End Sub

Private Sub UserForm_Terminate()
    Set DicOption = Nothing
End Sub

Public Sub ExchangeToDicOption()
    Dim LR As Long
    Dim Rg As Range
    Dim ws As Worksheet
    Dim i As Long
    Dim a As String
    Dim b As String

    Set ws = ActiveWorkbook.Worksheets(2)
    Set Rg = ws.Columns(2)

    DicOption.RemoveAll

    LR = Rg.Find(What:="*", Lookat:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False).Row

    If LR > 1 Then
        For i = 2 To LR
            a = Cells(i, 1)
            b = Cells(i, 2)
           UBidStatus.ProjectOption(a) = b
        Next i
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

Sgt*_*ens 10

Exists方法的调用方式如下:

Dictionary.Exists(Key)
Run Code Online (Sandbox Code Playgroud)

所以试试吧

 Public Property Let ProjectOption(ByVal OptName As String, ByVal OptValue As String)
    If Not DicOption.Exists(OptName) Then
        DicOption.Add key:=OptName, Item:=OptValue
    Else
        DicOption(OptName) = OptValue
    End If
End Property
Run Code Online (Sandbox Code Playgroud)


use*_*756 7

如果分配给不存在的键,A Scripting.Dictionary将隐式调用其Add方法,因此如果目标是"添加或替换"指定键的值,则可以简单地替换:

If Not DicOption(OptName).Exists Then
    DicOption.Add key:=OptName, Item:=OptValue
Else
    DicOption(OptName) = OptValue
End If
Run Code Online (Sandbox Code Playgroud)

有:

DicOption.Item(OptName) = OptValue
Run Code Online (Sandbox Code Playgroud)

  • 如果这个答案解释了为什么"存在"检查是多余的,我肯定会投票. (3认同)