2017-02-24 2 views
-1

Ich versuche, ein UserForm dauerhaft zu ändern, so dass ich den Code nur einmal ausführen muss, anstatt jedes Mal ausgeführt zu werden, wenn auf die Schaltfläche zum Öffnen von UserForm geklickt wird.Benutzerformulare dauerhaft ändern

Ich fand, dass dies für einige Leute funktioniert. Ich bin mir nicht sicher, was für mich falsch sein könnte.

Sub FormatUserForms(UF As UserForm) 

UF.BackColor = RGB(51, 51, 102) 
Dim ctrl As Control 

With ThisWorkbook.VBProject.VBComponents("UFNewRequest").Designer 
    For Each ctrl In UF.Controls 
     Select Case TypeName(ctrl) 
      Case "Label" 
       ctrl.BackColor = RGB(51, 51, 102) 
       ctrl.ForeColor = RGB(247, 247, 247) 
      Case "CommandButton" 
       ctrl.BackColor = RGB(247, 247, 247) 
       ctrl.ForeColor = RGB(0, 0, 0) 
      Case "TextBox" 
       ctrl.BackColor = RGB(247, 247, 247) 
       ctrl.ForeColor = RGB(0, 0, 0) 
      Case "OptionButton" 
       ctrl.BackColor = RGB(51, 51, 102) 
       ctrl.ForeColor = RGB(247, 247, 247) 
     End Select 
    Next 
End With 
End Sub 

Sub formatting() 

FormatUserForms UFNewRequest 

End Sub 

Vielen Dank für jede Hilfe zu diesem Thema!

+0

Also, was ist die Frage? –

+0

BTW, wenn dieser Code im Code-Behind des Formulars ist, löschen Sie den 'UF' Parameter und verwenden Sie stattdessen' Me', [wie Sie gestern gesagt wurden] (http://Stackoverflow.com/a/42421855/1188513). 'FormatUserForms UFNewRequest' sendet ** die Standardinstanz **, was ** nicht unbedingt die Instanz ist, die gerade ausgeführt wird **. –

+2

Nur aus Neugier, warum möchten Sie die Steuerelementeigenschaften in dem gespeicherten binären Stream des Formulars ändern? Sie dynamisch zu setzen fügt dem Formularladen sehr minimalen Aufwand hinzu und ist *** way *** flexibler und wartbarer, wenn Sie sich entscheiden, dass die TextBox-Hintergrundfarbe ein paar Nuancen heller sein soll. – Comintern

Antwort

0

Sie mischen zwei Dinge. Es ist der richtige Weg, um das Objekt ThisWorkbook.VBProject.VBComponents("UFNewRequest").Designer zu verwenden, aber Sie verwenden es nicht. Stattdessen arbeitet Ihr Code mit dem Formular, das als Parameter übergeben wurde. Dies funktioniert nur zur Laufzeit.

Sub FormatUserForm(frm As Object) 

Dim d As UserForm 
Set d = frm.Designer 

d.BackColor = RGB(51, 51, 102) 

Dim ctrl As Control 
For Each ctrl In d.Controls 
    Select Case TypeName(ctrl) 
      (...) 
    End Select 
Next ctrl 

End Sub 

Sie können für alle Formen an Ihrem Projekt die Funktion aufrufen:

Dim f As Object 
For Each f In ThisWorkbook.VBProject.VBComponents 
    If f.Type = 3 Then 
     Call FormatUserForm(f) 
    End If 
Next f 

Ich denke, es ist ein Weg, früh zu verwenden für f-Bindung, aber Sie haben einen Verweis auf VBE hinzufügen, um Ihre Projekt und ich darf dies nicht auf meinem Computer tun, damit ich nicht testen kann. Wahrscheinlich gibt es eine Konstante definiert für die magische Zahl 3 (= Formulare) auch

+0

Ich denke, das ist, was ich suche, vor allem die Möglichkeit, die Funktion für alle Formulare auf meinem Projekt aufzurufen, aber Set d = frm.designer gibt mir den Fehler "Objekt unterstützt diese Eigenschaft oder Methode nicht." Irgendwelche Ideen? – mjcallen

+0

Wirklich, habe es zur Arbeit gebracht. Dies ist perfekt. Vielen Dank! – mjcallen