Ребята, всем привет! 👋
Продолжаем изучать VBA. Сегодня в уроке поговорим об ошибке несоответствия типов.
Ошибка несоответствия часто может возникать при запуске кода VBA. Данная ошибка остановит выполнение вашего кода полностью и отобразит сообщение о том, что эта ошибка требует устранения
В этом уроке рассмотрим:
- Что такое ошибка несоответствия типов
- Ошибка несоответствия типов, вызванная вычислением рабочего листа
- Ошибка несоответствия типов, вызванная введенными значениями ячеек
- Ошибка несоответствия типов, вызванная вызовом функции или подпрограммы с использованием параметров
- Ошибка несоответствия типов, вызванная неправильным использованием функций преобразования в VBA
- Объекты и ошибки несоответствия типов
✨ А прежде, чем мы начнем 📣 напомню, теперь у нас на канале есть удобный рубрикатор 👉 Быстрый поиск решения. Путеводитель по Excel, а все видео 📽 предыдущих уроков доступны и на YouTube.
☑️ Что такое ошибка несоответствия типов?
Обратите внимание, что если вы не полностью протестировали свой код перед распространением пользователям, это сообщение об ошибке будет видно пользователям и приведет к значительной потере доверия к вашему приложению Excel.
К сожалению, пользователи часто делают с приложением очень странные вещи, и часто вы, как разработчик, никогда не рассматривали их.
Ошибка несоответствия типа возникает из-за того, что вы определили переменную с помощью оператора Dim как определенный тип, например, целое число, дата, и ваш код пытается присвоить переменной недопустимое значение, например, текстовая строка, присвоенная целочисленной переменной, как в этом примере:
Например:
▶️ Нажмите на Debug, и нарушающая строка кода будет выделена желтым цветом. Во всплывающем окне ошибки нет опции продолжить, поскольку это серьезная ошибка, и код не может выполняться дальше.
В этом конкретном случае решение состоит в том, чтобы изменить оператор Dim на тип переменной, который работает со значением, которое вы присваиваете переменной. Код будет работать, если вы измените тип переменной на ‘String’, и вы, вероятно, захотите также изменить имя переменной.
⚠️ Для изменения типа переменной потребуется перезагрузка вашего проекта, и вам придется снова запускать код с самого начала, что может быть очень неприятно, если задействована длительная процедура:
☑️ Ошибка несоответствия типов, вызванная вычислением рабочего листа
Приведенный выше пример является очень простым примером того, как может возникнуть ошибка несоответствия, и в этом случае она легко устраняется.
Однако причина ошибок несоответствия обычно намного глубже и не так очевидна, когда вы пытаетесь отладить свой код.
В качестве примера предположим, что вы написали код для получения значения в определенной позиции на листе, и он содержит вычисление, зависящее от других ячеек в книге (B1 в этом примере).
Рабочий лист выглядит так, как показано в этом примере, с формулой для поиска определенного символа в строке текста:
С точки зрения пользователя, ячейка A1 является свободным форматом, и они могут ввести любое значение, которое они хотят. Однако формула ищет вхождение символа ‘B’, и в этом случае он не найден, поэтому ячейка B1 имеет значение ошибки.
Приведенный ниже код выдаст ошибку несоответствия, поскольку в ячейку A1 было введено неверное значение:
Значение в ячейке B1 выдало ошибку, поскольку пользователь ввел текст в ячейку A1, который не соответствует ожидаемому и не содержит символа ‘B’
Код пытается присвоить значение переменной ‘myNumber’, которая была определена так, чтобы ожидать целое число, и поэтому вы получаете ошибку несоответствия.
Решение:
Это один из тех примеров, когда тщательная проверка вашего кода не даст ответа. Вам также нужно посмотреть на листе, откуда берется значение, чтобы выяснить, почему это происходит.
Проблема на самом деле находится на рабочем листе, и формула в B1 нуждается в изменении, чтобы были обработаны значения ошибок. Вы можете сделать это, используя формулу ‘IFERROR’, чтобы предоставить значение по умолчанию 0, если символ поиска не найден
Затем вы можете включить код для проверки нулевого значения и отображения пользователю предупреждающего сообщения о том, что значение в ячейке A1 недопустимо
Результат:
🔔 РЕКОМЕНДАЦИИ:
- Вы также можете использовать проверку данных (группа инструментов данных на вкладке Данные ленты) в электронной таблице, чтобы пользователь не делал все, что ему нравится, и в первую очередь вызывал ошибки на рабочем листе. Разрешайте им вводить только те значения, которые не приведут к ошибкам на рабочем листе.
- Вы можете написать код VBA на основе события изменения на листе, чтобы проверить, что было введено.
- Также заблокируйте и защитите рабочий лист паролем, чтобы нельзя было ввести неверные данные
☑️ Ошибка несоответствия типов, вызванная введенными значениями ячеек
Ошибки несоответствия могут быть вызваны в вашем коде введением обычных значений с рабочего листа (без ошибок), но там, где пользователь ввел неожиданное значение, например, текстовое значение, когда вы ожидали число. Возможно, они решили вставить строку в диапазон чисел, чтобы можно было поместить в ячейку заметку, объясняющую что-то об этом числе. В конце концов, пользователь понятия не имеет, как работает ваш код, и что он только что вывел все из строя, введя свою заметку:
Приведенный ниже пример кода создает простой массив с именем ‘myNumber’, определенный с целочисленными значениями:
Затем код выполняет итерацию по диапазону ячеек от A1 до A17, присваивая значения ячеек в массив, используя переменную ‘Coun’ для индексации каждого значения
Когда код достигает текстового значения, из-за этого возникает ошибка несоответствия, и все останавливается
Нажав на кнопку ‘Отладка’ во всплывающем окне ошибки, вы увидите строку кода, в которой проблема выделена желтым цветом. Наведя курсор на любой экземпляр переменной ‘Coun’ в коде, вы сможете увидеть значение ‘Coun’, в котором произошел сбой кода, которое в данном случае равно 5
Просматривая рабочий лист, вы увидите, что 5-я ячейка вниз имеет текстовое значение, и это привело к сбою кода:
Решение:
Вы можете изменить свой код, введя условие, которое сначала проверяет числовое значение, прежде чем добавлять значение ячейки в массив:
Код использует функцию ‘IsNumeric’, чтобы проверить, действительно ли значение является числом, и если это так, то он вводит его в массив. Если это не число, то оно вводит значение, равное нулю.
Это гарантирует, что индекс массива будет соответствовать номерам строк ячеек в таблице Excel.
Вы также можете добавить код, который копирует исходное значение ошибки и сведения о местоположении в таблицу "Ошибки", чтобы пользователь мог видеть, что он сделал неправильно при запуске вашего кода.
Числовой тест использует полный код для ячейки, а также код для присвоения значения в массив.
Вы можете возразить, что это должно быть присвоено переменной, чтобы не повторять один и тот же код, но проблема в том, что вам нужно будет определить переменную как "вариант", что не самое лучшее.
Вам также потребуется проверка данных на рабочем листе и защита рабочего листа паролем. Это предотвратит вставку пользователем строк и ввод неожиданных данных.
☑️ Ошибка несоответствия типов, вызванная вызовом функции или подпрограммы с использованием параметров
При вызове функции вы обычно передаете параметры функции, используя типы данных, уже определенные функцией. Функция может быть уже определена в VBA, или это может быть пользовательская функция, которую вы создали самостоятельно.
Подпрограмма также может иногда требовать параметров
Если вы не будете придерживаться правил передачи параметров в функцию, вы получите ошибку несоответствия.
Здесь есть несколько возможностей получить ошибку несоответствия
Возвращаемая переменная (Ret) определяется как целое число, но функция возвращает строку. Как только вы запустите код, произойдет сбой, потому что функция возвращает строку, и это не может перейти в целочисленную переменную. Интересно, что запуск отладки в этом коде не обнаруживает эту ошибку.
Если вы заключаете первый передаваемый параметр в кавычки (3), он интерпретируется как строка, которая не соответствует определению первого параметра в функции (целое число)
Если вы преобразуете второй параметр в вызове функции в числовое значение, произойдет сбой с несоответствием, поскольку второй параметр в строке определен как строка (текст).
☑️ Ошибка несоответствия типов, вызванная неправильным использованием функций преобразования в VBA
Существует ряд функций преобразования, которые вы можете использовать в VBA для преобразования значений в различные типы данных.
Примером является ‘CInt’, который преобразует строку, содержащую число, в целое значение.
Если преобразуемая строка содержит какие-либо буквенные символы, вы получите ошибку несоответствия, даже если первая часть строки содержит числовые символы, а остальные - буквенные символы, например ‘123abc’
☑️ Объекты и ошибки несоответствия типов
Если вы используете такие объекты, как диапазон или лист, вы получите ошибку несоответствия во время компиляции, а не во время выполнения, что дает вам должное предупреждение о том, что ваш код не будет работать
Этот код содержит функцию с именем ‘UseMyRange’ и параметр, передаваемый как объект диапазона. Однако передаваемый параметр представляет собой длинное целое число, которое не соответствует типу данных.
Когда вы запускаете код VBA, он немедленно компилируется, и вы увидите это сообщение об ошибке:
Параметр-нарушитель будет выделен синим фоном
Как правило, если вы допускаете ошибки в коде VBA с использованием объектов, вы увидите это сообщение об ошибке, а не сообщение о несоответствии типов:
🔔 О том, как исправить ошибки несоответствия типов, вызванные вычислением рабочего листа читаем в следующем уроке.
А на этом сегодня все. 👏 Продолжение следует...
Подписывайтесь на канал, чтобы не пропустить новые уроки и полезные фишки Excel. Следите за нашими новостями и вы узнаете больше о VBA и Excel в частности.
📝 Нам очень важна Ваша обратная связь. Отзыв по уроку и любые вопросы пишите в комментариях.
💝 А если у Вас пока нет вопросов, но вы дочитали данную статью до конца оставьте в комментариях просто смайлик 😉 (автору будет приятно)
И конечно же, за лайк 👍 и репост 🔁 данного поста благодарочка 💖 и респект 🤝 каждому!