2017-02-10 14 views
11

Tôi đang cố gắng sử dụng thuộc tính Lớp GetLet trong UserForm được gọi là UBidStatus để điền từ điển có tên DicOption.
Mọi thứ hoạt động tốt cho đến khi dòng If Not DicOption(OptName).Exists (Yêu cầu đối tượng lỗi 404).
LƯU Ý: Mã đang hoạt động nếu tôi thay thế toàn bộ mã trong số Public Property Let theo DicOption.Add key:=OptName, Item:=OptValue.
Đây là mã trong Lớp Userform mà tôi đang cố khắc phục.Sử dụng Dictionary.Exists trong thuộc tính UserForm đang cung cấp đối tượng Error 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

Tôi không thể nhìn thấy lỗi của tôi đề cập đến tài liệu này là gì. Tôi đã thử sử dụng 'DicOption (" OptName "). Exists' nhưng nó cũng không hoạt động. – Gab

+2

Xem ví dụ trong phần "Kiểm tra xem khóa có tồn tại trong từ điển" – Barney

Trả lời

9

tồn tại phương pháp được gọi là như thế này:

Dictionary.Exists(Key) 

Vì vậy, cố gắng

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

Tôi không biết tại sao tôi không thấy điều đó. Cảm ơn ... – Gab

7

Một Scripting.Dictionary ngầm sẽ gọi phương thức Add của nó nếu bạn gán cho một phím không tồn tại , vì vậy nếu mục tiêu là "thêm hoặc thay thế" giá trị tại khóa được chỉ định, bạn có thể chỉ cần thay thế:

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

với:

DicOption.Item(OptName) = OptValue 
+3

Tôi chắc chắn sẽ upvote, nếu câu trả lời này giải thích tại sao kiểm tra 'Exists' là dư thừa. –

+0

@ Mat'sMug, thực sự của tôi "Tại sao" sẽ là "bởi vì tôi đã từng thấy nó hoạt động" !. Tôi có một số _deeper_ cảm giác về điều đó nhưng tôi không thành những thứ như tôi rất biết _you_ được và lời giải thích của tôi có thể sẽ dẫn đến không chính xác trong một số cách này hay cách khác. Vì vậy, tôi giới hạn bản thân mình để một "gợi ý" trong một chủ đề mà đã có một câu trả lời đã được chấp nhận và rất nhiều upvoted – user3598756

+0

@ Mat'sMug Tôi đoán đối tượng từ điển sẽ tự động thêm một khóa mới nếu các phím không tồn tại? – Gab

Các vấn đề liên quan