Продолжение. Начало в статье №91.1
Взглянем на скриншот ниже, где выделен жёлтым цветом диапазон, обозначенный как "МойДиапазон" и охватывающий ячейки с координатами ("B2: D10").
На листе, в данном случае, "Лист1", реализован обработчик событий Worksheet_Change, который гарантирует, что пользователь вводит целые числа в пределах от 1 до 10 в указанном диапазоне "МойДиапазон". В данном обработчике, отказано в использовании свойства EnableEvents в пользу статической переменной "ПрерватьПроцесс".
Давайте же скорее напишем код, который очень похож на процедуру из прошлой статьи, но с некоторыми изменениями:
Обратите внимание, что функция «ПроверкаВвода» (без изменений с прошлой статьи) также находится в модуле «Лист1».
И вот мы подошли к самому «вкусному» - разберу кода, пошагово:
1. Private Sub Worksheet_Change(ByVal Target As Excel.Range)
- - Объявление событийной процедуры, которая автоматически срабатывает при изменении содержимого листа Excel, к которому привязана эта процедура (в данном случае, лист "Лист1").
2. StaticПрерватьПроцесс As Boolean
- - Объявление статической переменной ПрерватьПроцесс типа Boolean. Статическая переменная сохраняет свое значение между вызовами процедуры.
3. Dim Объект As Range, cell As Range
- - Объявление двух переменных типа Range: Объект и cell.
4. Dim Msg As String
- - Объявление переменной Msg типа String, которая будет использоваться для формирования сообщения об ошибке.
5. DimКодПроверки As Variant
- - Объявление переменной КодПроверки типа Variant, которая будет содержать результат выполнения функции ПроверкаВвода.
6. IfПрерватьПроцесс Then Exit Sub
- - Проверка значения переменной ПрерватьПроцесс. Если она равна True, то процедура завершается.
7. SetОбъект = Range("МойДиапазон")
- - Установка значения переменной Объект как диапазона с именем "МойДиапазон".
8. If Intersect(Объект, Target) Is Nothing Then Exit Sub
- - Проверка, произошли ли изменения в диапазоне "МойДиапазон". Если изменений нет, процедура завершается.
9. For Each cell In Intersect(Объект, Target)
- - Начало цикла For Each, в котором переменная cell принимает значения каждой ячейки в пересечении диапазона "МойДиапазон" и цели изменений (Target).
10. КодПроверки = ПроверкаВвода(cell)
- - Вызов функции ПроверкаВвода для проверки содержимого текущей ячейки.
11. If TypeName(КодПроверки) = "String" Then
- - Проверка типа результата проверки. Если тип строки, то значит, что произошла ошибка ввода.
12. Msg = "Ячейка " & cell.Address(False, False) & ":"
- - Формирование сообщения об ошибке, содержащего адрес текущей ячейки.
13. Msg= Msg& vbCrLf& vbCrLf& КодПроверки
- - Добавление к сообщению ошибка, возвращенная функцией ПроверкаВвода.
14. MsgBox Msg, vbCritical, "Некорректный ввод"
- - Отображение окна сообщения с информацией об ошибке.
15. ПрерватьПроцесс = True
- - Установка переменной ПрерватьПроцесс в True для предотвращения бесконечного цикла.
16. cell.ClearContents
- - Очистка содержимого текущей ячейки.
17. cell.Activate
- - Активация текущей ячейки.
18. ПрерватьПроцесс = False
- - Сброс переменной ПрерватьПроцесс в False после коррекции ошибки, чтобы снова разрешить обработку событий.
19. Next cell
- - Завершение цикла For Each, переход к следующей ячейке в диапазоне "МойДиапазон".