Vba excel логические выражения

Обновлено: 07.07.2024

Оператор — это наименьшая способная выполняться единица кода VBA. Оператор может объявлять или определять переменную, устанавливать параметр компилятора VBA или выполнять какое-либо действие в программе.

Арифметических операторов в VBA всего 7. Четыре стандартных: сложение (+), вычитание (-), умножение (*), деление (/) и еще три:

  • возведение в степень (^), например 2^3 = 8;
  • целочисленное деление (\). Делит первое число на второе, отбрасывая (не округляя) дробную часть. Например, 5\2 = 2;
  • деление по модулю (Mod). Делит первое число на второе, возвращая только остаток от деления. Например, 5 Mod 2 = 1.

Оператор присвоения в VBA — знак равенства. Можно записывать так:

а можно еще проще:

Во втором случае не путайте знак равенства с оператором равенства.

значит "присвоить переменной nVar значение 10", а если строка выглядит так:

то это значит "если значение переменной nVar равно 10".

Если переменной нужно назначить объект, то делается это другими способами.

Операторов сравнения в VBA всего 8:

  • равенство (=), например, If (nVar = 10);
  • больше, чем и меньше, чем (> и <), например, If (nVar > 10);
  • больше или равно и меньше или равно (>= и <=), например, If (nVar >= 10);
  • не равно (<>), например, If(nVar<>10);
  • сравнение объектов (Is). Определяет, ссылаются объектные переменные на тот же объект или на разные, например, If(obj1 is obj2);
  • подобие (Like). Сравнивает строковый объект с шаблоном и определяет, подходит ли шаблон.

Операторы сравнения всегда возвращают true или false — true, если утверждение истинно, и false, если ложно.

Немного про сравнение строковых значений:

  • при сравнении строковых значений регистр учитывается;
  • пробелы в строковых значениях также учитываются;
  • при сравнении текстовых строк на больше/меньше по умолчанию сравниваются просто двоичные коды символов — какие больше или меньше. Если нужно использовать тот порядок, который идет в алфавите, то можно воспользоваться командой

Option Compare Text

Чуть подробнее про оператор Like. Общий его синтаксис выглядит как

Выражение1 Like Выражение2

При этом Выражение1 — любое текстовое выражение VBA, а Выражение2 — шаблон, который передается оператору Like. В этом шаблоне можно использовать специальные подстановочные символы (см. Табл. 3.1)

Табл. 3.1 Подстановочные символы для оператора LIKE

Любая цифра (только одна) от 0 до 9

Любое количество любых символов (включая нулевое)

Любой символ (только один)

Любой символ (только один) из приведенного списка

Любой символ (только один), кроме приведенных в списке

Очень часто при проверке нескольких условий используются логические операторы:

  • AND — логическое И, должны быть истинными оба условия;
  • OR — логическое ИЛИ, должно быть истинным хотя бы одно из условий;
  • NOT — логическое отрицание, возвращает TRUE, если условие ложно;
  • XOR — логическое исключение. В выражении E1 XOR E2 возвращает TRUE, если только E1 = TRUE или только E2 = TRUE, иначе — FALSE;
  • EQV — эквивалентность двух выражений, возвращает TRUE, если они имеют одинаковое значение;
  • IMP — импликация, возвращает FALSE, если E1 = TRUE и E2 = FALSE, иначе — TRUE.

Помнить нужно про AND, OR, NOT, остальные логические операторы используются редко.

Почти в любой программе VBA используются операторы конкатенации. В VBA их два — + или &. Рекомендуется всегда использовать &, потому что:

  • при использовании & производится автоматическое преобразование числовых значений в строковые — нет опасности допустить ошибку;
  • при использовании оператора + сложение строкового значения со значением типа Null дает Null.

Порядок применения операторов можно регулировать при помощи круглых скобок.

Логическое выражение — это выражение, результатом вычисления которого является значение логического типа данных: True или False . Boolean выражения могут принимать несколько форм. Простейшим является прямое сравнение значения Boolean переменной с Boolean литералом, как показано в следующем примере.

Два значения оператора =

