Перейти к содержимому
Только с 5 по 18 декабря кредитная карта Tinkoff All Airlines с бесплатным обслуживанием навсегда

VBA Excel. Операторы сравнения

    Операторы сравнения чисел и строк, ссылок на объекты (Is) и строк по шаблону (Like), использующиеся в VBA Excel. Их особенности, примеры вычислений.

    Операторы сравнения чисел и строк

    Операторы сравнения чисел и строк представлены операторами, состоящими из одного или двух математических знаков равенства и неравенства:

    • <   – меньше;
    • <= – меньше или равно;
    • >   – больше;
    • >= – больше или равно;
    • =   – равно;
    • <> – не равно.

    Синтаксис:

    • Результат – любая числовая переменная;
    • Выражение – выражение, возвращающее число или строку;
    • Оператор – любой оператор сравнения чисел и строк.

    Если переменная Результат будет объявлена как Boolean (или Variant), она будет возвращать значения False и True. Числовые переменные других типов будут возвращать значения 0 (False) и -1 (True).

    Операторы сравнения чисел и строк работают с двумя числами или двумя строками. При сравнении числа со строкой или строки с числом, VBA Excel сгенерирует ошибку Type Mismatch (несоответствие типов данных):

    Сравнение строк начинается с их первых символов. Если они оказываются равны, сравниваются следующие символы. И так до тех пор, пока символы не окажутся разными или одна или обе строки не закончатся.

    Значения буквенных символов увеличиваются в алфавитном порядке, причем сначала идут все заглавные (прописные) буквы, затем строчные. Если необходимо сравнить длины строк, используйте функцию Len.

    Оператор Is – сравнение ссылок на объекты

    Оператор Is предназначен для сравнения двух переменных со ссылками на объекты.

    Синтаксис:

    • Результат – любая числовая переменная;
    • Объект – переменная со ссылкой на любой объект.

    Если обе переменные Объект1 и Объект2 ссылаются на один и тот же объект, Результат примет значение True. В противном случае результатом будет False.

    По-другому ведут себя ссылки на диапазоны ячеек. При присвоении ссылок на один и тот же диапазон нескольким переменным, в памяти создаются уникальные записи для каждой переменной.

    Оператор Like – сравнение строк по шаблону

    Оператор Like предназначен для сравнения одной строки с другой по шаблону.

    Синтаксис:

    • Результат – любая числовая переменная;
    • Выражение – любое выражение, возвращающее строку;
    • Шаблон – любое строковое выражение, которое может содержать знаки подстановки.

    Строка, возвращенная аргументом Выражение, сравнивается со строкой, возвращенной аргументом Шаблон. Если обе строки совпадают, переменной Результат присваивается значение True, иначе – False.

    Со знаками подстановки для оператора Like вы можете ознакомиться в статье Знаки подстановки для шаблонов.

    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    22 комментария для “VBA Excel. Операторы сравнения”

    1. Евгений

      Добрый день, знающие подскажите.
      Сравниваю два списка ТМЦ. Раскладываю каждое ТМЦ на слова (Split) в переменную в одном списке, сравниваю с каждым словом другого списка, при максимальном количестве совпадений засчитываю общее совпадение ТМЦ.
      Использую оператор Like. Сравниваю две переменные.
      If temp(x) Like SKU(y) Then
      point = point + 1
      Но в переменную SKU(у) попадают слова ТМЦ с кавычками.
      Варианты: *SKU(у)*; «*SKU(у)*» не работают.
      Подскажите.

      1. Евгений

        Здравствуйте, Евгений!
        Если нужно, чтобы кавычки добавились вокруг SKU(у):

        или, чтобы кавычки добавились вокруг temp(x):

        1. Евгений

          Как раз наоборот, в переменную sku(y) попадают кавычки; их и надо игнорировать.
          Как с переменной использовать знаки подстановки?

        2. Евгений

          Как раз наоборот, необходимо игнорировать кавычки в переменной, с помощью знаков подстановки для шаблонов.
          temp(x) = стол
          sku(y) =»стол
          Сравнивая эти переменные будет ложь.
          temp(x) like ?sku(y) заменить кавычку используя знак вопроса?

          1. Евгений

            Евгений, знаки подстановки могут увеличить количество символов в строке, а не уменьшить. Добавьте еще одну переменную, например, skutemp, чтобы записывать в нее слова без кавычек:

            Или убирайте кавычки перед разбивкой фразы на слова.

    2. Александр

      Добрый день,
      я записываю команду Debug.Print x = "text" Like "t*"
      и даже Debug.Print x = "text" Like "text"
      и все время выдает False.
      Этот оператор не всегда работает?

      1. Евгений

        Добрый день, Александр!
        Здесь либо так:

        либо так:

          1. Евгений

            Вопрос не понял, но если надо шаблон применить к тексту в переменной, тогда так:

    3. Александр

      Спасибо,
      еще такой вопрос несколько не по теме. Просто срочно нужно разобраться.
      Есть ли в ячейках эксела пустые значения, которые могут восприниматься как числа, скажем нули? И где можно почитать как с этим бороться?

      1. Евгений

        В «пустой» ячейке общего формата содержится значение «Empty», которое записывается в числовую переменную как нуль, в текстовую — как пустая строка. Если вы хотите, чтобы в «пустых» ячейках содержалась пустая строка, присвойте этим ячейкам текстовый формат. Это можно сделать вручную или программно:

        Это, если ячейки будут заполняться позже. Если ячейки уже заполнены, чтобы текстовый формат к ним применился, их нужно перезаписать:

        1. Александр

          Я столкнулся с той проблемой, что ко мне приходит в экселе числовой массив большого размера. В нем есть пустые ячейки и нули, иногда ошибки с текстовыми значениями. Для дальнейшей обработки я хотел эту таблицу ячеек загнать в массив, так как иначе очень долго считает и мне не нужно изменять исходную таблицу. Я не определял тип массива, так как если ставить числовой, то загнать из таблицы экселя сходу в массив данные не получается, выдает ошибку. Когда же я строю на основании этого массива другой массив, того же типа Variant получается, что игнорируются нули, хотя в первом array они нормально воспринимались как нули типа Double. При переходе от одного массива к другому возникает какая-то другая интерпретация. А если есть еще промежуточные вспомогательные массивы, то вообще наступает каша. Нужен какой-то простой принцип, как следить за типом данных, и не давать машине заменять нули, «», Empty как ей вздумается.

          1. Евгений

            Могу предложить перезаписывать изначальный массив в текстовый:

            Разместите в диапазоне «A1:A10» разные значения, которые могут встретиться в вашей таблице. В диапазон «B1:B10» запишутся все значения, прошедшие преобразование в текст. В диапазон «C1:C10» запишутся только текстовые значения, которые интерпретируются как числа.

            1. Александр

              Спасибо, буду думать.
              а нуль я так понимаю Double воспринимает как Empty? Я даже когда 0 пытаюсь перезаписать в другую ячейку того же массива, он превращает его в Empty.

              1. Евгений

                Это потому что у вас массив As Variant. Если вам не нужны в массиве строки, можете изначальный массив перезаписать в массив As Double, в нем нуль всегда будет нулем:

                Правда, и строки станут нулями, но их можно преобразовать в какие-то значения, не встречающиеся в таблице:

                1. Александр

                  Спасибо,
                  да я тоже подумал, что нужно для отсутствующих значений взять какое-то большое отрицательное число.
                  В принципе можно при создании новых массивов прописывать каждый раз условие проверки. Тогда получается создавать правильные массивы.
                  Подскажите, пожалуйста, еще такой момент. Не смог быстро хелп найти.
                  Как правильно объявлять переменные в событиях форм если они связаны с процедурами модулей? Они всегда должны быть Public? Или можно как-то ограничить использование их только определенным модулем и формой?

                  1. Евгений

                    Если хотите, чтобы переменная была доступна только в модуле, где она расположена, объявите ее перед первой процедурой с помощью ключевого слова Dim или Private. Чтобы переменная была доступна и в других модулях проекта, объявите ее с помощью ключевого слова Public.

                    1. Александр

                      Это понятно. Я хотел спросить, где доступны переменные, которые объявляются в процедурах форм? Вот если я ввожу переменную в процедуре нажатия кнопки в форме, я ведь могу сделать кнопу в форме и без всякого модуля.

                      1. Евгений

                        Вопрос:
                        «Я хотел спросить, где доступны переменные, которые объявляются в процедурах форм?»
                        Ответ:
                        Переменные, объявленные в процедуре, доступны только в этой процедуре, независимо от модуля, в котором эта процедура размещена.

                        Ко второй части:
                        У кнопки на форме нет своего модуля, а процедура ее нажатия размещается в модуле этой формы. Процедура нажатия кнопки ActiveX, созданной на рабочем листе, размещается в модуле этого листа.

    4. Александр

      Еще, если можно такой вопрос.
      если я задаю одномерный массив как динамический, то программа без проблем его расширяет, но если я задаю двумерный, она пишет, что out of range.
      я даже специально сделал упрощенный пример.

      если вот такой одномерный массив, то все работает.
      Но если вот так:

      то на этой последней строчке выдает ошибку.
      не могу понять, в чем тут проблема.

      1. Евгений

        Переопределить с оператором Preserve можно только последнюю размерность динамического массива. Это недоработка разработчиков, которая сохранилась и в VBA Excel 2016. Без оператора Preserve можно переопределить все размерности.

        Так ошибки не будет:

    Добавить комментарий

    Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.