Ребята, всем привет! 👋
Продолжаем изучать VBA. В прошлом уроке мы говорили об ошибке несоответствия типов.
О том, как исправить ошибки несоответствия типов, вызванные вычислением рабочего листа читаем в этом уроке.
✨ А прежде, чем мы начнем 📣 напомню, теперь у нас на канале есть удобный рубрикатор 👉 Быстрый поиск решения. Путеводитель по Excel, а все видео 📽 предыдущих уроков доступны и на YouTube.
🔔 Общее предотвращение ошибок несоответствия
В приведенных ранее примерах мы рассмотрели несколько способов устранения потенциальных ошибок несоответствия в вашем коде, но есть и ряд других способов, хотя они могут быть не самыми лучшими вариантами:
✔️ Определите свои переменные как тип Variant
Тип варианта - это тип переменной по умолчанию в VBA. Если вы не используете оператор Dim для переменной и просто начинаете использовать его в своем коде, то ему автоматически присваивается тип Variant .
Переменная Variant будет принимать данные любого типа, будь то целое число, длинное целое число, число двойной точности, логическое или текстовое значение. Это звучит как замечательная идея, и вы удивляетесь, почему все не просто устанавливают все свои переменные в variant .
Однако тип данных Variant имеет несколько недостатков:
- Во-первых, он занимает гораздо больше памяти, чем другие типы данных. Если вы определите очень большой массив как вариант, он поглотит огромный объем памяти при выполнении кода VBA и может легко вызвать проблемы с производительностью
- Во-вторых, производительность в целом ниже, чем при использовании определенных типов данных. Например, если вы выполняете сложные вычисления с использованием чисел с плавающей десятичной запятой, вычисления будут значительно медленнее, если вы сохраняете числа как варианты, а не числа двойной точности
⚠️ Использование типа Variant считается небрежным программированием, если в этом нет абсолютной необходимости.
✔️ Используйте команду onError для обработки ошибок
Команда onError может быть включена в ваш код для обработки отслеживания ошибок, чтобы в случае возникновения ошибки пользователь видел значимое сообщение вместо стандартного всплывающего окна с ошибкой VBA
Это эффективно предотвращает остановку бесперебойной работы вашего кода из-за ошибки и позволяет пользователю быстро восстановиться после ошибки.
Процедура Err_Handler может отображать дополнительную информацию об ошибке и о том, с кем связаться по этому поводу.
С точки зрения программирования, когда вы используете процедуру обработки ошибок, довольно сложно найти строку кода, в которой ошибка. Если вы выполняете пошаговое выполнение кода с помощью F8, как только выполняется некорректная строка кода, она переходит к процедуре обработки ошибок, и вы не можете проверить, где что-то идет не так.
Решение:
Способ обойти это - настроить глобальную константу, которая имеет значение True или False (логическое значение), и использовать ее для включения или выключения процедуры обработки ошибок с помощью оператора ‘If’.
Когда вы хотите проверить ошибку, все, что вам нужно сделать, это установить для глобальной константы значение False, и обработчик ошибок больше не будет работать.
🔘 Global Const ErrHandling = False
⚠️ Единственная проблема с этим заключается в том, что это позволяет пользователю восстанавливаться после ошибки, но остальная часть кода в подпрограмме не запускается, что может иметь огромные последствия позже в приложении
Используя предыдущий пример перебора диапазона ячеек, код добрался бы до ячейки A5 и обнаружил ошибку несоответствия. Пользователь увидит окно сообщения с информацией об ошибке, но ничего из этой ячейки и далее в диапазоне обрабатываться не будет.
✔️ Используйте команду onError для подавления ошибок
При этом используется команда "При ошибке возобновить следующую". Это очень опасно ⚠️ включать в ваш код, поскольку это предотвращает отображение любых последующих ошибок.
По сути, это означает, что во время выполнения вашего кода, если в строке кода возникает ошибка, выполнение просто перейдет к следующей доступной строке без выполнения строки ошибки и продолжит работу в обычном режиме.
Это может устранить потенциальную ситуацию с ошибкой, но все равно повлияет на все будущие ошибки в коде. Затем вы можете подумать, что ваш код не содержит ошибок, но на самом деле это не так, и части вашего кода делают не то, что, по вашему мнению, он должен делать.
Бывают ситуации, когда необходимо использовать эту команду, например, если вы удаляете файл с помощью команды "Уничтожить" (если файл отсутствует, будет ошибка), но отслеживание ошибок всегда следует снова включать сразу после того, как потенциальная ошибка может возникнуть с помощью:
🔘 On Error Goto 0
В предыдущем примере с циклическим перебором диапазона ячеек с использованием ‘On Error Resume Next’ это позволило бы продолжить цикл, но ячейка, вызывающая ошибку, не будет перенесена в массив, а элемент массива для этого конкретного индекса будет содержать нулевое значение.
✔️ Преобразование данных в тип данных, соответствующий объявлению
Вы можете использовать функции VBA для изменения типа данных входящих данных, чтобы они соответствовали типу данных принимающей переменной.
Вы можете сделать это при передаче параметров функциям.
Например, если у вас есть число, которое хранится в строковой переменной, и вы хотите передать его как число в функцию, вы можете использовать CInt
Существует ряд таких функций преобразования, которые можно использовать, но вот основные из них:
- CInt – преобразует строку с числовым значением (ниже + или – 32 768) в целое значение. Имейте в виду, что при этом все десятичные точки отсекаются
- CLng – преобразует строку с большим числовым значением в длинное целое число. Десятичные точки усекаются.
- CDbl – преобразует строку, содержащую число с плавающей десятичной запятой, в число двойной точности. Включает десятичные точки
- CDate – преобразует строку, содержащую дату, в переменную date. Частично зависит от настроек на панели управления Windows и вашего языка от того, как интерпретируется дата
- CStr – преобразует числовое значение или значение даты в строку
При преобразовании из строки в число или дату строка не должна содержать ничего, кроме чисел или даты. Если присутствуют буквенные символы, это приведет к ошибке несоответствия. Вот пример, который приведет к ошибке несоответствия:
✔️ Тестирование переменных в вашем коде
Вы можете протестировать переменную, чтобы выяснить, к какому типу данных она относится, прежде чем назначать ее переменной определенного типа.
Например, вы можете проверить строку, чтобы увидеть, является ли она числовой, используя функцию ‘IsNumeric’ в VBA
🔘 MsgBox IsNumeric("123test")
Этот код вернет False, потому что, хотя строка начинается с цифровых символов, она также содержит текст, поэтому она не проходит тест.
🔘 MsgBox IsNumeric("123")
Этот код вернет True, поскольку все это числовые символы
В VBA есть ряд функций для тестирования различных типов данных, но это основные из них:
- IsNumeric - проверяет, является ли выражение числом или нет
- IsDate – проверяет, является ли выражение датой или нет
- IsNull - проверяет, является ли выражение нулевым или нет. Значение null может быть введено только в объект variant, в противном случае вы получите сообщение об ошибке ‘Недопустимое использование Null’. Окно сообщения возвращает нулевое значение, если вы используете его, чтобы задать вопрос, поэтому возвращаемая переменная должна быть variant . Имейте в виду, что любое вычисление с использованием нулевого значения всегда возвращает результат null.
- isArray – проверяет, представляет ли выражение массив или нет
- isEmpty - проверяет, является ли выражение пустым или нет. Обратите внимание, что empty - это не то же самое, что null. Переменная пуста, когда она впервые определена, но это не нулевое значение
А на этом сегодня все. 👏 Продолжение следует...
Подписывайтесь на канал, чтобы не пропустить новые уроки и полезные фишки Excel. Следите за нашими новостями и вы узнаете больше о VBA и Excel в частности.
📝 Нам очень важна Ваша обратная связь. Отзыв по уроку и любые вопросы пишите в комментариях.
💝 А если у Вас пока нет вопросов, но вы дочитали данную статью до конца оставьте в комментариях просто смайлик 😉 (автору будет приятно)
И конечно же, за лайк 👍 и репост 🔁 данного поста благодарочка 💖 и респект 🤝 каждому!