我没有使用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
选项,所以无论如何我都无法使用它
我发现的每个代码示例都掩盖了这个要求。
有人可以提供帮助
答案 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