2017-02-24 81 views
-1

我正在尝试永久更改用户窗体,以便我只需运行一次代码而不是每次单击按钮以打开用户窗体时都会运行该代码。永久更改用户形式

我发现这适用于某些人。我不确定对我来说可能是错的。

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 

感谢您的任何帮助!

+0

那么,什么是问题? –

+0

顺便说一句,如果代码在窗体的代码隐藏中,放弃'UF'参数并使用'Me',而不是[如昨天告诉](http://stackoverflow.com/a/42421855/1188513)。 'FormatUserForms UFNewRequest'正在发送**默认实例**,它**不一定是当前正在执行的实例**。 –

+2

出于好奇,为什么要更改表单的存储二进制流中的控件属性?动态设置它们会为表单加载增加非常小的开销,并且如果您决定'TextBox'背景颜色需要变得更轻一些,那么它将更加灵活和可维护。 – Comintern

回答

0

你在混合两件事。这是使用ThisWorkbook.VBProject.VBComponents("UFNewRequest").Designer对象的正确轨道,但您没有使用它。相反,您的代码在作为参数传递的表单上工作 - 这只会在运行时才起作用。

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 

您可以调用该函数用于各种形式的项目:

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

我想有使用早期的F结合的方式,但你必须一个参考VBE添加到您的项目,我不能在我的电脑上这样做,所以我无法测试。可能有一个常量定义为魔法类型数字3(=表单)也

+0

我想这是我正在寻找的,尤其是能够调用我的项目上的所有窗体的函数,但设置d = frm.designer给我的错误“对象不支持此属性或方法。”有任何想法吗? – mjcallen

+0

其实,它得到它的工作。太棒了。谢谢! – mjcallen