【问题标题】:Formatting User Form Controls格式化用户表单控件
【发布时间】:2017-07-14 06:16:32
【问题描述】:

我正在尝试对每个用户表单上的控件进行类似的格式化,但是我对用户表单上的所有控件进行了格式化,而不仅仅是标签或文本框。

这是我所拥有的:

Private Sub UserForm_Initialize()

FormatUserForms UFNewRequest

End Sub

Sub FormatUserForms(UF As UserForm)

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

For Each Label In UF.Controls
    Label.BackColor = RGB(51, 51, 102)
    Label.ForeColor = RGB(247, 247, 247)
Next

For Each Button In UF.Controls
    Button.BackColor = RGB(247, 247, 247)
    Button.ForeColor = RGB(0, 0, 0)
Next

For Each TextBox In UF.Controls
    TextBox.BackColor = RGB(247, 247, 247)
    TextBox.ForeColor = RGB(0, 0, 0)
Next

End Sub

这种做我想要的,但每个 For Each 都会覆盖最后一个。有没有办法在用户表单中描述控件以便它们不被覆盖?

另外,每次我打开然后关闭我的用户表单时,我都会收到“内存不足”错误。对此的帮助也将不胜感激!谢谢。

【问题讨论】:

    标签: vba foreach formatting controls userform


    【解决方案1】:

    您正在循环所有控件 3 次,因此每次调用都会更改所有控件的颜色。命名变量Textbox 不会仅过滤文本框的控件。 您必须使用TypeName(ctrl) 分隔控件类型:

    For Each ctrl In u.Controls
        If TypeName(ctrl) = "TextBox" Then
            ctrl.BackColor = ...
        ElseIf TypeName(ctrl) = "Label" Then
            ctrl.BackColor = ...
        Else
            ...
        End If
    next ctrl
    

    据我所知,这仅在表单打开时才有效,因此将对您的函数的调用放入UserForm_Initialize-Event。

    【讨论】:

      【解决方案2】:

      我没有检查,但“内存不足”错误很可能与在其自己的Initialize 过程中使用UserForm 的默认实例有关:

      FormatUserForms UFNewRequest
      

      您不应该这样做(也不需要这样做)。您始终可以使用Me 在其代码隐藏中获取对表单的引用。我会完全删除它。至于控件,您可以调用TypeName 来确定它是什么类型的控件,然后使用Select Case 进行相应的格式化:

      Private Sub UserForm_Initialize()
          FormatUserForms
      End Sub
      
      Sub FormatUserForms()
          Me.BackColor = RGB(51, 51, 102)
          Dim current As Control
      
          For Each current In Me.Controls
              Select Case TypeName(current)
                  Case "Label"
                      current.BackColor = RGB(51, 51, 102)
                      current.ForeColor = RGB(247, 247, 247)
                  Case "CommandButton"
                      current.BackColor = RGB(247, 247, 247)
                      current.ForeColor = RGB(0, 0, 0)
                  Case "TextBox"
                      current.BackColor = RGB(247, 247, 247)
                      current.ForeColor = RGB(0, 0, 0)
          Next
      End Sub
      

      【讨论】:

      • 谢谢。看来 TypeName 和 Select Case 是我解决此问题所需要的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2018-08-18
      相关资源
      最近更新 更多