Коллекции в VBA - Collections - (Серия VBA 22)
Вставка
- Опубліковано 4 жов 2024
- Привет! В этом уроке Ты познакомишься с самым удобным способом запоминания принципа работы коллекций в VBA. Так, помимо всего прочего мы обсудим,
• Как использовать коллекции в VBA
• В чём заключаются особенности коллекций в VBA
• Какие действия могут осуществляться в отношении коллекций и как с ними работать (Add, Item, Count, Remove)
• Как использовать параметры действия Add и понимать их принцип работы
Приятного просмотра и успехов в изучении VBA! :)
Мега-мега-мегаграмотное изложение материала и продуктивные уроки! Редкость на просторах интернета! Низкий Вам поклон за столь эффективное изложение материала по VBA! Вы педагог от Бога, продолжайте в том же духе! Низкий поклон за труды! Не поленюсь и напишу это коммент по каждым видео курса!!!
Здравствуйте, Андрей!
Со своей стороны точно также не поленюсь и поблагодарю Вас за этот приятный комментарий под каждым видео точно так же :)
С уважением и хорошего Вам дня,
ХБ
Ни одного плохого коммента, это логично. Спасибо, всё доступно очень понравилось.
Толковый урок, коротко и ясно без лишней воды.
Здравствуйте! Большое спасибо за Ваш комментарий! Хороших Вам выходных 😊
С уважением,
Билял
Подтверждаю, удалось объяснить максимально доступно! Спасибо Вам!
Спасибо за Ваши уроки!
Спасибо за Ваш труд! Все очень понятно и по теме. Коллекции использовал при написании макроса для поиска вложений в письмах Outlook.
спасибо
Здравствуйте, Алексей!
Рад стараться! :)
Хороших Вам выходных :)
С уважением,
ХБ
То что я так долго искал👏👏👏
Отличное видео! Коллекции, как вы заметили, очень похожи на массивы, но если с массивами все понятно, то как и где применять коллекции не совсем ясно. Как я понял, в коллекции можно записать только константы, изменить же значения, записанные в ячейки не получится. Может, на примере, расскажите, где применяются коллекции в vba.
Здравствуйте, Павел! Спасибо за интересный вопрос!
Пожалуй, можно сказать, что при сравнении Arrays и Collections, для пользователей основным функциональным отличием коллекций от массивов является возможность точной идентификации сохраняемых значений/объектов при помощи Key (т. е. грубо говоря названия). Я бы сказал, что, отталкиваясь от этого утверждения и стоит принимать решение, что же выбрать для реализации Вашей идеи в коде - Collection или Array.
Скажем, Вы имеете 10 наименований продуктов и цены каждого из них. Сохранив цены в коллек-цию, позже можно будет легко к ним обращаться при помощи названия продукта. Это первый пример, который мне пришел навскидку в голову :)
Ну и в принципе можно использовать коллекции для работы со списками значений, например, для их вывода в Listbox. Многие их так используют, находя достаточно простыми в понимании и ис-пользовании. Когда мы дойдём до изучения UserForms, обязательно рассмотрим подобные при-меры использования коллекций.
Если найдёте случаи, где оптимально использование именно коллекций - обязательно делитесь! Будет интересно почитать :)
С уважением,
ХБ
@@BilyalKhassenov Спасибо, ответ исчерпывающий!
Спасибо за труд!
Большое спасибо, Билял, большое спасибо!!!
Здравствуйте, Азамат!
Всегда пожалуйста, рад помочь! 😊
С уважением и хороших Вам выходных,
Билял
Билял, благодарю! Отличный понятный урок. Снова узнал для себя много нового о VBA.
Коммент ради раскрутки канала!
Аналог Collections в TurboDelphi - ключевое слово "record", которое позволяет объединять данные разных типов вместе и создавать свой комплексный тип данных. Например, можно создать тип данных - запись о человеке с указанием в отдельных полях фамилии, телефона, адреса и т.д., потом в свою очередь объединить такие записи в массив - получится телефонная книга (совместное использование массивов и записей в TurboDelphi ). Только в TurboDelphi обращение к полям записи (коллекции) более удобно - через точку - как свойство: Human.Surname
Здравствуйте, Виктор!
Спасибо за Ваш комментарий! Да, по описанию выглядит и вправду достаточно схоже. Мне, если честно, еще никогда не приходилось работать с TurboDelphi. А где Вы применяете его, если не секрет?
С уважением и хороших Вам выходных,
Билял
Спасибо большое
Здравствуйте Билял! Спасибо за Ваши уроки, они просто незаменимый помощьник про изучении VBA. Пытаюсь каждый урок приенять на прктике с связи с чем хотел задать вопрос в котором испытываю трудности. очень надеюсь на Вашу помощь.
Задача такова: Необходимо каждый раз вставлять в последнюю колонку документа вставлять некое значение и протягивать его вниз до дех пор пока есть какое либо значение в соседней колонке слева и если с первой частью проблем нет то вот со второй (протягиванием) есть. Сложность еще в том что каждый раз эти последние колонки будут отличаться.
Вот что получилось у меня, но способ довольно топорный, и полагаю есть более рациональное решение например с использованием масивов:
Sub AddSubDate()
Range("A1").Select
Selection.End(xlToRight).Offset(0, 1).Select
ActiveCell.Value = "Sub Date"
Selection.Offset(1, 0).Select
Selection.FormulaR1C1 = "=TODAY()"
Selection.Copy
Selection.Offset(0, -1).Select
Selection.End(xlDown).Select
Selection.Offset(0, 1).Select
Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub
Также хотел узнать есть ли какой то способ обьявить как range последнюю колонку или строчку что бы потом ее просто указывать как переменную. Спасибо заранее!
Здравствуйте, Стас!
Извиняюсь за долгий ответ - эта неделя выдалась крайне интенсивной, и я никак не мог добраться до ответов на комментарии и до работы над каналом в принципе.
Спасибо за Ваш комментарий! Очень рад, что мой канал помогает Вам в изучении VBA 😊
И касательно Вашего вопроса: вот один из возможных вариантов решения описанной Вами задачи:
Sub answerToQuestion()
Dim rgCellChecked As Range
Dim rgFirstCell As Range
Dim rgLastCell As Range
Range("A1").Select 'Все действия будут происходить в активном рабочем листе. В дальнейшем, подумайте об эксплицитном указании требуемого рабочего листа/листов
Set rgFirstCell = Range("A1").End(xlToRight).Offset(1, 1) 'Сохраняем первую ячейку в переменную. Указание Range("A1") следует сделать эксплицитным!
Set rgLastCell = Cells(ActiveSheet.Rows.Count, rgFirstCell.Offset(0, -1).Column).End(xlUp) ' Определяем последнюю ячейку. Ниже таблице не должно быть значений!
rgFirstCell.Offset(-1, 0) = "Sub Date" 'Вписываем заголовок столбца
For Each rgCellChecked In Range(rgFirstCell, rgLastCell) 'Проверка всех ячеек в столбце слева от записываемых данных
If rgCellChecked.Offset(0, -1) "" Then 'Если ячейка не пустая, то вписываем сегодняшнюю дату
rgCellChecked = Date
End If
Next rgCellChecked
End Sub
Учтите, что здесь я, как и в Вашем варианте кода, имплицитно указывал требуемую ячейку Range(“A1”). В дальнейшем подумайте о переходе на эксплицитное указание требуемой ячейки, то есть, например: ThisWorkbook.Worksheets("Лист1").Range("A1").
Кроме того, Вы спрашивали, возможно ли определение и сохранение последней ячейки столбца в переменную. Пример данного действия Вы можете увидеть в следующей строке из представленного решения задачи: Set rgLastCell = Cells(ActiveSheet.Rows.Count, rgFirstCell.Offset(0, -1).Column).End(xlUp). То есть в данном случае мы «прыгаем» от самой последней ячейки в требуемом столбце вверх при помощи метода End. Более подробно о нахождении последней ячейки в столбце/строке Вы можете узнать из видеоурока «Как найти последнюю строку/столбец - (Серия VBA 11)». При этом заметьте, что в данном случае определения последней ячейки в столбце, под требуемой таблицей не должно быть записано каких-либо значений. В противном случае отталкиваться нужно от них (при условии, что их позиция статична и не меняется со временем).
Посмотрите код, протестируйте его, и, если будут вопросы - всегда обращайтесь! Буду рад помочь Вам 😊
С уважением и хороших Вам выходных, Стас 😊
Билял
@@BilyalKhassenov Билял, а если мы переменной типа "Range" (назовём её "SomeRange") присваиваем некоторый диапазон на определенном Листе определенной Книги, при последующем обращении к этой переменной нужно ли указывать перед ней полный адрес (с указанием Книги и Листа), или в саму переменную уже будет заложена эксплицитная адресация диапазона? Другими словами, как будет правильно/допустимо:
- так: "Workbooks(1).Worksheets(1).SomeRange";
- или просто так: "SomeRange"?
Надо наверное было больше уделить внимания свойству коллекций, что с одним ключом два значения не вставить, т. е это используется для наполнения коллекции оригинальными значениями.
Билял, добрый день!
Спасибо за урок, очень сильно помог разобраться с коллекциями. Но есть вопрос, а как можно вывести номер индекса определенного наименования из коллекции, если наименования в коллекции он берет из таблицы и соответственно я не прописываю отдельно номер как у вас показано с момента 7:20? т.е. мне нужно что как только он находит определенное значение в коллекции выдал мне его индекс.
заслуженные 0 дизлайков, браво
Здравствуйте, Magamed!
Спасибо за Ваш комментарий, с новым годом Вас, успехов! :)
С уважением,
Билял
Здравствуйте. Будет ли видео по словарям и их заполнению?
Здравствуйте, Никита!
Да, в дальнейшем, правда не могу сказать, когда именно, но обязательно сниму также видеоурок и о словарях.
Хорошего Вам вечера! :)
С уважением,
ХБ
Добрый день. У меня к Вам вопрос. Я создал коллекцию кнопок CommandButton1, CommandButton2,......CommandButtonN. Могу ли я создать одно событие Click для всей коллекции, не создавая при этом событие Click для каждой кнопки в отдельности. Спасибо.
Коллекция это аналог списка в Power Query?
2021
А как потом сортировать данную коллекцию?
Отличный урок,все по полочкам.Только с каждым посмотренным уроком я все больше и больше ненавижу язык vba.Для чего вообще нужна эта структура данных если уже есть массив и хеш-таблица?!?А метод item?!Есть что то бесполезнее?