With и Offset - Важный вспомогательный инструментарий (Серия VBA 7)
Вставка
- Опубліковано 6 вер 2024
- Всем привет! В этом видео мы познакомимся с такими фразами в VBA как With и Offset, которые являются важным вспомогательным инструментарием в Visual Basic for Applications.
• Кроме этого, мы впервые коротко с Вами посмотрим, каким образом форматируются ячейки в VBA - но это только для приведения примеров с With и Offset. Полноценно с форматированием ячеек в VBA мы с Вами познакомимся в одном из дальнейших видео-уроков.
• Также мы с Вами скомбинируем данные две фразы в одном примере
Если данное видео окажется для Вас полезным, ставьте лайк и подписывайтесь. Всем приятного просмотра! :)
Более понятных объяснений я ещё не встречал! Большущий лайк.
С нетерпением жду Ваших уроков.С уважением Сергей
Здравствуйте, Сергей! На выходных постараюсь снять и загрузить следующий урок! Хорошего Вам дня :)
Спасибо большое за ваш труд!
Самые охренительные, супер объяснительные уроки. По работе потребовался vba, так я только тут все стал понимать. Огромное спасибо за этот полезный контент.
Мега-мега-мегаграмотное изложение материала и продуктивные уроки! Редкость на просторах интернета! Низкий Вам поклон за столь эффективное изложение материала по VBA! Вы педагог от Бога, продолжайте в том же духе! Низкий поклон за труды! Не поленюсь и напишу это коммент по каждым видео курса!!!
Здравствуйте, Андрей!
Со своей стороны точно также не поленюсь и поблагодарю Вас за этот приятный комментарий под каждым видео точно так же :)
С уважением и хорошего Вам дня,
ХБ
Когда дошли до ofset сразу промелькнула мысль о программировании игры на экзель))
Спасибо вам большое, за такое понятное и граммотное изложение материала !
Здарвствуйте, Александр!
Рад стараться! Спасибо Вам, за то, что всегда следите за выпуском новых видео.
Хороших Вам выходных :)
С уважением,
ХБ
Даже не знала про Offset, спасибо! Эти конструкции здорово экономят время.
Это просто топовое объяснение! Лучший!
очень все понятно и интересно. С нетерпением преступаю к занятиям
Билял, замечательные уроки!
Благодарю!!! Всё попробовал - всё получилось повторить.
Давно хотел освоить VBA. Зная Pascal и глядя на код VBA понимал многие вещи, но что создать не очень получалось. Сейчас начинаю адаптироваться, правда машинально пишу := и в конце строки ставлю ;
Также скажу, что мне непонятно почему идиотские видосы имеют миллионы подписчиков, в то время как качественный учебный материал не имеет даже 1000. Как это не страшно признавать, но это ни что иное как деградация общества....
Билял, я подписываюсь на твой канал. Это моя вторая подписка ), а на youtube я не со вчерашнего для )
Здравствуйте, Войцеховский!
Рад приветствовать Вас на своём канале! Если будут какие-либо вопросы - всегда пишите их в комментариях, я по наличию времени буду стараться как можно быстрее на них ответить 😊
Сразу Вам могу сказать, что наличие знаний по Pascal, определенно будет помогать Вам в более быстрой адаптации в VBA - так как уже определенные инструменты и подходы будут знакомыми и в принципе будет иметься наработанный опыт в структурном понимании и своего рода «Интуиция» в программировании. Единственное, наверняка придётся научиться быстро «переключаться» между языками, как Вы и описали ситуацию с точкой с запятой и с := 😊
Желаю Вам оставаться здоровым в нынешней ситуации с коронавирусом!
С уважением,
Билял
@@BilyalKhassenov Теперь задачи Excel, которые не решаются формулами, я буду решать в VBA, а не как раньше в Delphi через Variant ))
Очень четкий материал!)
Здравствуйте, Temur!
Большое спасибо за комментарий! Если в дальнейшем будут какие-либо вопросы, всегда обращайтесь - буду рад помочь 😊
Хороших Вам выходных!
С уважением,
Билял
ОТЛИЧНО!!! 5+
Билял, очень крутой урок, благодаря тебе я понял, зачем нужен With и как его использовать, сам стал им пользоваться. Но offset неудобен так как только добавляется код, ведь в первой строке надо написать Range(" "), а потом ещё дописывать. Размер код такой же. Жаль в VBA нельзя просто в первой строке написать Range, а на следующих строках просто через току или что-то другой написать диапазоны (" "). Или в одной строке в скобках через запятую обозначить диапазоны.
Спасибо! познавательно и доступно
Супер
Круто!
4:20 перед Range не поставили точку, а это означает что Range относится к активному листу, потом уже 7:50 поставили .Range :)
Здравствуйте, Александр!
Очень точно подмечено, наверно, надо будет перезагрузить это видео с поправкой.
Большое спасибо Вам за замечание! :)
С уважением
,
ХБ
Вот поэтому конструкцию with лучше не использовать (точку очень легко забыть поставить и не заметить этого), а использовать объектные переменные
@@Midavok ничего подобного, with очень удобная конструкция, а так же все мы люди и можем ошибаться
Уроки хорошо объясняете, но меня ваш голос в сон тянет 🥲🥲🥲
Здравствуйте! Спасибо за уроки. Самые лучшие уроки по VBA на русском языке.
Хочу задать вопрос по offset.
Ниже приведен пример кода.
Я хотел бы, чтобы значения из первой строчки копировались в следующую пустую строчку(по замыслу эти значения будут обновляться из Power Query).
Если сделать код только с одной переменной, тогда в один столбец все переносится верно, а вот, если сделать код с двумя переменными (как в моем примере), то одно значение переносится верно, а второе нет.
Подскажите, пожалуйста, что нужно делать, в чем ошибка.
Option Explicit
Sub testSub()
Dim app As Long
Dim name As Long
name = Range("A1")
name = Range("B1")
Range("A1000").End(xlUp).Offset(1, 0).Value = app
Range("B1000").End(xlUp).Offset(1, 0).Value = name
End Sub
Здравствуйте, Денис! Большое спасибо за Ваш вопрос!
Ошибка в Вашем коде заключается в том, что Вы в пятой и шестой строке кода дважды задаете значение одной и той же переменной «name». Вероятно, Вы копировали код и случайно забыли поменять переменную :)
Вот поправленный код, пожалуйста, опробуйте его:
Option Explicit
Sub testSub()
Dim app As Long
Dim name As Long
app = Range("A1") ' Здесь у Вас до этого было написано следующее: name = Range("A1")
name = Range("B1")
Range("A1000").End(xlUp).Offset(1, 0).Value = app
Range("B1000").End(xlUp).Offset(1, 0).Value = name
End Sub
Ну и в качестве бонуса пара возможных замечаний / улучшений кода:
а) Обратите внимание на то, что Ваш код при помощи команды endищет последнюю заполненную строку в столбцах А и В. То есть, если в ячейках А2 и В2 уже имеются значения, то скопированные из А1 и В1 значения будут записаны в ячейки А3 и В3. Точно не уверен, что именно Вам нужно в итоге в Вашем файле, но решил на всякий случай написать это предупреждение :)
б) Записанные Вами команды VBAбудет выполнять всегда в активном рабочем листе (т.е. том, в котором последний раз происходили какие-либо действия), поскольку Вы указываете нужные Вам ячейки при помощи объекта Range, без предшествующего указания Workbooksи Worksheets. В случае, если Вы в итоге хотите более комплексную процедуру VBA, то лучше точно указывать компьютеру нужные Вам рабочие книги и листы
Если у Вас есть какие-либо еще вопросы, то смело их пишите, Денис!
Хорошего Вам дня :)
С уважением,
ХБ
@@BilyalKhassenov Добрый вечер! Спасибо большое за ответ!
Глупая ошибка. Действительно все работает.
Хотел бы продолжить дискуссию.
В данном случае код мне нужен, чтобы решить приблизительно следующий кейс: при помощи Power Query я загружаю нужные мне данные о продажах за определенный период, затем (если делать вручную), мне нужно скопировать и вставить эти данные в столбец (например в столбец с продажами за день/неделю/месяц/год),но с помощью макроса, я могу нажатием одной кнопки скопировать загруженные данные в следующую пустую строку/столбец.
В примере присутствует только два числа, то есть теоретически, если я хочу работать с 100 числами, мне нужно ввести 98 новых переменных и т.д. и оно должно работать. Интуитивно уверен, что для такого случая должен быть какой-то легкий способ, но пока не могу понять, как тут правильно разобраться.
Если Вы знаете, как это рациональнее организовать, то поделитесь, пожалуйста:)
Самостоятельно разобрался! Ура!
Option Explicit
Sub learningArrays()
Dim testArray(1 To 2) As Long
Dim i As Long
Dim lastColumn As Long
Dim Column As Long
i = 1
For i = LBound(testArray) To UBound(testArray)
testArray(i) = ActiveSheet.Range("A" & i)
Next i
For i = LBound(testArray) To UBound(testArray)
lastColumn = Worksheets(1).Cells(i, Columns.Count).End(xlToLeft).Column
Column = lastColumn + 1
Next i
For i = LBound(testArray) To UBound(testArray)
ThisWorkbook.ActiveSheet.Cells(i, Column) = testArray(i)
Next i
End Sub
Добрый вечер, Денис!
Извиняюсь за долгий ответ, на данный момент времени немного не хватает на активное ведение канала.
Мои следующие рекомендации будут основаны на том, что я примерно понял из Вашего описания желаемого результата. Вы посмотрите, если что еще раз обращайтесь :)
Альтернатива в случае с сотнями переменных и с условием, что заголовки импортированной таблицы находятся в строке 1 и для дальнейшей работы Вы хотите иметь именно переменные для каждого заголовка таблицы:
Sub variablesAlternative()
'Вариант для таблицы, в которой заголовки находятся в первой строке таблицы
Dim variablesNames() As String 'Array для имен столбцов, и соответственно переменных
Dim variablesValues() As String 'Array для значений переменных
Dim uBoundI As Long ' uBoundI будет определять количество переменных
Dim lastRowInTheTable As Long
Dim counter As Long
lastRowInTheTable = Cells(Rows.Count, 1).End(xlUp).Row 'Определяем последнюю строку в импортированной таблице
uBoundI = Cells(1, Columns.Count).End(xlToLeft).Column 'Заголовки таблицы в строке 1: определяем количество столбцов (и, следовательно, переменных)
'Изменяем границы массивов
ReDim variablesNames(1 To uBoundI)
ReDim variablesValues(1 To uBoundI)
'Задаем имена переменным и значения
For counter = 1 To uBoundI
variablesNames(counter) = Cells(1, counter)
variablesValues(counter) = Cells(lastRowInTheTable, counter)
Next counter
'Прогон имен и значений переменных в цикле (для наглядности)
For counter = 1 To uBoundI
MsgBox variablesNames(counter) & " - " & variablesValues(counter)
Next counter
End Sub
Можете попробовать данный код на какой-нибудь таблице. В нем отсутствует вставление сохранённых за переменными имен и значений, но для наглядности они в конце проганяются через Msgbox при помощи цикла For.
Ну и при помощи циклов Вы можете например выискивать нужную Вам переменную и работать с ее значением, вставляя по отдельности в нужные места. В случае, если у Вашей таблицы заголовки находятся в столбце - код надо будет немного поправить.
И еще одна альтернатива: в случае если у Вам данные из таблицы надо в точно таком же варианте перенести в нужное Вам место (то есть грубо говоря скопировать и вставить) - то Вы также можете автоматически определять размеры и место копируемых областей, целиком копировать сперва все заголовки при помощи команды Copy (про неё я еще не успел снять урок, но скоро сниму), вставлять их в нужное место, и затем тоже самое проделывать со значениями в нижней строке таблиц :)
Надеюсь, я смог нормально описать примерные варианты решения. Как было сказано, посмотрите, что именно больше подходит Вам, и принимайте соответственное решение.
Если будут вопросы - смело обращайтесь :)
С уважением
ХБ
Только что увидел, что Вы разобрались (всё больше удивляет UA-cam - даже не было никакого уведомления о новом комментарии от Вас). Но да ладно, можете посмотреть и мой вариант решения :)
Еще я был бы рад узнать Ваш вариант решения :)
Привет спачибо за видео можно вопрос. А как через код ставить не формулу а значение формулы
При проверке кода (когда мы работаем с with, меняем толщину шрифта и цвет) заметил, что если код запустить повторно то он сразу будет изменять ячейку , в том плане что не поэтапно.
Это нормально ?
Почему при указании цвета ячейки, вы написали vbRed, а не просто Red?
Здравствуйте, а как будет выглядеть блок-схема With?
15 сен 2022
А как здесь дать понять Ексель, что ".Value = 100" есть число?
Здравствуйте : А не лучше использовать переменную место адреса. Например
list1= work..(1).worksh..(1)
Msgbox list1.cells(1.1)=1
Билял, я хотел оформить подписку, но к сожалению выходит сообщение "Недоступный способ оплаты" ((
ths
Как сделать так чтобы макрос находил ячейки по тексту и вырезал именно эти ячейки и вчтавлял ниже отдельными блоками между пустыми строками