在Excel VBA中引用自身的复选框
我有一个excel电子表格,它将单元格的值设置为组中的复选框数。我想为每个宏分配一个宏,如下所示:在Excel VBA中引用自身的复选框,excel,vba,Excel,Vba,我有一个excel电子表格,它将单元格的值设置为组中的复选框数。我想为每个宏分配一个宏,如下所示: Sub clickedBox() If thisBox(or however you would do it).Checked = True Then Range("D9").Value = Range("D9").Value + 1 Else Range("D9").Value = Range("D9").Value - 1 End If
Sub clickedBox()
If thisBox(or however you would do it).Checked = True Then
Range("D9").Value = Range("D9").Value + 1
Else
Range("D9").Value = Range("D9").Value - 1
End If
End Sub
单元格默认为0,所有框默认为未选中。这样,勾选一个方框会增加计数,而取消勾选则会将其击倒一个,它永远不会低于零或高于方框数
我意识到我也应该这样做,当复选框的状态改变时,宏会触发,不仅仅是当它被点击时,而且我想首先确保这是可能的
有没有办法让复选框像那样引用自身?这取决于您是绑定到ActiveX控件还是表单控件。任何一种方法都可以奏效,而且任何一种方法都可能指导如何清晰地实现它 使用ActiveX控件(复选框): 有两个选项可以为ActiveX控件编写“单击处理程序”。第一个是为每个控件硬编码一个公共子控件: 控制
此工作簿.Sheets(“Sheet1”)
:复选框1
Excel对象中的代码Sheet1
:
Private groupCheckBoxCount为整数
专用子复选框1_单击()
Debug.Print“Control on”&Me.Name&“is now”&Me.CheckBox1.Value
注册表checkedValue Me.CheckBox1.Value
端接头
专用子寄存器CHECKEDVALUE(cbVal为布尔值)
如果cbVal=True,则
范围(“CheckBoxCount”)=范围(“CheckBoxCount”)+1'选择存储在工作表上
groupCheckBoxCount=groupCheckBoxCount+1'或在变量中
其他的
范围(“CheckBoxCount”)=范围(“CheckBoxCount”)-1
groupCheckBoxCount=groupCheckBoxCount-1
如果结束
端接头
然后,如果您有十个复选框,那么您将有十个复选框(x)\u单击子项,每个子项都专门绑定到一个ActiveX控件。每个单击处理程序都可以递增或递减存储在工作表单元格(或模块专用变量)中的计数器
第二个选项是创建一个类模块,您可以为任意数量的复选框实例化它
类模块的代码MyCheckBoxClass
Dim WithEvents cbControl As MSForms.CheckBox
Private controlName As String
Public Sub cbControl_Click()
Debug.Print controlName & " is now " & cbControl.Value
If cbControl.Value = True Then
Range("CheckBoxCount") = Range("CheckBoxCount") + 1 'choose to store on the sheet
groupCheckBoxCount = groupCheckBoxCount + 1 'or in a variable
Else
Range("CheckBoxCount") = Range("CheckBoxCount") - 1
groupCheckBoxCount = groupCheckBoxCount - 1
End If
End Sub
Public Sub Attach(newCB As MSForms.CheckBox, newName As String)
Set cbControl = newCB
controlName = newName
End Sub
Private Sub Class_Initialize()
controlName = ""
End Sub
常规代码模块中的代码:
Public groupClickCount As Integer
Private cbCollection As Collection
Public Sub SetUpControlsOnce()
Dim thisCB As MyCheckBoxClass
Dim ctl As OLEObject
Dim cbControl As MSForms.CheckBox
If cbCollection Is Nothing Then
Set cbCollection = New Collection
End If
For Each ctl In ThisWorkbook.Sheets("Sheet1").OLEObjects
If TypeName(ctl.Object) = "CheckBox" Then
'--- this is an ActiveX CheckBox
Set thisCB = New MyCheckBoxClass
thisCB.Attach ctl.Object, ctl.name
cbCollection.Add thisCB
End If
Next ctl
End Sub
使用表单控件(复选框):
虽然有几种方法可以捕获表单复选框的单击事件,但最简单的方法是将组中的所有复选框连接到单个宏:
Public groupClickCount As Integer
Public Sub cbControl_Click()
'--- loop through all the controls on the form and filter for
' only checkboxes, then count up how many are checked
Dim ctl As Shape
Dim checkCount As Integer
checkCount = 0
For Each ctl In ActiveSheet.Shapes
If ctl.Type = msoFormControl Then
On Error Resume Next
If ctl.ControlFormat = xlCheckBox Then
If ctl.ControlFormat.Value = 1 Then
checkCount = checkCount + 1
Else
checkCount = checkCount - 1
End If
End If
End If
Next ctl
Range("CheckBoxCount") = checkCount 'choose to store on the sheet
groupClickCount = checkCount 'or in a variable
End Sub
这两种解决方案都可以通过多种方式进行调整,具体取决于您的需要以及您希望跟踪复选框的方式。复选框在哪里?是在用户窗体上还是在工作表上的ActiveX控件?ActiveX控件,当然是一些,谢谢你的建议!我想我会使用表单控件,只制作一个WinForms应用程序。这正是我想要的。