2017-02-10 41 views
11

我试图在名为UBidStatus的用户窗体中使用Class属性GetLet来填充名为DicOption的字典。
一切正常,直到If Not DicOption(OptName).Exists行(错误404对象需要)。
注意:如果我用DicOption.Add key:=OptName, Item:=OptValue替换Public Property Let中的整个代码,代码正在工作。
这是我正在尝试修复的Userform类中的代码。在UserForm属性中使用Dictionary.Exists会给出错误404对象所需的

'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 
+3

http://stackoverflow.com/documentation/vbscript/8232/dictionary-objects#t=201702101504303204093 – Barney

+0

我不能看到什么是我的错误指的这个文件。我尝试使用'DicOption(“OptName”)。存在'但它也没有奏效。 – Gab

+2

请参阅“检查密钥是否存在于字典”一节下的示例 – Barney

回答

9

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 
+0

我不知道为什么我没有看到它。谢谢... – Gab

7

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

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

有:

DicOption.Item(OptName) = OptValue 
+3

如果这个答案解释了为什么'Exists'检查是多余的,我肯定会赞成。 –

+0

@ Mat'sMug,我真正的“为什么”会是“因为我曾经发现它有效”!我对此有一些_deeper_的感觉,但我没有注意到事情,因为我很清楚_you_,我的解释可能会导致不正确的方式。所以我把自己限制在一个主题中的“建议”,其中有一个已经被接受并且高度赞成的答案 – user3598756

+0

@ Mat'sMug我猜如果密钥不存在,字典对象会自动添加一个新密钥? – Gab