Добрый день, коллеги. Столкнулся с такой странной, вроде бы, проблемой. По мотивам вот этой темы Как отследить изменения Чекбокса ? набросал простенькую форму На форме - SpinButton, два Checkbox'а и Label.
Суть модельки - показать, как можно сохранять и отображать историю чекбоксов при переходе от одного значения спина к другому. Чекбоксы привязаны к ячейкам через ControlSource. При изменении SpinButton происходит замена ControlSource у чекбокса (номер строки задается спином), и проверяется - если ячейка ControlSource пустая, то чекбокс устанавливается False. При инициализации формы чекбоксы устанавливаются в False, спин = 1
Запускаем форму. Первая строка отрабатывается нормально. Щелкаем спин, переходим к другой строке. Первый чекбокс отрабатывает нормально, второй становится в положение triplestate - затененная галочка. Повторяем - картина та же, первый чекбокс и его ControlSource исправно принимает значение False на пустых ячейках, второй - по-прежнему игнорирует попытки вразумить его и ControlSource Идем по спину в обратном направлении - всё отрабатывает замечательно, второй чекбокс срабатывает как надо - пустой заполняется False, если ранее был установлен - так же отлавливает.
Выгружаем форму, запускаем ее в ручном пошаговом режиме - все работает нормально. Такое ощущение, что код "проскальзывает", по какой-то причине не успевая отработать изменения двух чекбоксов сразу. Менял порядок строк в коде, давало обратные эффекты (пролетал мимо первый вместо второго), но стабильной работы добиться не удалось. Устраивал проверку не только на "", но и на Null, и на Empty - ничего.
Что это может быть за причина и как с этим бороться? Встречался с подобными проблемами и в других формах.
код тут
Код
Dim SubIni As Boolean
Private Sub SpinButton1_Change()
If SubIni Then Exit Sub
Dim sp%
sp = Me.SpinButton1.Value
Cells(sp, 1) = sp
Me.Label1.Caption = "Строка " & sp
Me.CheckBox1.ControlSource = Cells(sp, 2).Address
Me.CheckBox2.ControlSource = Cells(sp, 3).Address
If Cells(sp, 2).Value = "" Then Me.CheckBox1.Value = False
' при пошаговом проходе строка ниже отрабатывается нормально
' при автоматическом - пролетает мимо при первом проходе
If Cells(sp, 3).Value = "" Then Me.CheckBox2.Value = False
End Sub
Private Sub UserForm_Initialize()
Me.Label1.Caption = "Строка 1"
Me.CheckBox1.ControlSource = Cells(1, 2).Address
Me.CheckBox2.ControlSource = Cells(1, 3).Address
SubIni = True
Range(Cells(1, 1), Cells(50, 3)).ClearContents
Cells(1, 1) = 1
SpinButton1.Value = 1
Me.CheckBox1.Value = False
Me.CheckBox2.Value = False
SubIni = False
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Unload Me
End Sub
Причина, по-видимому, в задержке обработки ячеек ControlSource, а именно при попытке поместить туда новое значение чекбокса (False) - первая проходит, остальные стопорятся. Как бороться - 2 варианта: 1) после каждого присвоения значения связанному с ячейкой чекбоксу юзать DoEvents; 2) присваивать программно значение не чекбоксу, а ячейке-источнику.