Операторы сравнения чисел и строк, ссылок на объекты (Is) и строк по шаблону (Like), использующиеся в VBA Excel. Их особенности, примеры вычислений.
Операторы сравнения чисел и строк
Операторы сравнения чисел и строк представлены операторами, состоящими из одного или двух математических знаков равенства и неравенства:
- < – меньше;
- <= – меньше или равно;
- > – больше;
- >= – больше или равно;
- = – равно;
- <> – не равно.
Синтаксис:
1 |
Результат = Выражение1 Оператор Выражение2 |
- Результат – любая числовая переменная;
- Выражение – выражение, возвращающее число или строку;
- Оператор – любой оператор сравнения чисел и строк.
Если переменная Результат будет объявлена как Boolean (или Variant), она будет возвращать значения False и True. Числовые переменные других типов будут возвращать значения 0 (False) и -1 (True).
Операторы сравнения чисел и строк работают с двумя числами или двумя строками. При сравнении числа со строкой или строки с числом, VBA Excel сгенерирует ошибку Type Mismatch (несоответствие типов данных):
1 2 3 4 5 6 7 8 9 10 |
Sub Primer1() On Error GoTo Instruk Dim myRes As Boolean 'Сравниваем строку с числом myRes = "пять" > 3 Instruk: If Err.Description <> "" Then MsgBox "Произошла ошибка: " & Err.Description End If End Sub |
Сравнение строк начинается с их первых символов. Если они оказываются равны, сравниваются следующие символы. И так до тех пор, пока символы не окажутся разными или одна или обе строки не закончатся.
Значения буквенных символов увеличиваются в алфавитном порядке, причем сначала идут все заглавные (прописные) буквы, затем строчные. Если необходимо сравнить длины строк, используйте функцию Len.
1 2 3 |
myRes = "семь" > "восемь" 'myRes = True myRes = "Семь" > "восемь" 'myRes = False myRes = Len("семь") > Len("восемь") 'myRes = False |
Оператор Is – сравнение ссылок на объекты
Синтаксис:
1 |
Результат = Объект1 Is Объект2 |
- Результат – любая числовая переменная;
- Объект – переменная со ссылкой на любой объект.
Если обе переменные Объект1 и Объект2 ссылаются на один и тот же объект, Результат примет значение True. В противном случае результатом будет False.
1 2 3 4 5 6 7 |
Set myObj1 = ThisWorkbook Set myObj2 = Sheets(1) Set myObj3 = myObj1 Set myObj4 = Sheets(1) myRes = myObj1 Is myObj2 'myRes = False myRes = myObj1 Is myObj3 'myRes = True myRes = myObj2 Is myObj4 'myRes = True |
По-другому ведут себя ссылки на диапазоны ячеек. При присвоении ссылок на один и тот же диапазон нескольким переменным, в памяти создаются уникальные записи для каждой переменной.
1 2 3 4 5 |
Set myObj1 = Range("A1:D4") Set myObj2 = Range("A1:D4") Set myObj3 = myObj1 myRes = myObj1 Is myObj2 'myRes = False myRes = myObj1 Is myObj3 'myRes = True |
Оператор Like – сравнение строк по шаблону
Синтаксис:
1 |
Результат = Выражение Like Шаблон |
- Результат – любая числовая переменная;
- Выражение – любое выражение, возвращающее строку;
- Шаблон – любое строковое выражение, которое может содержать знаки подстановки.
Строка, возвращенная аргументом Выражение, сравнивается со строкой, возвращенной аргументом Шаблон. Если обе строки совпадают, переменной Результат присваивается значение True, иначе – False.
1 2 3 4 |
myRes = "восемь" Like "семь" 'myRes = False myRes = "восемь" Like "*семь" 'myRes = True myRes = "Куда идет король" Like "идет" 'myRes = False myRes = "Куда идет король" Like "*идет*" 'myRes = True |
Со знаками подстановки для оператора Like вы можете ознакомиться в статье Знаки подстановки для шаблонов.
Добрый день, знающие подскажите.
Сравниваю два списка ТМЦ. Раскладываю каждое ТМЦ на слова (Split) в переменную в одном списке, сравниваю с каждым словом другого списка, при максимальном количестве совпадений засчитываю общее совпадение ТМЦ.
Использую оператор Like. Сравниваю две переменные.
If temp(x) Like SKU(y) Then
point = point + 1
Но в переменную SKU(у) попадают слова ТМЦ с кавычками.
Варианты: *SKU(у)*; «*SKU(у)*» не работают.
Подскажите.
Здравствуйте, Евгений!
Если нужно, чтобы кавычки добавились вокруг SKU(у):
или, чтобы кавычки добавились вокруг temp(x):
Как раз наоборот, в переменную sku(y) попадают кавычки; их и надо игнорировать.
Как с переменной использовать знаки подстановки?
Как раз наоборот, необходимо игнорировать кавычки в переменной, с помощью знаков подстановки для шаблонов.
temp(x) = стол
sku(y) =»стол
Сравнивая эти переменные будет ложь.
temp(x) like ?sku(y) заменить кавычку используя знак вопроса?
Евгений, знаки подстановки могут увеличить количество символов в строке, а не уменьшить. Добавьте еще одну переменную, например, skutemp, чтобы записывать в нее слова без кавычек:
Или убирайте кавычки перед разбивкой фразы на слова.
Добрый день,
я записываю команду
Debug.Print x = "text" Like "t*"
и даже
Debug.Print x = "text" Like "text"
и все время выдает False.
Этот оператор не всегда работает?
Добрый день, Александр!
Здесь либо так:
либо так:
Спасибо,
а как маску добавлять к переменной?
Вопрос не понял, но если надо шаблон применить к тексту в переменной, тогда так:
Спасибо,
еще такой вопрос несколько не по теме. Просто срочно нужно разобраться.
Есть ли в ячейках эксела пустые значения, которые могут восприниматься как числа, скажем нули? И где можно почитать как с этим бороться?
В «пустой» ячейке общего формата содержится значение «Empty», которое записывается в числовую переменную как нуль, в текстовую — как пустая строка. Если вы хотите, чтобы в «пустых» ячейках содержалась пустая строка, присвойте этим ячейкам текстовый формат. Это можно сделать вручную или программно:
Это, если ячейки будут заполняться позже. Если ячейки уже заполнены, чтобы текстовый формат к ним применился, их нужно перезаписать:
Я столкнулся с той проблемой, что ко мне приходит в экселе числовой массив большого размера. В нем есть пустые ячейки и нули, иногда ошибки с текстовыми значениями. Для дальнейшей обработки я хотел эту таблицу ячеек загнать в массив, так как иначе очень долго считает и мне не нужно изменять исходную таблицу. Я не определял тип массива, так как если ставить числовой, то загнать из таблицы экселя сходу в массив данные не получается, выдает ошибку. Когда же я строю на основании этого массива другой массив, того же типа Variant получается, что игнорируются нули, хотя в первом array они нормально воспринимались как нули типа Double. При переходе от одного массива к другому возникает какая-то другая интерпретация. А если есть еще промежуточные вспомогательные массивы, то вообще наступает каша. Нужен какой-то простой принцип, как следить за типом данных, и не давать машине заменять нули, «», Empty как ей вздумается.
Могу предложить перезаписывать изначальный массив в текстовый:
Разместите в диапазоне «A1:A10» разные значения, которые могут встретиться в вашей таблице. В диапазон «B1:B10» запишутся все значения, прошедшие преобразование в текст. В диапазон «C1:C10» запишутся только текстовые значения, которые интерпретируются как числа.
Спасибо, буду думать.
а нуль я так понимаю Double воспринимает как Empty? Я даже когда 0 пытаюсь перезаписать в другую ячейку того же массива, он превращает его в Empty.
Это потому что у вас массив As Variant. Если вам не нужны в массиве строки, можете изначальный массив перезаписать в массив As Double, в нем нуль всегда будет нулем:
Правда, и строки станут нулями, но их можно преобразовать в какие-то значения, не встречающиеся в таблице:
Спасибо,
да я тоже подумал, что нужно для отсутствующих значений взять какое-то большое отрицательное число.
В принципе можно при создании новых массивов прописывать каждый раз условие проверки. Тогда получается создавать правильные массивы.
Подскажите, пожалуйста, еще такой момент. Не смог быстро хелп найти.
Как правильно объявлять переменные в событиях форм если они связаны с процедурами модулей? Они всегда должны быть Public? Или можно как-то ограничить использование их только определенным модулем и формой?
Если хотите, чтобы переменная была доступна только в модуле, где она расположена, объявите ее перед первой процедурой с помощью ключевого слова Dim или Private. Чтобы переменная была доступна и в других модулях проекта, объявите ее с помощью ключевого слова Public.
Это понятно. Я хотел спросить, где доступны переменные, которые объявляются в процедурах форм? Вот если я ввожу переменную в процедуре нажатия кнопки в форме, я ведь могу сделать кнопу в форме и без всякого модуля.
Вопрос:
«Я хотел спросить, где доступны переменные, которые объявляются в процедурах форм?»
Ответ:
Переменные, объявленные в процедуре, доступны только в этой процедуре, независимо от модуля, в котором эта процедура размещена.
Ко второй части:
У кнопки на форме нет своего модуля, а процедура ее нажатия размещается в модуле этой формы. Процедура нажатия кнопки ActiveX, созданной на рабочем листе, размещается в модуле этого листа.
Еще, если можно такой вопрос.
если я задаю одномерный массив как динамический, то программа без проблем его расширяет, но если я задаю двумерный, она пишет, что
out of range
.я даже специально сделал упрощенный пример.
если вот такой одномерный массив, то все работает.
Но если вот так:
то на этой последней строчке выдает ошибку.
не могу понять, в чем тут проблема.
Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.
Так ошибки не будет:
спасибо, понял
Обсуждение закрыто.