Обратите внимание, что оператор присваивания newCustomer = True выглядит так же, как выражение в предыдущем примере, но выполняет другую функцию и используется по-разному. В предыдущем примере выражение newCustomer = True представляет логическое значение, а = знак интерпретируется как оператор сравнения. В изолированном операторе = знак интерпретируется как оператор присваивания и присваивает значение справа переменной слева. Это показано в следующем примере.

Дополнительные сведения см. в разделе сравнения значений и инструкции.

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

Операторы сравнения, такие как = ,, < ,, > <> <= , и >= создают логические выражения путем сравнения выражения с левой стороны оператора с выражением в правой части оператора и вычисления результата в виде True или False . Это показано в следующем примере.

Поскольку 42 меньше 81, логическое выражение в предыдущем примере вычисляется как True . Дополнительные сведения об этом типе выражения см. в разделе сравнения значений.

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

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

x > y And x < 1000

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

Операторы Short-Circuiting

Логические операторы AndAlso и OrElse демонстрируют поведение, называемое сокращенным вычислением. Оператор сокращенного вычисления сначала вычисляет левый операнд. Если левый операнд определяет значение всего выражения, выполнение программы продолжается без вычисления правого выражения. Это показано в следующем примере.

В предыдущем примере оператор вычисляет левое выражение 45 < 12 . Так как левое выражение принимает значение False , все логическое выражение должно иметь значение False . Таким результатом, выполнение программы пропускает выполнение кода в If блоке без вычисления правого выражения testFunction(3) . Этот пример не вызывается testFunction() , поскольку левое выражение фалсифиес все выражение.

Аналогично, если левое выражение в логическом выражении с помощью метода OrElse Evaluate имеет значение True , выполнение переходит к следующей строке кода без вычисления правого выражения, поскольку левое выражение уже проверило все выражение.

Сравнение с операторами, не являющимися сокращенными

Напротив, обе стороны логического оператора оцениваются при использовании логических операторов And и Or . Это показано в следующем примере.

В предыдущем примере вызывается, несмотря на то, testFunction() что левое выражение имеет значение False .

Выражения в скобках

Можно использовать круглые скобки для управления порядком вычисления логических выражений. Выражения, заключенные в круглые скобки, сначала оцениваются. Для нескольких уровней вложенности приоритет предоставляется самым глубоким вложенным выражениям. В круглых скобках вычисление продолжается в соответствии с правилами приоритета операторов. Дополнительные сведения см. в разделе приоритет операторов в Visual Basic.

Логические операторы сравнивают Boolean выражения и возвращают Boolean результат. And Операторы, Or , AndAlso , OrElse и Xor являются двоичными , поскольку они принимают два операнда, а Not оператор является унарным , так как он принимает один операнд. Некоторые из этих операторов также могут выполнять побитовые логические операции над целочисленными значениями.

Унарный логический оператор

Оператор not выполняет логическое отрицание в Boolean выражении. Он возвращает логическое противоположное значение операнда. Если результатом вычисления выражения является True , возвращается значение Not False ; Если результат вычисления выражения равен False , возвращается значение Not True . Это показано в следующем примере.

Бинарные логические операторы

Оператор and выполняет логическое умножение двух Boolean выражений. Если оба выражения имеют значение True , And возвращается значение True . Если хотя бы одно из выражений имеет значение False , And возвращается значение False .

Оператор OR выполняет логическое сложение или Включение двух Boolean выражений. Если любое из выражений принимает значение True , или оба значения имеют значение True , Or возвращается значение True . Если ни одно из выражений не имеет значение True , Or возвращает False .

Оператор XOR выполняет логическое исключение для двух Boolean выражений. Если только одно выражение имеет значение True , но не оба, Xor возвращает True . Если оба выражения имеют значение True или False , Xor возвращает False .

В следующем примере показаны And операторы, Or и Xor .

Short-Circuiting логических операций

Оператор AndAlso очень похож на And оператор, в котором он также выполняет логическое умножение двух Boolean выражений. Основное различие между ними состоит в том, что приводит к AndAlso сокращению поведения. Если первое выражение в AndAlso выражении имеет значение False , второе выражение не вычисляется, так как не может изменить окончательный результат и AndAlso возвращает False .

