Найти в Дзене
VBA Excel с нуля

VBA Excel № 92.2. Worksheet. Событие Change. Корректность введенных данных (часть 2).

Скриншот с моего ноутбука
Скриншот с моего ноутбука

Продолжение. Начало в статье №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, переход к следующей ячейке в диапазоне "МойДиапазон".
Скриншот с моего ноутбука
Скриншот с моего ноутбука

Наука
7 млн интересуются