Vba excel логические выражения
Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?
Здравствуйте, Сергей!
Задавайте вопрос, постараюсь ответить.
Спасибо, Евгений! Имеется в Excel столбец с включённым автофильтром. Можно ли программно запустить окно фильтра для выбора значений? Т.е. не руками нажимать на иконку фильтра, а заставить окно открываться с помощью макроса. Спасибо за ответ.
Да, это возможно:
Сергей, уточните вопрос: нужно программно нажать кнопки Ok и Отмена или отследить, какая из них была нажата?
Просто отследить, какая кнопка нажата.
По предыдущему вопросу. Я вставил sendkeys… в конец макроса, который запускается при нажатии кнопки на листе. Окно фильтра появляется и тут же закрывается. А как сделать, чтобы окно осталось, и пользователь мог выбрать данные?
Евгений, я разобрался, почему не выводилось окно с фильтром.
Пример отслеживания нажатий кнопки «OK» автофильтра. На нажатие кнопки «Отмена» код не реагирует.
Вставьте в стандартный модуль (в примере — Module1) объявление глобальной переменной и код процедуры для кнопки:
Range("A1").CurrentRegion можно заменить на имя таблицы.
Евгений, а формулу в поле B2 оставлять или её можно удалить?
Можно удалить, если в таблице есть другие формулы. Я изменил код процедуры Worksheet_Calculate() в предыдущем примере, чтобы она не реагировала на изменение формул, а только на нажатие кнопки «OK» автофильтра. Range("A1") — это ячейка с кнопкой фильтра.
Евгений, спасибо за корректировку процедуры. Думаю, в ней и поле myString1 необязательно (и связанная проверка с ним), т.к. пользователь может выбрать все значения.
Но… после команды SendKeys "%" событие Worksheet_Calculate() отрабатывается только один раз :(.
Сергей, событие Worksheet_Calculate() не зависит от команды SendKeys "%" . Ограничение стоит здесь:
Код в процедуре Worksheet_Calculate() срабатывает только когда активна ячейка Range("A1") . Если заменить в этой строке Range("A1") на диапазон строки заголовков таблицы, тогда код будет срабатывать при любой активной ячейке в заголовке.
В переменную myString записывается состояние таблицы до применения фильтра, в переменную myString1 — после применения. Затем их содержимое сравнивается: если они содержат разные значения — значит, фильтр был применен.
Здравствуйте! может я не туда пишу. вопрос
нужно посчитать кол-во строк в столбце «В» (от 100 до 5000) и вставить в формулу вместо 744
table = Range("B2:C744")
спасибо.
В столбце «B» не должно быть пустых ячеек до последней строки таблицы.
Как определить в VBA есть узор в ячейке?
Спасибо за достаточно полную информацию.
Был бы очень вам признателен, если бы вы подсказали:
как изменить ширину блоков верхнего колонтитула.
«Введена слишком длинная строка. Уменьшите число знаков.»
При изменении шрифта с полужирного на обычный всё нормально
воспринимается,
Прошу прощения, если не по адресу.
Добрый день! Никак не могу решить проблему с заблокированным автофильтром на защищенном макросом (нашел на форумах) листе. Подскажите пожалуйста, куда и какую строчку нужно добавить в макрос, чтобы при открытии файла был активен автофильтр:
Добрый день, Владислав!
Замените строку
Добрый день, Евгений!
ОГРОМНОЕ СПАСИБО. :))
Здравствуйте, помогите, пожалуйста, решить задачу((
Разработать программу «Кредитный калькулятор» для расчета выплат по кредиту в условиях начисления процентов по аннуитетной схеме постнумерандо. Форма должна предусматривать ввод:
1) сумма кредита, допустимы 2 знака после запятой;
2) процентная ставка (годовая), допустимы 2 знака после запятой;
3) количество периодов (месяцев), целое положительное число.
Также форма должна содержать две кнопки:
1) «Ok» (выполнить расчет, заполнить лист Excel, освободить форму и закончить работу программы);
2) «Отмена» (освободить форму и закончить работу программы).
На лист Excel следует вывести 5 колонок:
1) номер периода;
2) остаток кредита;
3) сумма процентов за пользование кредитом, подлежащая к оплате;
4) сумма погашения основного долга (кредита);
5) общая сумма выплат за период.
Форма должна быть открыта из макроса «main» и там же освобождена по завершению своего использования. Форма должна содержать только код работы с формой и ввода данных. Логика верификации данных должна быть, по возможности, отделена от кода формы. Бизнес-логика обязательно должна быть отделена от кода формы.
Здравствуйте, Рафия!
С разработкой кредитного калькулятора вам помогут только за плату на бирже фриланса.
Добрый день, Евгений! Я только начинаю работать с VBA. Помогите, пожалуйста, прописать код для автоматического перемещения курсора на ячейку вправо после заполнения предыдущей.
Здравствуйте, Ева! Для перемещения фокуса в ячейку справа код VBA не нужен: используйте для этого клавишу «Tab» или настройте клавишу «Enter» для перехода вправо (Файл >> Параметры >> Дополнительно).
Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.
Логическое выражение — это выражение, результатом вычисления которого является значение логического типа данных: или . Boolean выражения могут принимать несколько форм. Простейшим является прямое сравнение значения Boolean переменной с Boolean литералом, как показано в следующем примере.
Два значения оператора =
Обратите внимание, что оператор newCustomer = True присваивания выглядит так же, как выражение в предыдущем примере, но выполняет другую функцию и используется по-разному. В предыдущем примере выражение newCustomer = True представляет логическое значение, а = знак интерпретируется как оператор сравнения. В изолированном операторе = знак интерпретируется как оператор присваивания и присваивает значение справа переменной слева. Это показано в следующем примере.
Дополнительные сведения см. в разделе сравнения значений и инструкции.
Операторы сравнения
Операторы сравнения, такие как = , > < ,, ,, и >= создают логические выражения путем сравнения выражения с левой стороны оператора с выражением в правой части оператора и вычисления результата в виде True или False . Это показано в следующем примере.
Поскольку 42 меньше 81, логическое выражение в предыдущем примере вычисляется True как. Дополнительные сведения об этом типе выражения см. в разделе сравнения значений.
Операторы сравнения в сочетании с логическими операторами
Выражения сравнения можно комбинировать с помощью логических операторов для создания более сложных логических выражений. В следующем примере показано использование операторов сравнения в сочетании с логическим оператором.
В предыдущем примере значение общего выражения зависит от значений выражений на каждой стороне And оператора. Если оба выражения имеют True значение, то общее выражение принимает True значение. Если любое из выражений имеет False значение, результатом вычисления False всего выражения будет значение.
Операторы Short-Circuiting
Логические операторы AndAlso и OrElse демонстрируют поведение, называемое AndAlso . Оператор сокращенного вычисления сначала вычисляет левый операнд. Если левый операнд определяет значение всего выражения, выполнение программы продолжается без вычисления правого выражения. Это показано в следующем примере.
Аналогично, если левое выражение в логическом выражении с помощью метода OrElse Evaluate имеет значение True , выполнение переходит к следующей строке кода без вычисления правого выражения, поскольку левое выражение уже проверило все выражение.
Сравнение с операторами, не являющимися сокращенными
Напротив, обе стороны логического оператора оцениваются при использовании логических операторов And и Or . Это показано в следующем примере.
В предыдущем примере вызывается testFunction() , несмотря на False то, что левое выражение имеет значение.
Выражения в скобках
Можно использовать круглые скобки для управления порядком вычисления логических выражений. Выражения, заключенные в круглые скобки, сначала оцениваются. Для нескольких уровней вложенности приоритет предоставляется самым глубоким вложенным выражениям. В круглых скобках вычисление продолжается в соответствии с правилами приоритета операторов. Дополнительные сведения см. в разделе приоритет операторов в Visual Basic.
Logical operators compare Boolean expressions and return a Boolean result. The And , Or , AndAlso , OrElse , and Xor operators are binary because they take two operands, while the Not operator is unary because it takes a single operand. Some of these operators can also perform bitwise logical operations on integral values.
Unary Logical Operator
The Not Operator performs logical negation on a Boolean expression. It yields the logical opposite of its operand. If the expression evaluates to True , then Not returns False ; if the expression evaluates to False , then Not returns True . The following example illustrates this.
Binary Logical Operators
The And Operator performs logical conjunction on two Boolean expressions. If both expressions evaluate to True , then And returns True . If at least one of the expressions evaluates to False , then And returns False .
The Or Operator performs logical disjunction or inclusion on two Boolean expressions. If either expression evaluates to True , or both evaluate to True , then Or returns True . If neither expression evaluates to True , Or returns False .
The Xor Operator performs logical exclusion on two Boolean expressions. If exactly one expression evaluates to True , but not both, Xor returns True . If both expressions evaluate to True or both evaluate to False , Xor returns False .
The following example illustrates the And , Or , and Xor operators.
Short-Circuiting Logical Operations
The AndAlso Operator is very similar to the And operator, in that it also performs logical conjunction on two Boolean expressions. The key difference between the two is that AndAlso exhibits short-circuiting behavior. If the first expression in an AndAlso expression evaluates to False , then the second expression is not evaluated because it cannot alter the final result, and AndAlso returns False .
Similarly, the OrElse Operator performs short-circuiting logical disjunction on two Boolean expressions. If the first expression in an OrElse expression evaluates to True , then the second expression is not evaluated because it cannot alter the final result, and OrElse returns True .
Short-Circuiting Trade-Offs
Short-circuiting can improve performance by not evaluating an expression that cannot alter the result of the logical operation. However, if that expression performs additional actions, short-circuiting skips those actions. For example, if the expression includes a call to a Function procedure, that procedure is not called if the expression is short-circuited, and any additional code contained in the Function does not run. Therefore, the function might run only occasionally, and might not be tested correctly. Or the program logic might depend on the code in the Function .
The following example illustrates the difference between And , Or , and their short-circuiting counterparts.
In the preceding example, note that some important code inside checkIfValid() does not run when the call is short-circuited. The first If statement calls checkIfValid() even though 12 > 45 returns False , because And does not short-circuit. The second If statement does not call checkIfValid() , because when 12 > 45 returns False , AndAlso short-circuits the second expression. The third If statement calls checkIfValid() even though 12 < 45 returns True , because Or does not short-circuit. The fourth If statement does not call checkIfValid() , because when 12 < 45 returns True , OrElse short-circuits the second expression.
Bitwise Operations
Bitwise operations evaluate two integral values in binary (base 2) form. They compare the bits at corresponding positions and then assign values based on the comparison. The following example illustrates the And operator.
The preceding example sets the value of x to 1. This happens for the following reasons:
The values are treated as binary:
3 in binary form = 011
5 in binary form = 101
The And operator compares the binary representations, one binary position (bit) at a time. If both bits at a given position are 1, then a 1 is placed in that position in the result. If either bit is 0, then a 0 is placed in that position in the result. In the preceding example this works out as follows:
011 (3 in binary form)
101 (5 in binary form)
001 (The result, in binary form)
The result is treated as decimal. The value 001 is the binary representation of 1, so x = 1.
The bitwise Or operation is similar, except that a 1 is assigned to the result bit if either or both of the compared bits is 1. Xor assigns a 1 to the result bit if exactly one of the compared bits (not both) is 1. Not takes a single operand and inverts all the bits, including the sign bit, and assigns that value to the result. This means that for signed positive numbers, Not always returns a negative value, and for negative numbers, Not always returns a positive or zero value.
The AndAlso and OrElse operators do not support bitwise operations.
Bitwise operations can be performed on integral types only. Floating-point values must be converted to integral types before bitwise operation can proceed.
Логические операторы сравнивают Boolean выражения и возвращают Boolean результат. And Операторы, Or , AndAlso OrElse , и Xor являются And , поскольку они принимают два операнда, а Not оператор является Or , так как он принимает один операнд. Некоторые из этих операторов также могут выполнять побитовые логические операции над целочисленными значениями.
Унарный логический оператор
Оператор not выполняет логическое отрицание в выражении. Он возвращает логическое противоположное значение операнда. Если результатом вычисления выражения является True , Not возвращается False значение; если результат вычисления выражения равен False , Not возвращается True значение. Это показано в следующем примере.
Бинарные логические операторы
Оператор and выполняет логическое умножение двух выражений. Если оба выражения имеют значение True , And возвращается True значение. Если хотя бы одно из выражений имеет значение False , And возвращается False значение.
Оператор OR выполняет логическое сложение или Включение двух выражений. Если любое из выражений принимает True значение, или оба значения имеют True значение, Or возвращается True значение. Если ни одно из выражений не имеет True значение, Or возвращает False .
Оператор XOR выполняет логическое исключение для двух выражений. Если только одно выражение имеет True значение, но не оба, Xor возвращает True . Если оба выражения имеют True значение или False , Xor возвращает False .
В следующем примере показаны And операторы, Or и Xor .
Short-Circuiting логических операций
Оператор AndAlso очень похож на оператор, в котором он также выполняет логическое умножение двух Boolean выражений. Основное различие между ними состоит в том, что AndAlso приводит к AndAlso поведения. Если первое выражение в AndAlso выражении имеет False значение, второе выражение не вычисляется, так как не может изменить окончательный результат и AndAlso возвращает False .
Аналогично оператор OrElse выполняет сокращенное вычисление логического сложения двух выражений. Если первое выражение в 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 не поддерживают побитовые операции.
Битовые операции могут выполняться только с целыми типами. Перед выполнением побитовой операции значения с плавающей запятой необходимо преобразовать в целочисленные типы.
«Not» – это оператор логического отрицания (инверсия), который возвращает True, если условие является ложным, и, наоборот, возвращает False, если условие является истинным.
Условие | Результат |
---|---|
True | False |
False | True |
Оператор «And»
«And» – это оператор логического умножения (логическое И, конъюнкция), который возвращает значение True, если оба условия являются истинными.
Условие1 | Условие2 | Результат |
---|---|---|
True | True | True |
True | False | False |
False | True | False |
False | False | False |
Оператор «Or»
«Or» – это оператор логического сложения (логическое ИЛИ, дизъюнкция), который возвращает значение True, если одно из двух условий является истинным, или оба условия являются истинными.
Условие1 | Условие2 | Результат |
---|---|---|
True | True | True |
True | False | True |
False | True | True |
False | False | False |
Оператор «Xor»
«Xor» – это оператор логического исключения (исключающая дизъюнкция), который возвращает значение True, если только одно из двух условий является истинным.
Условие1 | Условие2 | Результат |
---|---|---|
True | True | False |
True | False | True |
False | True | True |
False | False | False |
Оператор «Eqv»
«Eqv» – это оператор логической эквивалентности (тождество, равенство), который возвращает True, если оба условия имеют одинаковое значение.
Условие1 | Условие2 | Результат |
---|---|---|
True | True | True |
True | False | False |
False | True | False |
False | False | True |
Оператор «Imp»
«Imp» – это оператор логической импликации, который возвращает значение False, если первое (левое) условие является истинным, а второе (правое) условие является ложным, в остальных случаях возвращает True.
Условие1 | Условие2 | Результат |
---|---|---|
True | True | True |
True | False | False |
False | True | True |
False | False | True |
Приоритет логических операторов
Приоритет определяет очередность выполнения операторов в одном выражении. Очередность выполнения логических операторов в VBA Excel следующая:
Читайте также: