VBA循环通过UserForm上的按钮

时间:2018-03-01 12:57:10

标签: excel vba excel-vba

我没有使用VBA这么新 - 但所有搜索都没有给我答案

这是一个简单的问题。我在Excel表单中有一组按钮。 按下每个按钮时代码非常相似,对于每个按下的按钮,我希望按钮的颜色可以改变。所以实际上,我对每个按钮都有这样的东西

UserForm2.CommandButton17.BackColor = RGB(255,255,0)

我想通过每个按钮。检查是否按下了,然后相应地设置颜色。

我其实想说点什么

for counter in 1 to 100
if (ispressed((CommandButton & counter )) then

我找到了以下构造:

Dim ctrl as Control
For Each ctrl in UserForm1.Controls
  ctrl.BackColor = RGB(255,0,0)
end for

这种结构有效 - 但我无法弄清楚如何检查按钮是否被按下。

部分答案显示上述构造,ctrl.Value = True 但这些是复选框和单选按钮。我甚至没有按钮的ctrl.Value选项,所以无论如何我都无法使用它

我发现的每个代码示例都掩盖了这个要求。

有人可以提供帮助

3 个答案:

答案 0 :(得分:1)

如果希望它表示状态,请使用ToggleButton而不是CommandButton。

要初始化每个切换按钮的状态,您可以遍历控件。

Dim ctrl As Control
For Each ctrl In Me.Controls
    If TypeName(ctrl) = "ToggleButton" Then
        ctrl.Value = True 'set button state to pressed
    End If
Next ctrl

这会将表单上的每个切换按钮设置为按下状态。

  

请注意,.Value未显示在智能感知框中,因为ctrl类型为Control且没有.Value。如果您需要IntelliSense,那么您可以解决这个问题:

Dim ctrl As Control
For Each ctrl In Me.Controls
    If TypeName(ctrl) = "ToggleButton" Then
        Dim tggl As ToggleButton
        Set tggl = ctrl

        tggl.Value = True
    End If
Next ctrl

//编辑

每次点击切换按钮时,都会触发该按钮的_Click事件。因此,每个按钮都需要这样的事件。

Private Sub ToggleButton1_Click()
    With Me.ToggleButton1
        If .Value = True Then
            .BackColor = RGB(255, 0, 0)
        Else
            .BackColor = -2147483633 'switch to original color
        End If
    End With
End Sub

或者如果你有很多按钮,那就更有效率了

'this procedure handles all buttons
Private Sub ToggleButtonClick(ByRef tggl As ToggleButton)
    With tggl
        If .Value = True Then
            .BackColor = RGB(255, 0, 0)
        Else
            .BackColor = -2147483633 'switch to original color
        End If
    End With
End Sub

'so you just need to call that function on every _Click event
Private Sub ToggleButton1_Click()
    ToggleButtonClick Me.ToggleButton1
End Sub

Private Sub ToggleButton2_Click()
    ToggleButtonClick Me.ToggleButton2
End Sub

但是每个按钮都需要一个_Click()事件来调用该过程。

您还可以评估.Value事件中每个按钮的_Click()状态,以设置/取消设置星号。

答案 1 :(得分:0)

我认为最好的事情是使用事件并拦截按钮 为所有按钮定义Click()事件,如此

'Form variable to define at begin on code
Dim pbPressed as Control
Dim pbLastPressed as Control

Private Sub pbButton(X)_Click()
    'restore previous color only to last pressed 
    Set pbLastPressed.BackColor = RGB(0,0,155)
    Set pbPressed = pbButton(X)

    'assign color-pressed to button pressed
    pbPressed = RGB(255,0,0)
End sub

其中(X)必须替换为1或2或10的数字!

你可以成功,然后获得

Private Sub pbButton1_Click()
    Call ChangeButtonsColor(pbButton1)
End Sub 

Private Sub pbButton2_Click()
    Call ChangeButtonsColor(pbButton2)
End Sub 

Private Sub pbButton3_Click()
    Call ChangeButtonsColor(pbButton3)
End Sub 

Private Sub ChangeButtonsColor(pb as Button)
    'restore previous color only to last pressed 
    Set pbLastPressed.BackColor = RGB(0,0,155)
    Set pbPressed = pb

    'assign color-pressed to button pressed
    pbPressed = RGB(255,0,0)
End sub

不要忘记将其他事件添加为KeyPress(),它可以执行与单击Button相同的操作。

如果您有超过10个按钮,则可以动态创建按钮。

答案 2 :(得分:0)

我建议实现一个名为TglBtn的类

Option Explicit

Private WithEvents m_ToggleButton As MSForms.ToggleButton

Private Sub m_ToggleButton_Click()

    With m_ToggleButton
        If .Value Then
            .BackColor = RGB(255, 255, 0)
        Else
            .BackColor = &H8000000F
        End If
    End With

End Sub

Public Property Set Btn(tb As MSForms.ToggleButton)
    Set m_ToggleButton = tb
End Property

在Userform中,您可以使用以下代码

Option Explicit

Dim mTgBtns As Collection

Private Sub UserForm_Initialize()
Dim sngControl As MSForms.Control
Dim mTglBtn As tglBtn
    Set mTgBtns = New Collection

    For Each sngControl In Me.Controls
        If TypeName(sngControl) = "ToggleButton" Then
            Set mTglBtn = New tglBtn
            Set mTglBtn.Btn = sngControl
            mTgBtns.Add mTglBtn
        End If
    Next sngControl

End Sub

当您点击用户表单上的其中一个togglebuttons时,该类将处理背景颜色。

EDIT 如果要访问Togglebutton的标题,可以将以下属性添加到类

Public Property Get Caption() As String
    Caption = m_ToggleButton.Caption
End Property

EDIT2 作为使用该属性的示例,您可以更改Click事件,如下所示,每次单击MsgBox时都会出现按钮标题

Private Sub m_ToggleButton_Click()

    With m_ToggleButton
        If .Value Then
            .BackColor = RGB(255, 255, 0)
        Else
            .BackColor = &H8000000F
        End If
    End With

    MsgBox "You pressed the button with the caption " & Me.Caption

End Sub