Аналогично оператор OrElse выполняет сокращенное вычисление логического сложения двух Boolean выражений. Если первое выражение в OrElse выражении имеет значение True , второе выражение не вычисляется, так как не может изменить окончательный результат и OrElse возвращает True .

Short-Circuiting Trade-Offs

Сокращенное вычисление может повысить производительность, не вычисляя выражение, которое не может изменить результат логической операции. Однако если это выражение выполняет дополнительные действия, сокращенное вычисление пропускает эти действия. Например, если выражение содержит вызов Function процедуры, эта процедура не вызывается, если выражение сокращено, а любой дополнительный код, содержащийся в, Function не выполняется. Таким образом, функция может выполняться только иногда и может быть некорректно проверена. Или логика программы может зависеть от кода в Function .

В следующем примере показана разница между And , Or и их сокращенными аналогами.

Обратите внимание, что в предыдущем примере некоторый важный код внутри не checkIfValid() выполняется при сокращенном вызове. Первый If оператор вызывает checkIfValid() 12 > 45 , хотя возвращает False , так как And не выполняет сокращенное вычисление. Вторая If инструкция не вызывает метод checkIfValid() , поскольку при 12 > 45 возврате False происходит AndAlso сокращенное значение второго выражения. Третья If инструкция вызывает checkIfValid() , даже если 12 < 45 возвращает True , так как Or не выполняет сокращенное вычисление. Четвертый If оператор не вызывает метод checkIfValid() , поскольку при 12 < 45 возврате True происходит OrElse сокращенное значение второго выражения.

Битовые операции

Побитовые операции оценивают два целочисленных значения в форме binary (основание 2). Они сравнивают биты в соответствующих позициях и затем присваивают значения на основе сравнения. В следующем примере показан And оператор.

В предыдущем примере задается значение x 1. Это происходит по следующим причинам.

Значения рассматриваются как двоичные:

3 в двоичном формате = 011

5 в двоичном формате = 101

And Оператор сравнивает двоичные представления, по одной двоичной позиции (бит) за раз. Если оба бита в заданной позиции равны 1, то в результате в эту точку помещается 1. Если любой из битов равен 0, то в результат помещается 0. В предыдущем примере это работает следующим образом:

011 (3 в двоичной форме)

101 (5 в двоичной форме)

001 (результат в двоичной форме)

Результат считается десятичным. Значение 001 является двоичным представлением 1, то есть x = 1.

Побитовая Or Операция аналогична, за исключением того, что 1 назначается биту результата, если один или оба сравниваемых бита равны 1. Xor присваивает значение 1 результирующему биту, если ровно один из сравниваемых битов (не оба) равен 1. Not принимает один операнд и инвертирует все биты, включая бит знака, и присваивает это значение результату. Это означает, что для положительных чисел со знаком Not всегда возвращает отрицательное значение, а для отрицательных чисел Not всегда возвращает положительное или нулевое значение.

AndAlso Операторы и OrElse не поддерживают побитовые операции.

Битовые операции могут выполняться только с целыми типами. Перед выполнением побитовой операции значения с плавающей запятой необходимо преобразовать в целочисленные типы.

Оператор If…Then…Else предназначен для передачи управления одному из блоков операторов в зависимости от результатов проверяемых условий.

Однострочная конструкция

Оператор If…Then…Else может использоваться в однострочной конструкции без ключевых слов Else, End If.

Синтаксис однострочной конструкции If…Then…

< strong > If < / strong > [ условие ] < strong > Then < / strong > [ операторы ]

Компоненты однострочной конструкции If…Then…

  • условие — числовое или строковое выражение, возвращающее логическое значение True или False;
  • операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True;

Если компонент условие возвращает значение False, блок операторов конструкции If…Then… пропускается и управление программой передается следующей строке кода.

Пример 1

d = InputBox ( "Введите число от 1 до 20" , "Пример 1" , 1 )

Многострочная конструкция

Синтаксис многострочной конструкции If…Then…Else

