Вход/Регистрация
VBA для чайников
вернуться

Каммингс Стив

Шрифт:

Не забывайте, что при удалении элемента, 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")

Если вы собираетесь создавать реальные программы для управления информацией в базах данных, не используйте для этого коллекции объектов - они имеют слишком много ограничений. Вместо этого используйте подключаемые компоненты доступа к базам данных (соответствующие примеры вы найдете в главе 14). Если же вы хотите выполнить всю работу самостоятельно, создайте свои собственные классы для объектов, позволяющих работать с пользовательскими типами данных. Ваши объекты должны позволять хранить в них любые комбинации данных, которые могли бы извлекаться как свойства. Кроме того, неплохо было бы добавить программный код для проверки правильности сохраняемой в отдельных элементах информации. (Модули классов рассматриваются, хотя и не слишком подробно, в главе 14.)

Определение своих собственных типов данных

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

Обычно приводят набившую оскомину аналогию между такими структурированными данными и карточками каталога (рис, 13.6), хотя персональные компьютеры уже давным-давно заполонили все вокруг, и, как мне кажется, сегодня вряд ли кто-то пользуется каталогами из карточек.

Рис. 13.6. На этих карточках хранится структурированная информация наподобие той, которая может быть представлена данными пользовательских типов в VBA

Огромное количество баз данных фактически представляет такого же типа организованную структуру, но в электронном виде. Ваза данных - это набор записей, каждая из которых состоит из полей для хранения отдельных элементов информации. Разные поля могут хранить данные совершенно различных типов (строки, числа, даты или что-то другое). Содержимое одного и того же поля при переходе от записи к записи может меняться, но тип хранимых в поле данных остается во всех записях одним и тем же.

  • Читать дальше
  • 1
  • ...
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: