52953.fb2
Предположим, что вам нужно вставить новый элемент перед 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
Но лучше для этого использовать цикл For Each. . . Next (см. главу 8).
Чтобы идентифицировать конкретный элемент в коллекции, используется индекс элемента или его имя (если оно определено). Например, значение элемента коллекции можно присвоить переменной:
datДеньРождения = colДниРождения("Василий Али-Бабаевич")
К сожалению, вам придется отслеживать имена самим - VBA не предлагает возможности прочитать имена элементов коллекции. Кроме того, нельзя изменить имя элемента иначе, как удалив этот элемент из коллекции и затем добавив его вновь.
Точно так же нельзя в существующий элемент коллекции поместить новое значение. Следующий оператор присваивания работать не будет: colInventory(1465) = 119
Опять же, единственный способ изменения значения в коллекции - удаление соответствующего элемента и добавление нового с новым значением. Подобных ограничений нет для объектов Dictionary (словарь), которые обсуждаются в главе 14.
Как уже было сказано, применение класса Collection VBA ограничивается тем, что в нем нельзя хранить данные пользовательских типов. С этим ограничением можно смириться, если выбрать подходящую систему создания имен элементов. В следующем примере при каждом проходе цикла For. . .Next в коллекции создается запись базы данных. Эта запись состоит из трех полей, каждое из которых идентифицируется именем, составленным из простого описательного признака и номера записи. Вот соответствующий программный код:
Dim I As Integer, strName As String
Dim strPhone As String, strAddress As String
For I = 1 To Total ' I идентифицирует номер записи
' получение данных для этой записи
strName = InputBox("Введите имя для этой записи")
strPhone = InputBox("Введите номер телефона для _ этой записи")
strAddress = InputBox("Введите адрес для этой записи")
' Добавление "полей" для этой записи в коллекцийе
colDatabase.Add strName, "Имя" & I
colDatabase.Add strPhone, "Номер телефона" & I
colDatabase.Add strAddress, "Адрес" & I
Next I
Впоследствии можно извлечь информацию, хранимую в отдельной записи по описательному признаку и номеру, как в следующем операторе:
MsgBox colDatabase("Имя2")