VBA: инициировать событие в элементе управления формой

Я работаю над WBS в Excel с флажками.

У меня есть следующее:

[checkbox1] Уровень A
---------[checkBox2] элемент 1
---------[checkBox3] элемент 2
[checkbox4] Уровень B
---------[checkBox5] пункт 3

Когда я снимаю флажок2, он помещает X в ячейку рядом с элементом 1. Если я отмечаю флажок2, он удаляет X.

Если я сниму флажок1, он снимет флажок2 и флажок3, но не поставит X в ячейку рядом с элементом 1 и 2. Он просто снимает два флажка, не вызывая событие. Как связать это событие с checkBox1?

Если невозможно вызвать такое событие в элементе управления формами, мои другие вопросы будут заключаться в том, чтобы узнать, как узнать строку и столбец, где установлен флажок в элементе управления ActiveX?

В Form Control мы можем использовать sheets("sheet1").checkboxes(application.caller), но это не работает в ActiveX Control.

Код для флажка2 или флажка3:

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

Код для флажка1:

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

person Mich    schedule 29.12.2015    source источник


Ответы (1)


Ответ изменен после разъяснений.

Я думаю, что нет событий для элементов управления формой. И AFAIK получить ячейку, где будет элемент управления 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
person ZygD    schedule 29.12.2015
comment
Спасибо за Ваш ответ. Мой вопрос, возможно, ввел в заблуждение, извините за это. Что я ищу, так это то, что если я снимаю флажок 1, X появляется в строке, где находятся флажки 2 и 3. - person Mich; 30.12.2015
comment
И извините за некоторые ошибки в коде, это не весь мой код, поэтому я сократил его, и после форматирования в нем была опечатка. - person Mich; 30.12.2015
comment
Спасибо за ответ! - person Mich; 31.12.2015