VBA循环通过UserForm上的按钮

问题描述 投票:0回答:3

我没有使用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选项,所以无论如何我都不能使用它

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

有人可以帮忙吗

excel vba excel-vba
3个回答
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没有显示在IntelliSense框中,因为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()状态,以设置/取消设置星号。


0
投票

我认为最好的事情是使用事件并拦截Press Button为这样的所有按钮定义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个按钮,则可以动态创建按钮。


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

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

编辑如果要访问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
© www.soinside.com 2019 - 2024. All rights reserved.