If vba excel не работает
Условный оператор IF является основной частью любого языка программирования. Без него не обойтись при написании даже небольшой программы, в которой необходимо принять некоторое решение. Синтаксис конструкции If следующий:
If условие Then [Команда 1] [Else Команда 2]
Если перевести, то получается: Если условие Тогда Команда 1 Иначе Команда 2
Т.е. если условие истинно тогда выполняется некоторая Команда (Команды) иначе выполняются другие Команды.В этом варианте конструкции IF будет выполнено только одна Команда. Else можно пропустить.
Примечание: При такой форме условия в Visual Basic после ключевого слова Then обязательно должна идти команда, а так же слова Then и Else должны находиться на той же строке что и IF, иначе интерпретатор выдаст ошибку. Если для удобства восприятия необходимо Команду 1 перенести на новую строку, то необходимо воспользоваться символом "_" после Then.
If условие Then _
[Команда 1] _
[Else Команда 2]
При таком варианте использования условия будет выполнено только одно действие. Если необходимо выполнить множество действий после Then или Else, то воспользуйтесь следующим вариантом написания условия:
If условие Then
[Команда 1]
[Команда 2]
.
[Else]
[Команда 3]
[Команда 4]
End If
Ключевое слово Else можно так же, как и в первом варианте не использовать, если нет необходимости.
И третий вариант конструкции, при котором происходит проверка условия, если первое условие не выполнено
If условие 1 Then
[Команда 1]
[Команда 2]
.
[ElseIf условие 2 Then
[Команда 3]
[Команда 4]
[Else
[Команда 5]
[Команда 6]
End If
В условиях также можно использовать логическое И (And), ИЛИ(Or) и отрицание НЕ (Not).
Рассмотрим несколько примеров использования выше перечисленных конструкций.
Пример 1
If a=b Then msgbox "а равняется b" Else msgbox "а не равно b"
Пример 2
В этом варианте Else не используем.
If a=b Then msgbox "а равняется b"
Пример 3
Используя «_» для интерпретатора Basic такая запись равносильна записи в Примере 1
If a=b Then _
msgbox "а равняется b" _
Else msgbox "а не равно b"
Пример 4
If a=b Then
msgbox "а равняется b"
a = a+b
Else
msgbox "а неравно b"
c = b
End If
Пример 5
If a=b Then
msgbox "а равняется b"
ElseIf a>b Then
msgbox "а больше b"
Else
msgbox "b больше a"
End If
Оператор If…Then…Else предназначен для передачи управления одному из блоков операторов в зависимости от результатов проверяемых условий.
Однострочная конструкция
Оператор If…Then…Else может использоваться в однострочной конструкции без ключевых слов Else, End If.
Синтаксис однострочной конструкции If…Then…
Компоненты однострочной конструкции If…Then…
- условие — числовое или строковое выражение, возвращающее логическое значение True или False;
- операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True.
Если компонент условие возвращает значение False, блок операторов конструкции If…Then… пропускается и управление программой передается следующей строке кода.
Пример 1
Многострочная конструкция
Синтаксис многострочной конструкции If…Then…Else
Компоненты многострочной конструкции If…Then…Else:
- условие — числовое или строковое выражение, следующее за ключевым словом If или ElseIf и возвращающее логическое значение True или False;
- операторы — блок операторов кода VBA Excel, который выполняется, если компонент условие возвращает значение True;
- пунктирная линия обозначает дополнительные структурные блоки из строки ElseIf [условие] Then и строки [операторы] .
Если компонент условие возвращает значение False, следующий за ним блок операторов конструкции If…Then…Else пропускается и управление программой передается следующей строке кода.
Самый простой вариант многострочной конструкции If…Then…Else:
Пример 2
Функция IIf
Функция IIf проверяет заданное условие и возвращает значение в зависимости от результата проверки.
Синтаксис функции
Компоненты функции IIf
- условие — числовое или строковое выражение, возвращающее логическое значение True или False;
- если True — значение, которое возвращает функция IIf, если условие возвратило значение True;
- если False — значение, которое возвращает функция IIf, если условие возвратило значение False.
Компоненты если True и если False могут быть выражениями, значения которых будут вычислены и возвращены.
Пример 3
Пример 4
Стоит отметить, что не зависимо от того, выполняется условие или нет, функция IIf вычислит оба выражения в параметрах если True и если False:
При нажатии кнопки «Cancel» или закрытии крестиком диалогового окна InputBox из первых двух примеров, генерируется ошибка, так как в этих случаях функция InputBox возвращает пустую строку. Присвоение пустой строки переменной d типа Integer вызывает ошибку. При нажатии кнопки «OK» диалогового окна, числа, вписанные в поле ввода в текстовом формате, VBA Excel автоматически преобразует в числовой формат переменной d. В третьем примере есть обработчик ошибок.
19 комментариев для “VBA Excel. Оператор If…Then…Else и функция IIf”
при ElseIf после Then выражение должно быть обязательно с новой строки
Спасибо, Александр!
Я изменил некоторые формулировки в статье, допускающие неоднозначное толкование. Кроме того, я решил проверить, что будет, если поместить при ElseIf выражение после Then, и вот что получилось:
Код работает! Но он не будет работать, если строки
заменить на строку
Конструкция:
if (condition)
then (action 1)
else (action 2)
Допустим, condition = true. Следовательно, выполняется action 1. Но затем операции, совершенные в action 1, приводят к тому, что условие уже не соблюдается, т.е. после завершения action 1 condition = false. Означает ли это, что сработает также конструкция else и будут выполняться операции action 2? Или условие всей конструкции if-then-else проверяется в один момент времени и не подвержено влиянию операций внутри конструкции?
Привет, Михаил!
Условие в вашей конструкции проверяется один раз:
И даже если в конструкции используется блок ElseIf . Then , для проверки условия используется первоначальное значение:
В обоих случаях MsgBox выведет число 5.
чем отличается однострочная и многострочная форма синтаксиса
Привет, Виктор!
Однострочная запись короче и работает только с одним условием.
Здравствуйте, Евгений!
Однострочная запись работает не только с одним условием.
Добрый вечер!
Здесь «одно условие» означает выражение, которое может состоять из нескольких входящий в него условий (лучше сказать «под-условий») и возвращает логическое значение True или False. Такое выражение может быть только одно в однострочной записи.
Второе условие расположено в многострочной записи после ключевого слова Then и операторов, выполняемых при истинном значении первого условия, и предваряется ключевым словом ElseIf.
Здравствуйте, Евгений!
Может знаете, что быстрее
Не знаю, не сравнивал. Измерьте скорость выполнения обоих вариантов с помощью функции MicroTimer.
Решить с помощью VBA
Определите, является ли заданное целое число А нечётным двузначным
числом.
Привет, Икром!
Решение может быть таким:
Здравствуйте!
«блок операторов после ключевого слова Else выполняется в любом случае, но структурный блок кода из строки Else и строки [операторы] не является обязательным и может быть пропущен».
Это только у меня вызывает недоумение?
«блок операторов после ключевого слова Else выполняется в любом случае»?! Да ну!
И то, что после «но» вовсе не противоречит первой части, хотя при употреблении «но» должно бы.
А по смыслу вторая это «после но» д.б. в отдельном предложении, даже в отдельном абзаце.
Добрый день!
Согласен. Это выражение касается функции IIf. Исправил. Спасибо за бдительность!
Есть столбик с процентами выполнения плана. Если больше 70%,то цвет текста зеленый, если меньше 40% то цвет текста красный. Как это прописать у меня получается только покрасить весь столбец в красный. Помогите пожалуйста я всю голову словмал что не так.
Павел, если в ячейке с процентным форматом отображается 90%, то фактически в ней содержится число 0,9. Вам надо сравнивать значения ячеек не с 70 и 40, а с 0,7 и 0,4.
Евгений, я так пробовал, но тогда сразу подсвечивается красным вся переменная.
Здравствуйте! У Вас нет темы по работе с фильтром. Можно проконсультироваться на этот счёт?
Здравствуйте, Сергей!
Задавайте вопрос, постараюсь ответить.
Спасибо, Евгений! Имеется в 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» для перехода вправо (Файл >> Параметры >> Дополнительно).
Спасибо за ответ! Да, но это надо делать вручную; речь идёт об автоматическом перемещении курсора.
Выполняет ту или иную группу операторов в зависимости от значения выражения.
Синтаксис
Быстрые ссылки на примеры кода
Эта статья содержит несколько примеров, демонстрирующих использование If . Then . Else баланс
Компоненты
condition
Обязательный. Выражение. Должен иметь значение True или False , или, или к типу данных, который неявно преобразуется в Boolean .
Если выражение является переменной, допускающей значение NULL , значением которого является Nothing, условие обрабатывается так, как если бы выражение было , а ElseIf блоки оцениваются, если они существуют, или Else блок выполняется, если он существует.
Then
Требуется в однострочном синтаксисе; Необязательный в многострочном синтаксисе.
statements
Необязательный элемент. Один или несколько инструкций, следующих за If . Then , которые выполняются, если condition имеет значение True .
elseifcondition
Требуется, если ElseIf имеется. Выражение. Должен иметь значение True или False , или, или к типу данных, который неявно преобразуется в Boolean .
elseifstatements
Необязательный элемент. Один или несколько инструкций, следующих за ElseIf . Then , которые выполняются, если elseifcondition имеет значение True .
elsestatements
Необязательный элемент. Одна или несколько инструкций, выполняемых, если ни Предыдущая condition elseifcondition , ни выражение не имеет True значение.
End If
Завершает многострочную версию If . Then . Else блок.
Комментарии
Многострочный синтаксис
If Когда. Then . Else , condition проверяется. Если condition имеет значение True , выполняются следующие Then операторы. Если condition имеет значение False , то каждый ElseIf оператор (если таковые имеются) вычисляется по порядку. True elseifcondition Когда обнаруживается, выполняются операторы, непосредственно следующие за ними ElseIf . Если значение не elseifcondition равно или если ElseIf нет инструкций, выполняются следующие Else True операторы. После выполнения инструкций, указанных Then после, ElseIf или Else , выполнение переходит к следующей End If инструкции.
ElseIf Предложения и Else являются необязательными. Можно использовать любое количество ElseIf предложений в If . Then . Else , но после предложения предложение не ElseIf может быть указано Else . If . Then . Else операторы могут быть вложенными друг в друга.
В многострочном синтаксисе If оператор должен быть единственным оператором в первой строке. ElseIf Операторам, Else и End If может предшествовать только метка строки. If . Then . Else блок должен заканчиваться End If оператором.
Выберите. Оператор Case может оказаться более полезным при вычислении одного выражения, имеющего несколько возможных значений.
Синтаксис Single-Line
Можно использовать однострочный синтаксис для одного условия с кодом для выполнения, если это так. Однако многострочный синтаксис обеспечивает большую структуру и гибкость и проще в чтении, обслуживании и отладке.
Что следует за Then ключевым словом, проверяется, является ли оператор однострочным If . Если после Then на той же строке появляется нечто, кроме комментария, инструкция рассматривается как однострочный If оператор. Если Then параметр отсутствует, он должен быть началом многострочного If . Then . Else .
В однострочном синтаксисе можно использовать несколько инструкций, выполняемых в результате If принятия решения. Then Все операторы должны находиться в одной строке и быть разделены двоеточиями.
Пример многострочного синтаксиса
В следующем примере показано использование многострочного синтаксиса If . Then . Else баланс.
But what happens is that if they dont have enough time it will show up but if it is fine it wont contine through to run the "NewBookingCheck".
can anyone help me please?
I would also say that this is my first time at fully writing my own code so I appologise for any errors there may be
I think days taken and days remaining are the same thing. the critical one being days remaining. User1 has 25, they try to take 30 and the computer says no because it was more than they were allotted. User2 has 30, they try to take 30 and the computer says no because it was more than than allowed, so why was User2 given 30? Surely the critical path is their usage to zero from any number they were allotted?
3 Answers 3
You missplaced an end if. Therefore the Else-statement belongs to the
Change the last part of your code to the following:
Your checking that a user does not use more than their allowance (Remaining) and also does not use more than they are allowed (Taken). This implies that someone may be given more than 25 days annual leave and not be allowed to take it, so why would they be given it? The critical one to check is the remaining, if that goes below 0 then you have an issue.
If the application quits then the rest of the code is not run anyway so, if the alert needs to be fired and the user does not want to continue then it will close, else it will start your next bit of code.
thank you for your answer, but the sub that you have submitted just runs through and removes the dates requested only then for the NewBookingCheck To error as there are no values to reference.
I future recommend you re-work and re-edit you questions here, since serious answers are approached accordingly and you want your code to be well-orginized and have good code appearance. As for your question: you didn't attach the NewBookingCheck function so i guess it is somekind of: Private Sub NewBookingCheck() <. >Try replacing your NewBookingCheck.NewBookingCheck line with:
Not the answer you're looking for? Browse other questions tagged vba excel or ask your own question.
Related
Hot Network Questions
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.5.10.42086
Читайте также: