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

VBA:在窗体控件中触发事件,vba,excel,checkbox,form-control,Vba,Excel,Checkbox,Form Control,我正在Excel中使用复选框处理WBS 我有以下资料: [复选框1]A级 ---------[复选框2]项目1 ---------[复选框3]第2项 [复选框4]B级 ---------[复选框5]项目3 当我取消选中复选框2时,它将在项目1旁边的单元格中放置一个X 如果我勾选复选框2,它将删除X 如果我取消选中复选框1,它将取消选中复选框2和复选框3,但它不会在项目1和2旁边的单元格中放置X。它只是解除两个复选框的锁定,而不会触发事件。如何将该事件链接到checkBox1 如果无法在表单控件中

我正在Excel中使用复选框处理WBS

我有以下资料:

[复选框1]A级
---------[复选框2]项目1
---------[复选框3]第2项
[复选框4]B级
---------[复选框5]项目3

当我取消选中复选框2时,它将在项目1旁边的单元格中放置一个X 如果我勾选复选框2,它将删除X

如果我取消选中复选框1,它将取消选中复选框2和复选框3,但它不会在项目1和2旁边的单元格中放置X。它只是解除两个复选框的锁定,而不会触发事件。如何将该事件链接到checkBox1

如果无法在表单控件中触发此类事件,我的其他问题是如何知道复选框所在的行和列 在ActiveX控件中

在表单控件中,我们可以使用
工作表(“sheet1”)。复选框(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

澄清后,答案有所改变

我认为表单控件没有事件。要想得到ActiveX控件所在的单元格有点复杂。我已经在我的一本工作手册中完成了,但是它需要在一个附加的类模块中包含一些代码,我不记得如何实现它

由于使用表单控件复选框,我认为使用以下代码比使用新创建的ActiveX复选框中的事件更容易。我希望它能像你需要的那样工作

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

澄清后,答案有所改变

我认为表单控件没有事件。要想得到ActiveX控件所在的单元格有点复杂。我已经在我的一本工作手册中完成了,但是它需要在一个附加的类模块中包含一些代码,我不记得如何实现它

由于使用表单控件复选框,我认为使用以下代码比使用新创建的ActiveX复选框中的事件更容易。我希望它能像你需要的那样工作

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

谢谢你的回答。我的问题可能有误导性,很抱歉。我要寻找的是,如果我取消选中复选框1,复选框2和3所在的行中会出现“X”。很抱歉,代码中出现了一些错误,这不是我的全部代码,所以我缩短了它,在格式化后它有一些打字错误谢谢你的回答!谢谢你的回答。我的问题可能有误导性,很抱歉。我要寻找的是,如果我取消选中复选框1,复选框2和3所在的行中会出现“X”。很抱歉,代码中出现了一些错误,这不是我的全部代码,所以我缩短了它,在格式化后它有一些打字错误谢谢你的回答!