我没有使用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
选项,所以无论如何我都不能使用它
我发现的每个代码示例都掩盖了这个要求。
有人可以帮忙吗
如果希望它表示状态,请使用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()
状态,以设置/取消设置星号。
我认为最好的事情是使用事件并拦截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个按钮,则可以动态创建按钮。
我建议像这样实现一个名为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