IF - Как работают условия в VBA (Серия VBA 9)
Вставка
- Опубліковано 9 жов 2018
- Всем привет! В этом видео мы с Вами выучим следующую очень важную структуру в VBA - IF, с которой каждый должен уметь работать. Ну и конечно кроме этого мы поговорим и еще о нескольких важных пунктах касательно VBA. Вот общий список всего, о чем говорится в данном видео:
• Условная структура IF в VBA со всеми её особенностями (такими, как Elseif, Else и тд.)
• Использование математических условий в структуре If (больше-меньше, равно-не равно и тд.)
• Множественные условия в If (And и Or)
• Зачем и как использовать отступы в VBA при написании кода
• Кроме того, Вы в нашей серии изучения VBA получите домашнее задание, ответ на которое будет показан в следующем видео :)
Если видео было для Вас полезным, заряжайте лайк и подписывайтесь на канал, ведь это лучший стимул для меня снимать полезные видео-уроки VBA. Спасибо и всем приятного просмотра! :)
Даже немного удивительно, что можно найти на просторах ютуба материал такого качества бесплатно, большое спасибо автору! Очень круто и понятно
Здравствуйте, Алексей!
Большое спасибо за Ваш комментарий! Очень рад, что видео понравились и помогли Вам 😊
С уважением и хороших Вам выходных,
Билял
Мега-мега-мегаграмотное изложение материала и продуктивные уроки! Редкость на просторах интернета! Низкий Вам поклон за столь эффективное изложение материала по VBA! Вы педагог от Бога, продолжайте в том же духе! Низкий поклон за труды! Не поленюсь и напишу это коммент по каждым видео курса!!!
Здравствуйте, Андрей!
Со своей стороны точно также не поленюсь и поблагодарю Вас за этот приятный комментарий под каждым видео точно так же :)
С уважением и хорошего Вам дня,
ХБ
Автор вы перфекционист в подаче материала, спасибо огромное! Занимаюсь аналитикой в excel и долго откладывала изучение vba, рада, что наткнулась на ваш канал) ❤
Билял, благодарю! С домашним заданием я справился самостоятельно! Ура! )
Очень удачно подаётся материал по урокам от лёгкого к сложному. Пока даже я все понимаю. В подобных курсах все по-другому, первые два урока норм, а затем бац интегралы и логорифмы.
Здравствуйте, Герман!
Спасибо за Ваш комментарий. Очень рад, что получается подписчикам преподносить материал таким образом, как Вы это описали. И дальше буду стараться делать контент лишь интереснее и полезнее, с сохраняющейся при этом простотой подачи материала :)
С уважением,
ХБ
Качество подачи сложного материала 5+,Огромное спасибо
Очень крутой цикл презентаций. Доступно, интересно и полезно. Спасибо огромное! Это очень круто!)
Классно, буквально за несколько Ваших уроков у меня в руках удобный и современный инструмент для углубленной работы с эксцель.
Спасибо!
Ура! Получилось)
Спасибо Вам за грамотное и понятное изложение! Всё чётко, по порядку, приятно смотреть и слушать)
Здравствуйте, Валентина!
Всегда пожалуйста, рад стараться и рад, что видео Вам помогло! 😊
С уважением и хороших Вам выходных,
Билял
Спасибо! Выглядит сложно, но в процессе с вами все становится понятно.
Решил отметиться в комментариях, чтобы поддержать развитие канала) Огромное спасибо за грамотное и подробное изложение материала, посмотрел пока 11 уроков и очень доволен. Желаю вашему каналу расти! А вам продолжать в том же духе!
Здравствуйте, Артем!
Большое спасибо за Ваш комментарий, очень рад, что видео Вам понравились и были полезны! Буду и дальше снимать полезные и содержательные видео 😊
С уважением и хороших Вам выходных,
Билял
Спасибо за ваш труд. Очень качественно! Домашку сделал)
Спасибо! Очень все понятно! И да, у меня получилось домашнее задание.
Спасибо за урок. Очень легко и доступно.
Спасибо Билял. Все получается, и интересно.
Отличный Урок!
Успешно выполнил домашнее задание. Спасибо за урок!
Здравствуйте, Сергей!
Супер! Рад, что у Вас всё получается 😊
С уважением,
Билял
Спасибо вам большое, на удивление быстро выполнил задание, правда немного подсмотрел в прошлые уроки, но думаю, всё так быстро получилось благодаря вашему грамотному и понятному объяснению!
Здравствуйте, Александр!
Очень рад, что задания у Вас отлично получаются! Спасибо большое за Ваш комментарий и хорошего Вам дня 😊
С уважением,
Билял
Огромнейшее спасибо!
Спасибо автору, очень крутой материал
Спасибо тебе, добрый человек.
потрясающе
Очень очень интересно, спасибо
Огромное спасибо!!!
Хороший урок, спасибо
Спасибо, хороший урок. Да все остальные уроки. Сделал домашку 2-я способами
Здравствуйте, Сергей! Очень рад, что Вам нравятся уроки, и здорово, что домашнее задание Вам так хорошо далось! На днях буду снимать следующее видео. Хорошего Вам дня :)
Крутяк
Коротко, содержательно, понятно. Курс на 5.
Может конечно многим не новость - if не всегда нужно закрывать end if(но по началу лучше всегда, так точно не запутаешься и не получишь однажды ошибку))) Биллу однозначно респект, лайк, подписка. По твоим стопам постараюсь повысить свой любительской уровень. Большое спасибо за такие содержательные видео, обязательно посмотрю все. ДЗ ниже
Sub DZ()
Dim z As Range
For Each z In Range("C3:C7")
If z.Offset(0, -1) = "3" Then z.Value = "Удовлетворительно"
If z.Offset(0, -1) = "4" Then z.Value = "Хорошо"
If z.Offset(0, -1) = "5" Then z.Value = "Отлично"
Next z
End Sub
Добрый вечер, можно селлчек заменить на z?
Спасибо, я хоть и пользовался уже циклами и проверкой значений, но всё таки кое чего нового узнал(учился методом тыка). Только насколько я понял из тех документации есть ещё вариант вместо Then ставить GoTo, но не пользовался сам.
спс
Здравствуйте, еще раз спасибо за урок:).
Вот домашнее задание с учетом изученного в прошлом.
Sub test2()
Dim cellChecked As Range
Dim randomHw As Range
Dim describe1 As String
Dim describe2 As String
Dim describe3 As String
Dim describe4 As String
With ThisWorkbook.Sheets(2)
describe1 = .Cells(12, 3)
describe2 = .Cells(13, 3)
describe3 = .Cells(14, 3)
describe4 = .Cells(15, 3)
End With
For Each randomHw In ThisWorkbook.Sheets(2).Range("B3:B7")
randomHw = WorksheetFunction.RandBetween(2, 5)
Next randomHw
For Each cellChecked In ThisWorkbook.Sheets(2).Range(Worksheets(2).Cells(1, 2), Worksheets(2).Cells(7, 2))
If cellChecked.Value = 2 Then
cellChecked.Offset(0, 1) = describe4
ElseIf cellChecked.Value = 3 Then
cellChecked.Offset(0, 1) = describe3
ElseIf cellChecked.Value = 4 Then
cellChecked.Offset(0, 1) = describe2
ElseIf cellChecked.Value = 5 Then
cellChecked.Offset(0, 1) = describe1
End If
Next cellChecked
End Sub
Кстати, я попробовал перед циклом For Each написать переменную CheckedRange = ThisWorkbook.Sheets(2).Range(Cells(1, 2), Cells(7, 2))
, чтобы потом
просто получилось For Each cellChecked In CheckedRange. Не получилось, VBA ругался. Я задавал CheckedRange и как Variant, и как Range.
Upd: разобрался. Я для объекта Checkedrange писал Checkedrange =, а надо было Set Checkedrange
Здравствуйте, Владимир!
Спасибо за Ваш вариант решения домашнего задания! :)
В своём решении Вы очень здорово встроили функцию RandBetween для случайного присуждения оценок.
Касательно Вашей заметки о проблеме с использованием checkedRange (которую Вы самостоятельно решили - что очень здорово, так держать!): это интересная особенность VBA, что в зависимости от типа данных переменной может отличаться также и метод сохранения в ней значений. Будьте внимательны с Set - так это выражение Вам также понадобится, например, при работе с Collection, Workbook, Worksheet и так далее.
Скорее всего стоит снять короткое видео, посвященное данной теме, как думаете? :)
С уважением,
ХБ
Bill K., лично я - за!
Было бы очень здорово. У вас в одном из предыдущих уроков отлично про цепочку рассказано: книга-лист-ячейка, вот можно либо туда добавить, либо как дополнение отдельный видео урок.
Привет Билял! домашку я выполнил по другому, самом в excelе я написал формулу =ЕСЛИ(B3=5;"отл";ЕСЛИ(B3=4;"хор";"удов")) а потом через запись макроса поставил формулу на все ячейки ... так быстрее получилось )))
Присоединяюсь к ранним комментариям. Видео действительно очень достойно и внимания и изучения.
Хотелось бы спросить по ситуации есть задача найти в строках элементы, в (D3:D20) заканчиваются на *-0008-005* из следующих значений, которые расположены в столбцах ПР000-0008-005
Fg001-0006-004
Df004-0008-005
Я пробовал через следующую схему, как в уроке
Dim cellchecked As range
If cellchecked = *-0008-005* Then
Cellcheked.offset(0,3)= " ok"
End if
Next cellchecked
По такому коду у меня не получается выполнить задачу.
Здравствуйте, Олег!
Спасибо за Ваш комментарий, очень рад что видео уроки Вам помогают 😊
Касательно Вашего вопроса:
Смотрите, Ваша условная структура не работает, так как в ней проверяется целиком всё содержимое ячеек, то есть: является ли Df004-0008-005 равным -0008-005? В таком случае проверка, естественно, будет выдавать ЛОЖЬ, так как эти два значения разные.
При этом Ваша задача, как я понял, состоит в проверке именно последних девяти символов, а именно являются ли эти девять символов из условно скажем значения xxxxx-xxxx-xxx равными значению -0008-005
Чтобы проверить такую задачу Вам нужно «вырезать» последние 9 букв/цифр, сделать это можно вот так:
Right(cellChecked, 9)
Таким образом ячейка со значением Fg001-0006-004 будет возвращать -0006-004, а со значение Df004-0008-005 как раз проверяемый Вами текст -0008-005. И в таком случае проверка успешно сработает и будет вписано значение «Ок».
Вот примерный код:
Sub exampleAnswer()
Dim cellChecked As Range
For Each cellChecked In Range("D3:D20") 'Переделайте в эксплицитное указание
If Right(cellChecked, 9) = "-0008-005" Then
cellChecked.Offset(0, 3) = "ok"
End If
Next cellChecked
End Sub
С уважением,
Билял
@@BilyalKhassenov
Билял, всё супер!!! Спасибо. Продолжаю дальше смотреть видео и совершенствовать познания.
И мне не понятно, почему такой качественный материал от находится где-то внизу поиска на Ютубе.
Добрый вечер. Подскажите, почему если ввести такой код, то выдает ошибку end if without block if, но если энд иф убрать, то макрос идет?
Sub hw()
For Each cellchecked In Range("b3:b7")
If cellchecked = 3 Then cellchecked.Offset(0, 1) = "Удов"
If cellchecked = 4 Then cellchecked.Offset(0, 1) = "Хор"
If cellchecked = 5 Then cellchecked.Offset(0, 1) = "Отл"
End If
Next cellchecked
End Sub
Отличный курс, спасибо! Только при условии Range("A1") = "Пример" истина, если Ячейка А1 именно равна тексту "Пример", а не содержит текст "Пример". Т.е. текст "Пример заразителен" содержит слово "Пример", но при это условие не выполнится.
А в VBA 7.1 синтаксис Range иной и почему то диапазон не видит VBA. Пишу например, Range ("A1, D4") проверяется только ячейка A1, на двоеточие внутри скобок реагирует как на ошибку.
Подскажите пожалуйста
Как прописать код, для замены значений в диапозоне по условию. Пробую использовать оператор "Replace" но с ним не выходит.
Хочу написать код, который будет заменять значения в ячейках по условию.
Например: там где в таблице будет "СПБ 11:00" - заменить время на "10часов" и что бы стал в ячейке "СПБ 10:00". (своего рода изменение часов работы, по условию: город и время)
Пытаюсь все написать код, но ни как не выходит.
Спасибо за помощь!
Добрый день, не могу разобраться в чем ошибка выполнении домашнего задания:
Option Explicit
Sub Homework ()
Dim cellcheked As Range
For Each cellcheked In Range ("B3:B7")
If cellcheked = 5 Then
cellcheked.Offset(0, 1) = "Excellent"
If cellcheked = 4 Then
cellcheked.Offset(0, 1) = "Good"
If cellcheked = 3 Then
cellcheked.Offset(0, 1) = "Bad"
End If
Next cellcheked
End Sub
При попытке проверить появляется сообщение:
"Compile error
Next without For"
Буду очень благодарна за посказку
Спасибо за уроки. Дальше Спойлер ДЗ
Sub Урок9 ()
Dim Osenka As Range
For Each Osenka In Range("B3:B7")
If Osenka = 3 Then
Osenka.Offset(0, 1) = "Удовл: " & Osenka.Offset(0, -1)
ElseIf Osenka = 4 Then
Osenka.Offset(0, 1) = "Хорошо: " & Osenka.Offset(0, -1)
ElseIf Osenka = 5 Then
Osenka.Offset(0, 1) = "Отлично: " & Osenka.Offset(0, -1)
End If
Next Osenka
End Sub
15 сен 2022
Здравствуйте. Вашу уроки, просто супер!!!
Подскажите, что я делаю не так... Я пишу всё как в примере, но у меня (я про elseif) выскакивает диалоговое окно только с пятерками! Когда пятерки заканчиваются ничего больше не выдает. Будто он не переходит на elseif
Здравствуйте, Юлия! Скиньте свой код, тогда посмотрим :)
Добрый день! Большое спасибо за уроки! Пытаюсь реализовать функцию переноса данных Ф.И.О. сотрудников с листа "Матрица" на лист "Инсруктаж", по условию на другой лист.
Где Ф.И.О. находятся на листе "Матрица, в колонке B, условия в столбце I.
Однако переносится только 1 значение, и цикл не работает.
Sub ЗагрузкаДанных()
Dim A As Range
For Each A In Workbooks("Обучение_тест").Worksheets("Матрица").Range("I2:I1800")
If A = "да" Then
Workbooks("Обучение_тест").Worksheets("Инструктаж").Range("B2") = Workbooks("Обучение_тест").Worksheets("Матрица").Range("B2")
ElseIf A = "нет" Then
Workbooks("Обучение_тест").Worksheets("Инструктаж").Range("B2").Delete
End If
Next A
MsgBox ("Обновление графикa обучения завершено.")
End Sub
5+
msgbox "Полужирный Николай"
Добрый день! Подскажите в чем ошибка в домашнем коде, пожалуйста. Выдает 424 ошибку: object required
Sub tets()
Dim cellCheked As Range
For Each cellCheked In Range("B3:B7")
If cellCheked = 3 Then
cellCheked.Offset(0, 1) = "удовлетворительно"
ElseIf cellCheked = 4 Then
cellscheked.Offset(0, 1) = "хорошо"
ElseIf cellCheked = 5 Then
cellscheked.Offset(0, 1) = "отлично"
End If
Next cellCheked
End Sub
Здравствуйте Екатерина,
обратите внимание на условия для оценок "Удовлетворительно" и "Отлично" - там Вы вписали не cellChecked, а cellsChecked - с лишней буквой s. Попробуйте убрать её, и по идее всё должно заработать :)
Если что - всегда обращайтесь :)
С уважением и хороших Вам выходных,
Билял
@@BilyalKhassenov какая же глупая ошибка(( спасибо Вам большое! Замечательный курс, очень все подробно и доступно рассказываете!
@@user-uf3qn7eg7p Всегда пожалуйста, рад помочь. А так - ничего страшного, бывает, что вот так «недоглядишь» в VBA некоторые моменты.
Если что обращайтесь, Екатерина 😊
С уважением и хорошего Вам дня,
Билял
Добрый. А можно ли группировать в For Each cellChecked из двух Range ? С помощью and ? Тогда это будет For Each cellchecked1 in Range (x,x) and cellchecked2 in Range (y,y)? спасибо
Надо к If применить and и offset. Разобрался
Sub oriental()
Dim cellcheck As Range
For Each cellcheck In Range("A3:A7")
If cellcheck.Value = "анна" And cellcheck.Offset(, 2).Value = "Отлично" Then
cellcheck.Offset(, 3).Value = "То что надо"
Else
cellcheck.Offset(, 3).Value = "Другое"
End If
Next
End Sub
Схематично если
код написал. У меня работает. Ответ боюсь смотреть. Вдруг затупил. Оставлю его тут.
никому не подсматривать!
Sub HomeWork1()
Dim checkscore As Range
For Each checkscore In Range("B3:B7")
If checkscore = 5 Then
checkscore.Offset(0, 1) = "отлично"
ElseIf checkscore = 4 Then
checkscore.Offset(0, 1) = "хорошо"
ElseIf checkscore = 3 Then
checkscore.Offset(0, 1) = "удовлетворительно"
End If
Next checkscore
End Sub
Sub test()
Dim check As Range
For Each check In Range("B3:B8")
If check = 2 Then
MsgBox check.Offset(0, -1) & ": Неудовлетворительно"
check.Offset(0, 1) = "Неуд"
ElseIf check = 3 Then
MsgBox check.Offset(0, -1) & ": Удовлетворительно"
check.Offset(0, 1) = "Удовл"
ElseIf check = 4 Then
MsgBox check.Offset(0, -1) & ": Хорошо"
check.Offset(0, 1) = "Хорошо"
ElseIf check = 5 Then
MsgBox check.Offset(0, -1) & ": Отлично"
check.Offset(0, 1) = "Отлично"
End If
Next check
End Sub
Sub Ocenka()
Dim checkcel As Range
For Each checkcel In Range("B3:B7")
If checkcel = 3 Then
checkcel.Offset(0, 1) = "Удовлетворительно"
ElseIf checkcel = 4 Then
checkcel.Offset(0, 1) = "Хорошо"
ElseIf checkcel = 5 Then
checkcel.Offset(0, 1) = "Отлично"
End If
Next checkcel
End Sub
Sub lesson9_home_work()
'При помощи структры иф и фор ич пробижались по колонке с3-с7 и выдали коментарий отлично хорошо удовлитворительно
Dim cellchecked As Range
For Each cellchecked In Range("b3:b7")
If cellchecked = 3 Then
cellchecked.Offset(0, 1) = "Удовлитворительно"
ElseIf cellchecked = 4 Then
cellchecked.Offset(0, 1) = "Хорошо"
ElseIf cellchecked = 5 Then
cellchecked.Offset(0, 1) = "Отлично"
End If
Next cellchecked
End Sub
За что мне 3?))
if и elseif и else - все в одном примере. Слишком перемудренный пример для знакомства.