Обнаружение изменений в флажках через VBA - PullRequest
1 голос
/ 17 июня 2009

Исходя из моего предыдущего вопроса.

Требование клиента - установить флажки в отчете, чтобы отключить строки информации на другом листе. Строки определены как именованные диапазоны, отформатированные P_XXXXXX. XXXXXX - это уникальный идентификатор, который также является полем в строке, поэтому я могу легко генерировать имена диапазонов на лету.

У меня проблема:

  • После нажатия на элементы и закрытия формы Excel спрашивает, хотим ли мы сохранить. Это нежелательно.

Мне нужно как-то зарегистрировать событие изменения, происходящее в моих сгенерированных флажках. Так что, если одно или несколько изменений я могу просмотреть и скрыть / показать соответствующие диапазоны.

Мой код для добавления флажков выглядит так:

        ' For each row...

        ' check box in column 17(=Q).
        Dim lCenter As Long
        lCenter = rngCurrent.Width / 4 ' not actual centre but close enough
        With ActiveSheet.CheckBoxes.Add(rngCurrent.Left + lCenter, rngCurrent.Top - 2, rngCurrent.Width, rngCurrent.Height)
            .Interior.ColorIndex = xlNone
            .Caption = ""
        End With

Так как связать изменение в флажке с подчиненной функцией / функцией?

Ответы [ 2 ]

6 голосов
/ 17 июня 2009

Установите для свойства OnAction объекта Checkboxes имя подпрограммы, которую вы хотите запускать каждый раз, когда флажок установлен или снят.

Sub MakeCB()

    With ActiveSheet.CheckBoxes.Add(ActiveCell.Left + 0, ActiveCell.Top - 2, ActiveCell.Width, ActiveCell.Height)
        .Interior.ColorIndex = xlNone
        .Caption = ""
        .OnAction = "CheckboxChange"
    End With

End Sub

Sub CheckboxChange()

    MsgBox "change"

End Sub
1 голос
/ 17 июня 2009

Я не думаю, что есть какие-либо события, доступные с элементом управления Excel.Checkbox. Попробуйте вместо этого использовать флажок MSForms. Вам понадобится ссылка на «Библиотеку объектов Microsoft Forms 2.0» - ее нельзя распространять, но если вы используете VBA, то это нормально.

Затем вы можете сделать что-то подобное и обработать событие обычным способом:

''class level
Private WithEvents m_Checkbox as MSForms.CheckBox

Public Sub MakeCheckbox()
    Set m_Checkbox = Activesheet.OLEObjects.Add("Forms.Checkbox.1")
End Sub

Private Sub m_Checkbox_Click()
    ''Do stuff
End Sub

Очевидно, что таким способом вы сможете обрабатывать только определенное количество флажков - я бы рекомендовал создать класс для хранения каждого флажка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...