MyTetra Share
Делитесь знаниями!
Коллекции объектов
Время создания: 16.03.2019 23:43
Раздел: !Закладки - VBA - Для начинающих
Запись: xintrea/mytetra_db_adgaver_new/master/base/15128358128bwzfspt84/text.html на raw.githubusercontent.com

VBA - объектно-ориентированный язык, что означает, что всё в нём является объектом, то есть неким "предметом" мира VBA. А у предметов есть свойства. Кроме того они могут иметь какие-то отношения с другими предметами, входить в различные группы предметов. Например, деревянный стул входит в группу деревянной мебели, группа деревянной мебели входит в группу мебели вообще. В VBA та же система. Отдельный лист входит в группу листов, все листы являются частью рабочей книги, книга - лишь один элемент из целого набора открытых книг.

Говоря языком VBA, каждый объект входит в какую-нибудь коллекцию. Коллекция может принадлежать какому-то другому объекту, а тот в свою очередь опять входит в какую-то другую коллекцию. Что нам это дает? Самое главное и широко используемое следствие из такого разделения вещей в VBA это возможность оперировать всеми элементами коллекции. Для этого даже существует специальный цикл "For Each". Например, если нам нужно пробежатьcя по всем листам книги, мы можем написать так:


    For Each sh in Sheets

         sh.Activate

    Next


В данном цикле переменная sh будет принимать значение следующего листа, её мы можем использовать в цикле в качестве объекта листа, который используется в данный момент. Обратите внимание, что переменная равняется именно объекту, всему листу, а не его имени!


Распространенный пример перебора всех сводных таблиц в книге можете найти на странице примеров макросов.


VBA очень аккуратен, он всегда знает, где, чего и сколько у него хранится. Каждому объекту в каждой коллекции он присваивает номер, и мы можем использовать это в своих целях. Например, мы можем узнать количество объектов в коллекции с помощью функции Count. Или мы можем перебрать все элементы коллекции не циклом For Each, а обычным циклом For, записав это так:


    For i=1 to Sheets.Count

        Sheets(i).Activate

    Next


Обратите внимание, что когда мы обращаемся к объекту не по названию, а по номеру, мы не ставим кавычек (потому что это не строка, не название)!


Мы можем использовать это прекрасное свойство в случае, если имя объекта, к которому мы обращаемся, меняется, а порядковый номер всегда тот же. Например, допустим у нас есть несколько листов в книге, на каждом по одной сводной таблице или кубу. Нам нужно перебрать все эти таблицы. Но так как на каждом листе таблица одна, было бы глупо использовать цикл для перебора всех таблиц на листе. Гораздо проще было бы обратиться к таблице напрямую. Но вот беда, названия таблиц на разных листах могут быть разные, то есть по имени к ним не обратиться. В таком случае нам и пригодится нумерация. Так как таблица одна, у неё 100% будет номер 1. Тогда мы можем сделать такой цикл:


    For Each sh In Sheets

        sh.activate

        PivotTables(1). .....

    Next sh

 

Коллекции - одна из самых замечательных возможностей VBA. Если вы научитесь ими пользоваться, ваш код и ваша жизнь могут стать намного проще.

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования