Ця книга допоможе освоїти інтегроване середовище розробки VBA і навчитися програмувати в VBA з використання об'єктів, їх властивостей, методів і подій. Обговорювані прийоми програмування ілюструються прикладами, які можна відразу ж випробувати на практиці. Отримані знання ви зможете застосувати як для настроювання й удосконалення популярний офісних додатків, включаючи додатки Office XP, так і для створення власних додатків.
Книга розрахована на тих, хто збирається швидко і без зайвих зусиль навчитися програмувати для Windows, використовуючи VBA.
Книга: VBA для чайників
Оголошуйте масив як динамічний в наступних випадках.
* Якщо ви не знаєте і не можете дізнатися розмір масиву до виконання програми.
* Якщо знаєте, що розмір масиву в ході виконання програми буде змінюватися.
* Якщо після завершення використання масиву хочете звільнити займану ним пам'ять для інших цілей (великі масиви можуть займати чимало пам'яті, яку можна звільнити для використання динамічних масивів).
Dim dateДніРожденія () As Date
підготує VBA до використання масиву елементів типу Date, насправді не створюючи поки масив.
Динамічний масив не може зберігати дані до тих пір, поки ви не створите масив реально, вказавши його розмір. Для цього використовується оператор ReDim, як в наступному прикладі з одновимірним масивом:
ReDim dateДніРсжденій (intЧіслоДнейРожденія - 1)
Зверніть увагу на те, що розмір створюваного цим оператором масиву задається виразом, що використовують змінну, в припущенні, що значення цієї змінної вже визначено в програмі. Значення змінної доводиться зменшувати на 1, щоб привести число елементів масиву у відповідність з пропонованою VBA нумерацією масивів від 0, якщо, звичайно, ви не змінили систему нумерації, прийняту за замовчуванням, як описувалося в розділі "Нумерація елементів масиву".
Оператор ReDim повинен використовуватися всередині процедур. Один і той же масив можна перевизначати стільки раз, скільки потрібно, задаючи зовсім нові числа розмірності і розмірів. Тільки не забувайте, що при звичайному перевизначенні масиву його вміст повністю знищується. Не можна також змінити тип даних, призначених масиву, хіба що за певних умов, пояснювати які тут на мене, надто складним.
Щоб при перевизначенні масиву зберегти частину даних, використовуйте разом з оператором ReDim ключове слово Preserve. Така послідовність операторів оголошує динамічний масив, створює його як двовимірний масив заданого розміру, а потім збільшує розміри масиву по другому виміру, не руйнуючи вже наявні дані:
Dim dblGalacticMasses () As Double
ReDim Preserve dblGalacticMasses (1 To 30, 1 To 50)
ReDim Preserve dblGalacticMasses (1 To 30, 1 To 100)
Насправді можливості Preserve вельми обмежені - при використанні цього ключового слова не може бути змінена розмірність масиву і можна змінювати розмір тільки останнього вимірювання (але все одно необхідно в операторі ReDim Preserve вказувати параметри інших вимірів). При цьому можна зробити розмір масиву менше, але дані, що зберігалися в віддалених елементах, будуть втрачені назавжди.
Щоб в програмі використовувати конкретний елемент масиву, надрукуйте ім'я масиву, за яким слідують дужки з зазначеним в них індексом цього елемента. Індекс повинен задавати цілі значення для кожного з вимірів масиву. Наприклад, вираз strSayings (4, 6), очевидно, однозначно ідентифікує строкові дані з рядка 4 та стовпчика 6 в двовимірному масиві рядків.
В рамках описаної системи можна використовувати елементи масиву як звичайні змінні. Ви можете зробити наступне:
* Привласнити елементу масиву значення; в наступному прикладі значення присвоюється X конкретного елементу тривимірного масиву даних типу Currency:
curBigDough (5, 8, 19) = 27.99
* Привласнити значення, що зберігається в масиві, деякої змінної, наприклад:
"Ніхто не помітить ваших різних шкарпеток."
"Ви зустрінете свого старого друга в супермаркеті."
intUserChoice = InputBox ( "Щоб дізнатися про своє майбутнє," _
"Введіть число від 1 до 10")
До речі, цей програмний код можна істотно поліпшити, якщо додати в нього обробку декількох невдалих спроб ввести, можливого при відповіді користувача на запит функції Input Box. Про проблеми перевірки даних при введенні говорилося в главі 10.
Щоб з'ясувати, як багато елементів може вмістити деякий вимір масиву, використовуйте функцію Ubound, яка особливо корисна при роботі з динамічними масивами, оскільки в різні моменти виконання програми динамічний масив може містити різну кількість елементів. Синтаксис функції UBound наступний:
UBound [імя_массіва, вимір]
Аргумент імя_массіва, очевидно, задає ім'я масиву, до якого потрібно звернутися, а аргумент вимір задає ціле число, яке підкаже VBA, яке вимір масиву вас цікавить. Якщо вимір не вказано, функція UBound поверне розмір першого виміру масиву.
При першому створенні масиву його елементи не містять ніякої дійсної інформації. В деякий момент в програмі вам необхідно буде заповнити вакантні місця масиву відповідними даними. Якщо потрібно розмістити відразу багато даних, найкраще для цього підійдуть вкладені цикли For. Next, по одному на кожне вимір масиву. Для лічильника циклу зазвичай вибирається тимчасова змінна, оголошується в процедурі, що містить всі ці цикли.
Цей підхід ілюструється наступною невеликою програмою, в якій тривимірний масив заповнюється послідовними цілими значеннями починаючи з 1. Ось її програмний код:
Const Size As Integer = 3
Dim dblMatrix (1 To Size, l To Size, l To Size) As Double
Dim I As Integer, J As Integer, К As Integer, X As Integer
For I = 1 To Size
For J = 1 To Size
For К = 1 To Size
dbl Matrixf l, J, K) = X
Порядок вкладення циклів буде визначати порядок заповнення масиву дачними. У свою чергу від порядку, в якому заповнюються елементи масиву, часто залежать і їх значення.
Пояснювати це тільки на словах дуже складно, тому я збираюся використовувати малюнки. Знову звернемося до попереднього прикладу програмного коду. Уявімо тривимірний масив у вигляді куба, складеного з маленьких кубиків, що означають елементи масиву.
Ілюстрація цього уявного експерименту показана на рис. 13.2.
Мал. 13.2. Цей креслення представляє масив для зберігання даних; стрілки з буквами відповідають вимірам масиву
Зверніть увагу на те, що в головній рядку цього програмного коду, dblMatrix (I, J, К) = X, змінні I, J і К представляють відповідно перше, друге і третє вимірювання масиву. На рис. 13.2 я довільним чином призначив ці букви сторонам куба, що задає його вимірювання.
Тепер подивіться, як ці змінні використовуються в циклах For. Next. Лічильником зовнішнього циклу є I, следующего- J і останнього, внутрішнього, - К. Потрібно зрозуміти, що VBA почне виконання з внутрішнього циклу, пройшовши до нього крізь усі містять його цикли. Куби на рис. 13.3 показують два послідовних моменту на самому початку заповнення масиву з цього прикладу.
Л поки цей внутрішній цикл виконується, VBA не змінює значення змінних I і J. Коли внутрішній цикл перший раз пройдений повністю, перший раз отримає можливість зробити крок наступний цикл-цикл J. Це збільшить значення J- і знову почнеться виконання внутрішнього циклу від початку до кінця. Значення зміниться тільки тоді, коли цикл F виконаний все три рази. Після збільшення починає заповнюватися наступний шар масиву (рис. 13.4).
Сподіваюся, тепер ви зрозумієте, як відбивається зміна порядку вкладення циклів на порядку заповнення масиву. Припустимо, що порядок вкладення циклів змінений на зворотний, і лічильником зовнішнього циклу тепер стало К. Ось як повинен виглядати при цьому відповідний програмний код (зверніть увагу, що в операторі присвоєння змінні залишилися на колишніх місцях):
Мал. 13.3. Ці два креслення ілюструють послідовність, в якій процедура-приклад заповнює масив у міру виконання внутрішнього циклу For. Next:
For K = 1 To Size
For J = 1 To Size
For I = 1 To Size
dblMatrix (I, u, K) = X
В результаті масив буде виглядати так, як показано на рис. 13.5.
Мал. 13.4. Другий шар масиву почне заповнюватися тільки після того, як змінить значення лічильник самого зовнішнього циклу For. Next
Мал. 13.5. Цей креслення ілюструє порядок заповнення масиву зміненої процедурою
Масив буде містити ті ж значення, що і в першому випадку, але вони зберігаються іншими елементами масиву.
У VBA 6 можна привласнити вміст одного масиву іншому за допомогою простого оператора на зразок
Масив зліва (той, якому присвоюються значення) повинен бути динамічним, і VBA перевизначити його автоматично відповідно до розмірністю і розмірами масиву справа. Одержує значення масив повинен також допускати зберігання даних того типу, який призначений даними вихідного масиву.
У VBA 5 вам доведеться копіювати дані масиву поелементно, приблизно так: