2017-02-23 1 views
1

ich ein öffentliches globales Dictionary-Objekt in einem regulären Modul wie folgt deklarierte:Globale Wörterbuch Objekt Erreichbar von einer Userform

Public dicModels As Scripting.Dictionary 'Microsoft Scripting Runtime has been added as a reference 

Ich habe folgenden Rückruf:

Sub CreatePPT_OnAction(control As IRibbonControl) 
    Call CurrentBooks 
    Dim frmPPT_Slide As FPowerPoint 
    Set frmPPT_Slide = New FPowerPoint 
    frmPPT_Slide.Show 
    Set frmPPT_Slide = Nothing 
End Sub 

Hier mein Unterprogramm für die ist Call-Verfahren:

Sub CurrentBooks() 
    Dim wks As Excel.Worksheet 
    Dim vObject As Variant 

    If Not dicModels Is Nothing Then Exit Sub 

    Set dicModels = New Dictionary 
    For Each wks In ActiveWorkbook.Worksheets 
     For Each vObject In wks.ListObjects 
      If Left(vObject.Name, 3) = "TM_" Then 
      dicModels.Add Key:=vObject.Name, Item:=Right(vObject.Name, Len(vObject.Name) - InStr(1, vObject.Name, "_")) 
      End If 
     Next vObject 
    Next wks 

End Sub 

Hier ist mein Initialize-Ereignis in der Userform (iCounter ist ein Modulebene Variable als private deklariert):

Private Sub UserForm_Initialize() 
    Me.Caption = "Main Tracking Model" 
    Me.lblModel.Caption = "Choose a model to be reflected on the PPT slide." 
    For iCounter = 0 To dicModels.Count '<< ERROR!!!!! 
     Me.lstModels.AddItem dicModels.Items(iCounter) 
    Next iCounter 
End Sub 

Ich versuche, ein globales Wörterbuch-Objekt zu erstellen zugänglich von der Userform Klasse. Obwohl ich es auf der Modulebene veröffentlicht habe, bekomme ich immer noch Object variable or With block variable not set. Ich muss etwas falsch verstehen oder übersehen. Jede Hilfe wird geschätzt. Vielen Dank!

+0

In ' CurrentBooks verwenden Sie 'Set dicModels = New Dictionary'. Der Code, wie er hier in der Frage steht, sollte funktionieren, oder zumindest sollten die 'dicModels' nicht' Nothing' sein. Es soll sein, dass etwas geschieht, was wir hier nicht sehen und was das Dik setzt. zu "Nichts"? Und eine Frage: Der Code von 'UserForm_Initialize' gehört zum 'FPowerPoint'-Recht? – dee

+0

@dee Ja, der Code in 'UserForm_Initialize' gehört zu' FPowerPoint'. Offensichtlich setzt etwas das dic-Objekt auf "Nichts". Sonst stimmt etwas mit meinem Umfang nicht. Ich werde mehr Debugging durchführen. – Brian

Antwort

1

schreiben wie folgt:

Public dicModels As New Scripting.Dictionary 

Diese beiden deklariert die Variable und initialisiert es zu einem neuen Dictionary.


Diese Initialisierung kann zusammen mit der Deklaration durchgeführt werden. Wenn die Initialisierung komplexer ist, dann sind Sie wahrscheinlich besser dran, nicht die Variable öffentlich erklärt, sondern eine öffentliche Funktion haben, die den Wert der Variablen zurückgibt und jede Initialisierung führt bei Bedarf:

Dim m_dicModels As Scripting.Dictionary 

Public Function dicModels() As Scripting.Dictionary 
    If m_dicModels Is Nothing Then 
     Set m_dicModels = New Scripting.Dictionary 
     m_dicModels.CompareMode = TextCompare 
    End If 
    Set dicModels = m_dicModels 
End Function 
+0

Vielen Dank für die Lösung, aber ich kann es nicht zur Arbeit bringen. Wenn das Benutzerformular initialisiert wird, kann ich nicht auf die Eigenschaft "count" des Objekts "dictionary" zugreifen. Das Wörterbuch ist nicht "nichts". Warum kann ich daher nicht auf eines der Mitglieder des Ereignisses userform initialize zugreifen? – Brian

Verwandte Themen