Вопрос по нескольким флажкам запуска кода - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть пользовательская форма и рамка с 35 флажками, пронумерованными от 1 до 35. Они представляют 35 именованных диапазонов.Я проверяю, не установлен ли какой-либо из диапазонов имен, если установлен правильно, значение флажка установлено в TRUE.

Я нашел некоторый код, который позволил бы мне запускать подпрограмму, если щелкнуть один из флажков.Этот код, кажется, работает, но мой контрольный код выше также вызывает события флажка, которые я не хочу.Я хочу, чтобы саб запускался только тогда, когда щелкнул флажок мышью?Я могу опубликовать код, который я использую, но сначала я задам вопрос, чтобы узнать, возможно ли то, что я хотел бы сделать.

Спасибо, Джим

Code in class module:
Public WithEvents ChkBox As MSForms.CheckBox

Public Sub AssignClicks(ctrl As Control)
    Set ChkBox = ctrl
End Sub

Public Sub chkBox_Click()
If chkBoxProcess = "Y" Then
    'ThisWorkbook.Worksheets("Sheet1").Range(ChkBox.Name).Value = Format(Now, "dd.mm.yyyy")
    'MsgBox ("check box number = " & ChkBox.Name & " " & ChkBox.Value)
'    Else
    End If
End Sub


Code in Forms:

Public Sub UserForm_Initialize()
Dim SheetCount, i As Integer
Dim sh As Worksheet
'Public SheetName, SheetName2, StartOldNewTimeA, OldNewTimeAdd As String

'Initialize the form frmChgNameRng
'Set array values of the day options
'Set array values for 12:00 timeframes
'Set array values for 12:30 timeframes
'Set colors used in Checkboxes
'Set array for Checkboxes (boxes are numbered accross the page, 1 corressponds to Mon_1200/Mon_1230, 8 corresponds to Mon_200/Mon_230, etc.)
'Formulas are placed in the time cells on the left of the page, the macro will add the appropriate value into the Mon_1200 time slot and all other cells update off that cell
chkBoxProcess = "N"

Dim ChkBoxes As cls_ChkBox
Dim ctrl As Control

Set colTickBoxes = New Collection

For Each ctrl In Me.Controls
    If TypeName(ctrl) = "CheckBox" Then
        Set ChkBoxes = New cls_ChkBox
        ChkBoxes.AssignClicks ctrl
        colTickBoxes.Add ChkBoxes
    End If
Next ctrl
'..... lots of code for Range Name Checks, etc.
End Sub

1 Ответ

0 голосов
/ 21 декабря 2018

Ваш код сопоставляет состояние управления с данными модели , поэтому единственный способ сообщить ему, что «именованный диапазон 32 включен» или «именованный диапазон 13 выключен»,заключается в изменении состояния флажка, который запускает событие Change этого элемента управления.

Нет никакого способа обойти это, просто как работают элементы управления: они запускают событие Change всякий раз, когда их значение изменяется, независимо от того, какэто сделано.

Вместо того, чтобы иметь состояние элементов управления быть данными, установить состояние элементов управления изменить данные.

Это требует концептуализации этогоdata, first: похоже, вам нужно связать число / индекс с некоторым логическим значением.Массив может сделать это.

Private namedRangeStates(1 To 35) As Boolean

Обратите внимание, что в зависимости от того, что вы делаете, инициализация состояния должна быть осуществлена ​​путем итерации коллекции Names книги в обработчике UserForm_Initialize.Или, лучше, форма могла бы предоставить метод, который принимает массив логических значений и копирует это состояние в namedRangeStates.

Теперь, когда флажок изменен, сделайте так, чтобы он изменил состояние:

Private Sub Checkbox31_Change()
    namedRangeStates(31) = Checkbox31.Value
End Sub

Ваша форма может предоставлять это состояние как свойство:

Public Property Get NamedRangeState(ByVal index As Long) As Boolean
    NamedRangeState = namedRangeStates(index)
End Property

Public Property Let NamedRangeState(ByVal index As Long, ByVal value As Boolean)
    namedRangeStates(index) = value
End Property

И теперь вы можете изменять инкапсулированное состояние независимо от значений в выпадающем списке.

...