VBA для чайников
Шрифт:
Создание объектов Collection
Объекты Соlection создаются в программе точно так же, как и любые другие объекты, с использованием ключевого слова As для определения типа. Как и с другими объектами, вас есть на выбор два варианта.
* Можно объявить имя переменной для объекта и затем использовать оператор Set, чтобы создать ее. При этом в операторе Set нужно использовать ключевое слово New, чтобы создать новую коллекцию. Например:
Dim colMixedBag As Collection
* * *
Set colMixedBag = New Collection
'
colMixedBag.Add "Howard, Ethel"
' добавление элемента
* Можно обязать VBA создать объект автоматически при первом использовании переменной в программном коде. Для этого нужно поместить ключевое слово New в объявление переменной;
Dim colSetOfStuff As New Collection
* * *
' следующий оператор создает коллекцию
' при добавлении в нее целого значения
colSetOfStuff.Add intStuffing
Для заполнения созданной коллекции данными используйте метод Add (Добавить) точно так же, как при добавлении объектов во встроенные коллекции VBA-приложения (см, главу 12). Примеры использования метода Add вы найдете и в предыдущем разделе.
Синтаксис метода Add выглядит так:
Add (элемент[, имя] [, before индекс] [, after индекс])
При этом выражение элемент обязательное, оно может быть буквальным значением, переменной, ссылкой на объект или более сложным выражением, составленным из этих компонентов, - в общем, всем, что возвращает значение, распознаваемое VBA. Остальные аргументы метода Add необязательны, они обсуждаются в следующих разделах.
В общем-то, всегда можно обратиться к элементу коллекции по его индексу в этой коллекции, ло зачастую удобнее назначить элементу информативное имя. Для этого нужно при добаюекии элемента R коллекцию указать его имя в виде строки:
colFinancials - Add 14 32 3 . 44, "Продажи за февраль"
В этом операторе в коллекции colFinancials добавляется значение 14323 .44. Одновременно для этого элемента создается имя. Вполне допустимо при задании имени использовать переменную типа String.
Имя не только легче запомнить, чем индекс, оно, к тому же, обеспечивает единственный надежный способ доступа к конкретному элементу коллекции. При использовании методов Add и Remove позиции элементов данных в коллекции могут меняться. Даже если элемент с №69 станет 29-м, вы все равно сможете воспользоваться значением этого элемента, если знаете его имя.
Имя элементу можно присвоить только с помощью метода Add. Чтобы присвоить имя элементу, уже существующему без имени, придется удалить имеющуюся копию с помощью Remove и использовать Add для добавления элемента снова.
Иногда удобно разместить элементы коллекции в определенном порядке. И даже если при этом нельзя добавлять элементы в нужном порядке последовательно, то все равно нет проблем - метод Add позволяет
Предположим, что вам нужно вставить новый элемент перед 35-м элементом в коллекции.
Вы можете использовать для этого оператор следующего вида:
colAnimals. Add strSpecies, before 35
Добавленный элемент станет 35-м элементом коллекции, подвинув все последующие (В отличие от- массивов, элементы коллекций нумеруются с 1.) Чтобы сообщить VBA, где вставить новый элемент, можно использовать и имя существующего элемента, например:
colОвощи. Add = stiCopt, after "Помидор"
В данном случае VBA найдет в коллекции существующий элемент с именем Помидор и сразу после него вставит новый.
Ясно, что в оператор, использующий метод Add, можно включить либо before, либо after, но никак не оба этих аргумента.
Для добавления в коллекцию множества элементов можно использовать цикл For . . . Next, подобно тому, как это делалось с массивами. Например:
Dim X As Integer, Y As Integer
У = 12
For X = 1 To 30
colHouseOfValues.Add Y * X
Next X
Говоря очевидное, сообщаю вам, что метод Remove удаляет элемент из коллекции. Объект для удаления можно задать либо с помощью индекса, либо с помощью имени, например:
colМинералы.Remove 2123
colМинералы.Remove "Боксит"
Не забывайте, что при удалении элемента, VBA, так сказать, "заполняет дыры" - номера всех элементов, следующих за удаленным, уменьшатся на 1.
Запутаться в размерах коллекции несложно, особенно после многократного использования Add и Remove. Родовой объект Collection имеет только одно свойство – Count (подсчет), - но, в силу вышесказанного, это свойство оказывается жизненно важным. Значение этого свойства можно присвоить переменной, например, так:
intРазмерКоллекции = col20Вопросов.Count
Его можно также использовать в условном выражении, как здесь:
If colPrices.Count > 1000
MsgBox "Слишком много позиций!"
End If
Кроме того, значение свойства Count можно использовать в цикле For . . . Next, чтобы выполнить некоторые действия по отношению ко всем элементам коллекции, например:
Dim Z As Integer
For Z = 1 To col Prices.Count
MsgBox "Цена " & col Prices ( Z)
Next Z