Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 使用UserForm属性中的Dictionary.Exists时,给出了错误404所需的对象_Vba_Excel_Dictionary - Fatal编程技术网

Vba 使用UserForm属性中的Dictionary.Exists时,给出了错误404所需的对象

Vba 使用UserForm属性中的Dictionary.Exists时,给出了错误404所需的对象,vba,excel,dictionary,Vba,Excel,Dictionary,我试图在名为UBidStatus的用户表单中使用类属性Get和Let来填充名为dioption的字典 一切正常,直到If Not dict选项(OptName).存在行(需要错误404对象)。 注意:如果我将公共属性Let中的整个代码替换为dioption,则代码正常。添加键:=OptName,项:=OptValue 这是我试图修复的Userform类中的代码 'Userform Class Module Private DicOption As scripting.Dictionary Pu

我试图在名为
UBidStatus
的用户表单中使用类属性
Get
Let
来填充名为
dioption
的字典
一切正常,直到
If Not dict选项(OptName).存在
行(需要错误404对象)。
注意:如果我将
公共属性Let
中的整个代码替换为
dioption,则代码正常。添加键:=OptName,项:=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

Exists方法的调用方式如下:

Dictionary.Exists(Key)
所以试试看

 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

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

If Not DicOption(OptName).Exists Then
    DicOption.Add key:=OptName, Item:=OptValue
Else
    DicOption(OptName) = OptValue
End If
与:


我看不出引用此文档时有什么错误。我尝试使用
dioption(“OptName”)。存在
,但它也不起作用。请参阅“检查字典中是否存在键”一节下的示例。如果这个答案解释了
存在的原因,我肯定会投赞成票。@Mat'sMug,我真正的“为什么”应该是“因为我曾经发现它有效”!。我对此有更深的感受,但我不喜欢你喜欢的东西,我的解释可能会以某种方式不正确。因此,我把自己局限于一个“建议”的话题,在这个话题上,有一个已经被接受并被大量投票的人answer@Mat“自鸣得意,我想字典对象会自动添加一个新的键,如果键还不存在的话?是的,正是这种更深层次的感觉。”mine@SgtStens,它必须是uu,因为
Add()
方法将尝试添加重复项,而
Item()
方法强制
如果存在,则更新引擎盖下的Else add
DicOption.Item(OptName) = OptValue