VBA:在窗体控件中触发一个事件

我正在使用checkbox在Excel中创buildWBS。

我有以下几点:

[checkbox1] A级
——— [checkBox2]项目1
——— [checkBox3]项目2
[checkbox4] B级
——— [checkBox5]项目3

当我把checkbox2取消的时候,它会在项目1旁边的单元格中放入一个X如果我勾选了checkbox2,它将删除X.

如果我不勾选checkbox1,它将取消勾选checkbox2和checkbox3,但是它不会在项目1和2旁边的单元格中放置一个X.它只是在不触发事件的情况下剔除两个checkbox。 如何将该事件链接到checkBox1?

如果在表单控件中不能触发这种事件,我的其他问题是知道如何知道ActiveX控件中checkbox的行和列?

在Form Control中,我们可以使用sheets("sheet1").checkboxes(application.caller) ,但是这在ActiveX控件中不起作用。

checkbox2或checkbox3的代码:

 Sub CheckBoxLine() Dim ws As Worksheet Dim chk As CheckBox Dim lColD, myCol As Long Dim lColChk As Long Dim lRow As Long Dim rngD As Range lColD = 1 'number of columns to the right Set ws = ActiveSheet Set chk = ws.CheckBoxes(Application.Caller) lRow = chk.TopLeftCell.Row lColChk = chk.TopLeftCell.Column Set rngD = ws.Cells(lRow, lColChk + lColD) Select Case chk.Value Case 1 'box is checked rngD.Value = "X" Case Else 'box is not checked rngD.Value = "X" End Select End Sub 

checkbox1的代码:

 Select Case chk.Value Case 1 'box is checked For Each cb In ws.CheckBoxes If cb.Name = "Check box 2" Then cb.Value = 1 End If If cb.Name = "Check box 3" Then cb.Value = 1 End If Next cb Case Else 'box is not checked For Each cb In ws.CheckBoxes If cb.Name = "Check box 2" Then cb.Value = 0 End If If cb.Name = "Check box 3" Then cb.Value = 0 End If Next cb End Select 

澄清后的答复已更改。

我认为没有forms控制的事件。 而AFAIK获取ActiveX控件所在的单元格有点复杂。 我已经在我的工作簿中完成了它,但是它需要一些额外的Class模块中的代码,我不记得如何实现它。

由于您使用表单控件checkbox,我认为使用下面的代码会更容易,而不是使用新创build的ActiveXcheckbox中的事件。 我希望它能按需要工作。

 Option Explicit Dim ws As Worksheet Sub CheckBoxLine(Optional strChkName As String) Dim chk As CheckBox Dim lColD, myCol As Long Dim lColChk As Long Dim lRow As Long Dim rngD As Range lColD = 1 'number of columns to the right If ws Is Nothing Then Set ws = ActiveSheet If strChkName = vbNullString Then Set chk = ws.CheckBoxes(Application.Caller) Else Set chk = ws.CheckBoxes(strChkName) End If lRow = chk.TopLeftCell.Row lColChk = chk.TopLeftCell.Column Set rngD = ws.Cells(lRow, lColChk + lColD) Select Case chk.Value Case 1 'box is checked rngD.Value = vbNullString Case Else 'box is not checked rngD.Value = "X" End Select Set chk = Nothing Set ws = Nothing End Sub Sub Code_for_Checkbox1() Set ws = ActiveSheet ws.CheckBoxes("Check Box 2").Value = ws.CheckBoxes(Application.Caller).Value ws.CheckBoxes("Check Box 3").Value = ws.CheckBoxes(Application.Caller).Value Call CheckBoxLine("Check Box 2") Call CheckBoxLine("Check Box 3") End Sub