Обмен информацией между листами Excel и программой на VBA

advertisement
А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 8. Семестр 1
Статические и динамические массивы, чтение/запись
файлов на диск
Содержание
Массивы ...................................................................................................................................................1
Объявление массива ...........................................................................................................................1
Использование массива ......................................................................................................................2
Динамические массивы ......................................................................................................................3
Пять функций для работы с массивами ............................................................................................3
Функция Array .................................................................................................................................4
Функция Erase .................................................................................................................................4
Функция IsArray ..............................................................................................................................4
Функции LBound и UBound ...........................................................................................................4
Пример программы чтения/записи на диск (на 10 точек) ...................................................................5
Массивы
Массивы VBA и других языков программирования весьма схожи; они незаменимы при работе
с большими объемами данных. Попросту говоря, массив — это переменная, содержащая
несколько значений, или еще проще — пронумерованная группа значений одного и того же
типа. Если обычные переменные полезны при работе с одиночными значениями
определенного типа, массив пригодится при действиях с набором значений того же типа.
Конечно, в действительности массивы устроены сложнее хотя бы потому, что они могут
быть многомерными. Каждое измерение массива характеризуется численным индексом.
Одномерный массив — это просто пронумерованный список значений. Он имеет начальную
(первый элемент) и конечную точки (последний элемент); между ними помещены остальные
значения массива, которые не перекрываются и однозначно определяются своими
индексами.
Двухмерный массив более сложен — в него включены наборы списков одной длины.
Часто такие наборы называют таблицами или матрицами. Они состоят из строк и столбцов,
на пересечении которых находятся значения в таблице.
Трехмерный массив можно считать набором таблиц, в котором все таблицы имеют
одинаковые количества строк и столбцов. Трехмерные массивы напоминают рабочую книгу
Excel , содержащую несколько листов. Для доступа к элементу трехмерного массива надо
указывать три координаты — строку, столбец и таблицу, на пересечении которых находятся
значения в таблице. Массивы VBA могут иметь до 60 измерений.
Объявление массива
Действия с массивами очень похожи на действия с переменными. Прежде чем использовать массив, Вы должны его описать и указать, значения какого типа будете в нем
хранить. В массивах используются те же типы данных, что и в одиночных переменных (см.
раздел «Типы данных переменных VBA » на стр. 39), причем массив может содержать только
однотипные значения. Обойти это ограничение легко — создайте массив типа Variant , в
котором можно хранить данные любого типа. Вот пример описания одномерного массива для
данных типа Integer .
Dim NumberArray (10) As Integer
1
А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 8. Семестр 1
Оно ничем не отличается от описания переменной, которое обсуждалось ранее, за
единственным исключением — после имени переменной вводится число в круглых скобках,
указывающее VBA , что Вы объявляете не одиночную переменную, а массив, и
определяющее его структуру. Здесь мы задали только одно число, значит, будет создан
одномерный массив NumberArray , предназначенный для хранения 10 целых чисел. В
действительности число 10 определяет верхнюю границу индексов массива. Если Вы
указываете, что массив должен содержать 10 элементов, VBA по умолчанию полагает, что
номер первого элемента — 1.
Объявление двухмерного массива выглядит так:
Dim TableArray (10, 20) As String
Таблица TableArray состоит из 10 строк и 20 столбцов и содержит до 200 строковых
переменных. И еще один пример — описание трехмерного массива типа Variant :
Dim BigArray (5, 50,100) As Variant
Инструкция Option
Base
Нумерация массивов VBA может начинаться с 0 или 1.
Конкретный способ указан в инструкции Option Base в начале
модуля. Так, Option Base 0 задает нумерацию всех массивов по
умолчанию с 0, a Option Base 1 — с 1. В отсутствие инструкции
Option Base нумерация массивов по умолчанию начинается с 0. Но
в следующих примерах мы для простоты считаем, что она
начинается с 1.
Использование массива
Что можно делать с массивом после его объявления? Вот пример использования
трехэлементного целочисленного массива в программе Ргос25.
Option Base 1
Sub Chap02dProc25_IntegerArray()
Dim Vals(3) As Integer
ValsCD = Int(1OO * Rnd())
Vals(2) = Int(1OO * Rnd())
Vals(3) = Int(1OO * Rnd())
MsgBox "Lottery Numbers: " & Vals(1) &","&_
Vals(2) & ", " & Vals(3) End Sub
В строке З объявлен одномерный массив Vals, содержащий 3 числа типа Integer. В
строках 4—6 элементам этого массива присваиваются значения. Операторы присваивания
для элементов массива выглядят точно так же, как операторы присваивания для
переменных, за исключением того, что надо каждый раз указывать номер элемента,
которому присваивается значение. Номер указан в круглых скобках после имени массива.
Обратите также внимание на формулу в правой части операторов присваивания строки
4—6. В ней для генерации случайного целого числа от 0 до 100 используются встроенные
функции VBA Rnd и Int. Первая из них генерирует действительное случайное число в
интервале от 0 до 1 и может принимать один аргумент «затравочное» число (подробности —
в справочной системе VBA). Функция Int преобразует действительное число в целое, удаляя
все цифры после десятичного разделителя (то есть, всегда округляя до меньшего). Умножая
случайное число, полученное функцией Rnd, на 100 и отбрасывая дробную часть, получаем
случайное целое, принадлежащее диапазону от 0 до 100. Применив эту формулу трижды, мы
зададим в массиве Vals три произвольных целых числа. В строке 7 Ргос25 элементы массива,
каждый со своим индексом, передаются в функцию MsgBox.
В следующем примере мы покажем, как использовать массив типа Variant.
2
А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 8. Семестр 1
Sub Chap02dProc26_VariantArray()
Dim Data(3) As Variant
Data(1) = "Johann"
Data(2) =85
Data(3) = #3/21/1912#
MsgBox Data(1) & ", age " & Data(2) & ", born " & Data(3)
End Sub
Здесь элементам массива присваиваются значения различных типов: первому элементу
— строка, второму — целое число, третьему — дата. Поскольку Data объявлен как массив
типа Variant, его элементам можно присваивать значения любого типа. В строке 6 значения
всех элементов массива передаются в функцию MsgBox для отображения в диалоговом окне.
Динамические массивы
Кроме описанных массивов фиксированного размера в VBA есть массивы еще одного
вида — динамические. До сих пор мы всегда явно указывали размерность массива в
инструкции. При описании динамического массива его размер не указывается. Он
определяется позже, при выполнении кода.
Динамический массив удобен, если Вы предполагаете, что в ходе выполнения программы
его размер может измениться. И в этой ситуации можно сэкономить память: сделайте так,
чтобы размеры массивов точно соответствовали Вашим текущим потребностям. В противном
случае Вы рискуете создать массивы, которые только попусту занимают место — а это плохо
отразится на производительности. Рассмотрим динамический массив подробнее. В процедуре
Ргос29 массив Data4 сначала (с помощью инструкции ReDim) объявлен как одномерный 2элементный массив, а затем как двухмерный 30-элементный.
Sub Chap02dProc29_UseDynamicArray()
Dim Data4() As Variant
ReDim Data4(2)
Data4(1) = Int(1OO * Rnd())
Data4(2) = Int(100 * Rnd())
MsgBox "Lottery Numbers: " & Data4(1) & ", " & Data4(2)
ReDim Data4(10, 3)
Data4(1, 1) = "Johann"
Data4(1, 2) - 84
Data4(1, 3) = #3/21/1912#
MsgBox Data4(1, 1) & ", age " & Data4(1, 2) & _
", born " & Data4(1, 3)
End Sub
Сначала в строке 2 Proc29 мы описали массив Data4 типа Variant, не указывая число
измерений и элементов. В этой инструкции определяется динамический массив, но память
под него не отводится, пока в строке 3 не встречается инструкция ReDim. В ней массив
Data4 объявлен как одномерный 2-элементный массив. В строках 4 и 5 двум элементам этого
массива присваиваются случайные числа. В строке 6 эти числа выводятся в информационном
окне. В 7-й строке инструкция ReDim используется еще раз для описания Data4 как
двухмерного массива, содержащего 30 элементов. Затем элементам первой строки этого
массива присваиваются значения и выводятся в информационном окне. Так, позволяя
поочередно отводить один и тот же массив под разные данные, инструкция ReDim и
динамический массив экономят память при выполнении программы.
Пять функций для работы с массивами
С массивами VBA чаще всего используют пять функций — Array, Erase, IsArray, LBound и
UBound. Сейчас мы кратко расскажем о каждой из них.
3
А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 8. Семестр 1
Функция Array
Она позволяет создавать массив в ходе выполнения программы, без предварительного
описания:
Sub Chap02dProc31_ArrayFunction()
Data6 = Array("Johann", 85, #3/21/1912#)
MsgBox Data6(1) & ", age " & Data6(2) & ", born " & Data6(3)
End Sub
Во второй строке Ргос31 функцией Array создается одномерный 3-элементный массив
типа Variant фиксированного размера. Впрочем, это упрощенная модель. В действительности
Data6 — переменная типа Variant, которая содержит массив, возвращенный функцией Array.
В технические подробности мы вдаваться не будем, поскольку внешне Data6 выглядит и
действует, как обычный массив. Помните, что функция Array всегда возвращает массив
Variant и использует нумерацию, заданную инструкцией Option Base.
Функция Erase
Она используется для удаления данных, хранимых в элементах массива. Если это массив
фиксированного размера, функция Erase лишь очищает его, а память, выделенная массиву,
остается за ним. Динамический массив уничтожается функцией Erase полностью.
Функция IsArray
Эта встроенная функция VBA позволяет проверить, является ли некоторая переменная
массивом. IsArray принимает один аргумент и возвращает True (если переменная является
массивом) или False (если переменная не является массивом). Такая операция полезна,
например, когда Вы вызываете функцию, возвращающую массив, но не уверены, что она
действительно вернет его, а не обычную переменную. Действие IsArray продемонстрировано
ниже.
Sub Chap02dProc34_IsArrayFunction()
Dim Data9(2) As Integer
Dim ArrayBool As Boolean
ArrayBool = IsArray(Data9)
If ArrayBool = True Then
MsgBox "Data9 is an array."
End If
End Sub
Конечно, этот пример не имеет практического смысла, но действие IsArray показано в
нем ясно. Во второй строке объявлен массив, в третьей — логическая переменная ArrayBool.
Далее этой переменной присваивается значение, возвращенное функцией IsArray (True или
False). Инструкция If использована для проверки результата IsArray и вывода сообщения,
если значение переменной ArrayBool равно True Подробно эта инструкция описана в разделе
«Управляющая инструкция If-Then-EIse»
Функции LBound и UBound
Они помогут Вам определить верхнюю и нижнюю границы индексов массива, как
показано в примере на следующей странице.
Sub Chap02Proc35_LBoundAndBound()
Dim Data10(4 To 15) As Integer
MsgBox “The lower bound is ” & LBound(Data10) & “.”
MsgBox “The upper bound is ” & UBound(Data10) & “.”
End Sub
4
А.А.Хамухин. Информатика для направления «Нефтегазовое дело». Лекция 8. Семестр 1
Примечание
Применение этих функций к обычной переменной или
динамическому массиву, не описанному инструкцией ReDim ,
вызывает ошибку при выполнении программы. Чтобы избежать
этого, перед вызовом функций LBound и UBound проверьте
переменную функцией IsArray .
чтение/запись файлов на диск рассказать подробно на следующем примере:
Пример программы чтения/записи на диск (на 10 точек)
Dim Y(2, 10) As Integer
Dim n As Integer
Sub Disk()
Open "c:\2050.txt" For Input As #1
Open "c:\IVANOV.txt" For Output As #2
While Not EOF(1)
Input #1, n
MsgBox n
Wend
For i = 1 To n
Print #2, Y(1, i), Y(2, i)
Next i
Close #1
Close #2
End Sub
5
Download