< strong > If < / strong > [ условие ] < strong > Then < / strong > < strong > ElseIf < / strong > [ условие ] < strong > Then < / strong >

Компоненты многострочной конструкции If…Then…Else:

  • условие — числовое или строковое выражение, следующее за ключевым словом If или ElseIf и возвращающее логическое значение True или False;
  • операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True.
  • пунктирная линия обозначает дополнительные структурные блоки из строки ElseIf [условие] Then и строки [операторы] ;
  • блок операторов после ключевого слова Else выполняется в любом случае, но структурный блок кода из строки Else и строки [операторы] не является обязательным и может быть пропущен.

Если компонент условие возвращает значение False, следующий за ним блок операторов конструкции If…Then…Else пропускается и управление программой передается следующей строке кода.

Самый простой вариант многострочной конструкции If…Then…Else:

< strong > If < / strong > [ условие ] < strong > Then < / strong >

Пример 2

d = InputBox ( "Введите число от 1 до 40" , "Пример 2" , 1 )

Функция IIf

Функция IIf проверяет заданное условие и возвращает значение в зависимости от результата проверки.

32 комментария для “VBA Excel. Содержание рубрики”

Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?

Здравствуйте, Сергей!
Задавайте вопрос, постараюсь ответить.

Спасибо, Евгений! Имеется в Excel столбец с включённым автофильтром. Можно ли программно запустить окно фильтра для выбора значений? Т.е. не руками нажимать на иконку фильтра, а заставить окно открываться с помощью макроса. Спасибо за ответ.

Да, это возможно:

Сергей, уточните вопрос: нужно программно нажать кнопки Ok и Отмена или отследить, какая из них была нажата?

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

Пример отслеживания нажатий кнопки «OK» автофильтра. На нажатие кнопки «Отмена» код не реагирует.

myString = Range ( "A1" ) . CurrentRegion . SpecialCells ( xlCellTypeVisible ) . Address myString1 = Range ( "A1" ) . CurrentRegion . SpecialCells ( xlCellTypeVisible ) . Address If Not Intersect ( ActiveCell , Range ( "A1" ) ) Is Nothing Then

Range("A1").CurrentRegion можно заменить на имя таблицы.

Евгений, а формулу в поле B2 оставлять или её можно удалить?

Сергей, событие Worksheet_Calculate() не зависит от команды SendKeys "%" . Ограничение стоит здесь:

If Not Intersect ( ActiveCell , Range ( "A1" ) ) Is Nothing Then

Код в процедуре Worksheet_Calculate() срабатывает только когда активна ячейка Range("A1") . Если заменить в этой строке Range("A1") на диапазон строки заголовков таблицы, тогда код будет срабатывать при любой активной ячейке в заголовке.

В столбце «B» не должно быть пустых ячеек до последней строки таблицы.

Как определить в VBA есть узор в ячейке?

If ActiveCell . Interior . Pattern = xlPatternNone Then

Добрый день! Никак не могу решить проблему с заблокированным автофильтром на защищенном макросом (нашел на форумах) листе. Подскажите пожалуйста, куда и какую строчку нужно добавить в макрос, чтобы при открытии файла был активен автофильтр:

Set ws = ThisWorkbook . Sheets ( 1 ) 'можно указать любой лист книги 'устанавливаем защиту на все ячейки рабочего диапазона листа 'снимаем защиту только с пустых ячеек рабочего диапазона листа Set rr = ws . UsedRange . SpecialCells ( xlCellTypeBlanks ) Private Sub Workbook_BeforeClose ( Cancel As Boolean )

Добрый день, Владислав!
Замените строку

Добрый день, Евгений!
ОГРОМНОЕ СПАСИБО. :))

Здравствуйте, помогите, пожалуйста, решить задачу((

Здравствуйте, Рафия!
С разработкой кредитного калькулятора вам помогут только за плату на бирже фриланса.

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

Здравствуйте, Ева! Для перемещения фокуса в ячейку справа код VBA не нужен: используйте для этого клавишу «Tab» или настройте клавишу «Enter» для перехода вправо (Файл >> Параметры >> Дополнительно).

Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.

Читайте также: