- •Лабораторный практикум по информатике для студентов очной формы обучения
- •Часть II. Visual Basic for Applications
- • Иркутский государственный технический университет, 2002
- •664074, Иркутск, ул. Лермонтова, 83
- •Введение
- •Создание интерфейса пользователя
- •Элементы управления
- •2. Основные понятия
- •3. Редактор vba
- •4. Работа с переменными, массивами, константами и со свойствами объектов
- •5. Основные инструкции языка Visual Basic
- •Арифметические операции
- •6. Создание пользовательских форм
- •7. Отладка приложений
- •Р ис. 4. Окно контрольного значения
- •8. Лабораторные работы
- •Vba1. Создание простейшего интерфейса. Калькулятор
- •Vba2. Разветвления
- •Vba3. Переменные, процедуры, функции, циклы, массивы
- •Vba4. Сортировка чисел в столбце по возрастанию или убыванию
- •Vba5. Сортировка чисел в столбце по возрастанию или убыванию с созданием формы
- •Vba6. Создание приложения для вычисления многочленов
- •Vba7. Сортировка чисел в столбце по возрастанию или убыванию с созданием формы и панели инструментов с кнопкой
- •9. Самостоятельные и контрольные задания Задание 1
- •Задание 2
- •Задание 3
- •Задание 4
- •Задание 5
- •Разработка приложения “Решение системы линейных уравнений”
- •2. Разработка приложения “Статистический анализ данных”
- •Разработка приложения “Решение треугольника”
- •Разработка приложения “Определение площади произвольной фигуры”
- •Разработка приложений “Графические построения в плоскости xoy”
- •Разработка приложения “Вычисление определенного интеграла”
- •Интегрирование по методу прямоугольников
- •Интегрирование по методу трапеций
- •Метод Симпсона (парабол)
- •Решение нелинейных уравнений
- •Определение границ существования корней
- •Отделение корней
- •Уточнение корней
- •8. Решение систем линейных алгебраических уравнений
- •По коэффициентам системы составляют расширенную матрицу
- •По элементам последней строки матрицы (1.2) можно найти значение
- •9. Приближенные методы решения систем алгебраических уравнений
- •10. Интерполяция функций, заданных таблично
- •11. Допольнительные курсовые работы для студентов горно-геологических специальностей
- •1. Вычисление координат замкнутого теодолитного хода
- •2. Разработка приложения “Прямая геодезическая задача”
- •3. Разработка приложения “Обратная геодезическая задача”
- •4. Разработка приложения “Преобразование географических координат в прямоугольные и прямоугольных в географические”
- •Литература к курсовой работе 4.
4. Работа с переменными, массивами, константами и со свойствами объектов
Приложение, созданное средствами VBA и встроенное в рабочую книгу Excel, хранит исходные, промежуточные данные и результаты их обработки в таблицах и отдельных ячейках на листах книги Excel, в переменных, в массивах переменных и в виде констант, а также в виде значений свойств объектов – элементов управления. Кроме того, VBA предоставляет средства для чтения данных из файлов и для записи в файлы. Для работы с данными используются инструкции языка программирования, процедуры и функции, но все эти средства рассчитаны на работу с данными определенных типов. Рассмотрим встроенные типы данных VBA (Таблица 2). Возможности конструирования в приложении собственных типов данных поясним позже.
Таблица 2.
Встроенные типы данных VBA
Тип данных |
Размер в байтах |
Разрядность (цифр) |
Диапазон, пояснение |
Boolean Byte Integer Long Single
Double Currency
Date String Object
Variant |
2 1 2 4 4
8 8
8 1+L 4 |
1 ≤ 3 ≤ 5 ≤ 10 ≤ 7
≤ 15 ≤ 19
|
True, False - логические значения 0, 255 - целые положительные числа -32768, 32767 – целые числа -2147483648, 2147483647 – длинные целые -3.402823.1038, -1.401298.10-45– отрицательные числа 1.401298.10-45, 3.402823.1038 – положительные числа Действительные числа с двойной точностью Действительные числа с 4 знаками после десятичной точки. Используются для точных денежных расчетов 01.01.0100, 31.12.9999 - даты Строка из L символов; L≤ 65535 Объект – фактически, ссылка на него, т.е. адрес его размещения в оперативной памяти Может принимать любой тип данных, т.е. настройка на тип операнда происходит во время исполнения инструкций или процедур |
Когда при разработке приложения возникает необходимость в переменной для хранения данных, ее описывают в модуле перед процедурами или в конкретной процедуре. В первом случае переменная будет доступна всем процедурам модуля (как контейнер общего пользования), а если в ее описании применено ключевое слово PUBLIC, то переменную смогут использовать даже процедуры других модулей. Такую переменную называют глобальной. В ней удобно размещать данные, требуемые многим процедурам. Переменная, описанная внутри процедуры, называется локальной – она используется только в этой процедуре, а в других могут быть переменные с таким же именем. Инструкция, содержащая описание переменной, имеет вид:
Dim ИмяПеременной As ТипДанных
Для определения глобальной переменной вместо Dim пишут Public. Пример описания переменных:
Public Nprof, X0 As Single, Y0 As Single
Dim I As Integer, J As Integer, Date1 As Date, Date2 As Date, ФИО As String*32
Nprf=40
При описании переменной ФИО, кроме ее имени и типа, указана длина в байтах. Длину можно назначать (хотя это не обязательно) для строковых переменных. Для переменной Nprof тип вообще не указан – по умолчанию ей будет назначен тип Variant – это удобно для программиста, но не экономично: число в формате Variant занимает 16 байт, а строка – 22 байта плюс по 1 байту на каждый символ. Переменные типа Variant могут хранить следующие значения:
Empty - не получила начального значения. Переменная типа Variant, содержащая значение Empty, рассматривается как 0 в контексте математических операций и как пустая строка ("") в контексте операций со строковыми значениями.
Null - не содержит данных, это значение можно присвоить переменной.
Error - является специальным значением, которое используется для указания возникновения условия ошибки в процедуре.
VBA позволяет использовать переменные без предварительного описания, поэтому переменная Nprf сразу используется в инструкции присваивания. Она имеет тип Variant по умолчанию. Такой стиль “ввода в действие” переменных довольно опасен, т.к затрудняет поиск ошибок. ПоэтомуVBA позволяет наложить требование на явное описание всех переменных в модуле. Для этого в описательную часть модуля (до процедур) надо включить инструкцию Option Explicit. Если теперь попытаться использовать в тексте процедур необъявленные переменные, VBA сразу обнаружит ошибки.
Иногда имена записывают так: Номер_строки или НомерСтроки. Применение полных имен особенно полезно для глобальных переменных, которые хранят параметры моделируемых объектов и явлений. В компактных процедурах удобнее пользоваться переменными, применяемыми в математике и физике, например: X – координата, M – число строк в матрице или таблице, i – номер очередной строки, N – число столбцов, j – номер текущего столбца, V – скорость, S – путь и т.п.
Кроме возможности явного задания типа переменной, VBA позволяет указать тип переменной неявно, добавив к ее имени символ-указатель:
$ - для типа данных String, например, ФИО$ = ”Иванов И.И.” ;
% - для данных типа Integer, например, i% = 1;
& - для данных типа Long, например, CX& = 6510200;
! - для данных типа Single, например, x! = 107.315;
# - для данных типа Double, например, Pi# = 3.14159;
@ - для данных типа Currency, например, SS@ = 67920.12
Такой подход вряд ли стоит рекомендовать, но иногда он может способствовать наглядности.
Наряду с переменными, для хранения данных во время работы приложения используются массивы переменных, или просто массивы. Массив описывается так же, как одиночная переменная, только после имени в скобках указывается еще размерность:
Dim V(1 to 200) As Single, T(1 to 200) As Single, i As Integer
Так можно описать массивы измеренных значений скорости и времени. При вычислениях i-ый элемент массива указывают с помощью индекса:
S=S+(V(i)+ V(i+1))*0.5*(T(i+1)-T(i))
Если при описании массива размерность задать одним числом, например, V(200), то будет считаться, что нумерация элементов массива начинается с 0 и оканчивается числом 200. Если в описательную часть модуля (до процедур) включить инструкцию Option Base 1, то нумерация элементов массива будет начинаться с 1. Кроме одномерных массивов, используются многомерные. Предположим, что на листе Excel в первом столбце размещены идентификаторы строк, например, Y1,Y2,…,YI,…,YM , а в первой строке – идентификаторы столбцов: X1,X2,…,XJ,…,XN. На пересечении I-ой строки и J-го столбца находится элемент aIJ
матрицы (Рис.2.).
В этом примере матрица представляет собой таблицу коэффициентов, позволяющих связать любой YI уравнением со значениями X1,…,XN:
YI=aI1*X1+aI2*X2+…+aIJ*XJ+…+aIN*XN
Другими словами, мы имеем матричную запись системы линейных уравнений. Пусть для последующей работы с матрицей требуется задать M, N, разместить идентификаторы YI (I=1,…,M) и XJ (J=1,…N) в массивах CY, CX, а элементы матрицы в двумерном массиве A(I,J).
Этот пример иллюстрирует часто встречающуюся ситуацию: в момент составления программы обычно не известно количество элементов массива – оно определяется программой во время исполнения. Если заранее можно оценить максимальную длину массива, то его часто резервируют с расчетом на максимальную размерность. Так, в нашем случае можно принять ограничение: разрабатываемая программа предназначается для работы с матрицами, у которых число строк и столбцов не превышает 40. Тогда инструкция для резервирования массивов будет иметь вид:
Dim CY(1 to 40), CX(1 to 40), A(1 to 40,1 to 40) As Double
Visual Basic предоставляет и другую возможность – динамического переопределения размерности массивов.
При резервировании массива размерность не указывается. Например, Dim a() as Single.
В процедуре вычисляется необходимый размер массива и присваивается некоторой переменной n.
Выполняется изменение размерности массива: Redim a (1 to n)
Допустимо повторное использование инструкции Redim
Рассмотрим следующий модуль:
Option Explicit
Dim CY( ), CX( ), A( ) As Double
Dim I As Integer, J As Integer, M As Integer, N As Integer
Private Sub CommandButton1_Click( )
N=TextBox1.Value : M=TextBox2.Value 'Определение M, N - размерности матрицы
ReDim CY(1 To M)
ReDim CX(1 To N) 'Изменение размерности массивов
ReDim A(1 To M, 1 To N)
TabCXCY ' Копирование идентификаторов столбцов и строк в массивы CX, CY
TabA ' Копирование матрицы в массив A
End Sub
Private Sub TabCXCY( )
For J = 1 To N
CX(J) = Cells(1, J + 1).Value 'Идентификаторы столбцов
Next J
For I = 1 To M
CY(I) = Cells(I + 1, 1).Value 'Идентификаторы строк
Next I
End Sub
Private Sub TabA( )
For I = 1 To M
For J = 1 To N
A(I, J) = Cells(I + 1, J + 1).Value
Next J
Next I
End Sub
Этот модуль содержит событийную процедуру CommandButton1_Click, решающую поставленную выше задачу при нажатии кнопки на листе Excel (на рис. 2 показана только сама матрица, причем символически), и общие процедуры: TabCXCY – копирование идентификаторов столбцов и строк в массивы CX, CY; TabA – копирование матрицы из таблицы на листе Excel в двумерный массив A; M и N вводятся в поля TextBox1 и TextBox2.
Массивы CX, CY, A и основные переменные, требуемые для работы с матрицей, определены на уровне модуля, т.е. доступны всем его процедурам. Элементы массивов CX и CY имеют тип VARIANT, т.к. для них тип явно не указан. Выбор типа VARIANT для этих массивов обусловлен тем, что при последующем расширении написанного модуля в этих массивах, возможно, потребуется размещать не имена строк и столбцов, а сами значения YI и XJ. Обратим внимание на то, что все три массива в начале модуля определены без указания размерности, т.е. как динамические, а в процедуре CommandButton1_Click наши массивы переопределены – но только после ввода M и N. Приведенные процедуры еще пригодятся для пояснения циклов и как пример для самостоятельной разработки процедур на лабораторных занятиях.
Завершая рассмотрение массивов, заметим, что в математике аналогом программисткого термина одномерный массив является понятие вектор. Вектор можно и нужно толковать не только геометрически: в общем случае это набор значений, например, свойств (признаков) объекта. Если представить себе многомерную систему координат, где по каждой оси отложено значение одного из свойств объекта (скажем, длина автомобиля, расход горючего, максимальная скорость и т.д.), то каждый объект в такой системе координат будет точкой – точкой в признаковом пространстве. Совокупность значений отдельных координат (в нашем примере – длины автомобиля, расхода горючего, максимальной скорости и др.) и есть вектор. Понятие вектора очень удобно для краткой записи операций с массивами чисел. Кстати, математический термин матрица соответствует двумерному массиву. Матрицу можно рассматривать как совокупность векторов-строк или векторов-столбцов.
Теперь рассмотрим конструирование собственных типов данных. Например, для хранения записей о книгах определим в начале модуля тип данных RecBook с помощью инструкции:
Type RecBook
Название As String*50
Автор As String*20
Издательство As String*16
Год As Integer
End Type
Теперь в этом же модуле или в одной из его процедур зарезервируем массив для хранения записей о книгах:
Dim Books(500) As RecBook
Для доступа к полям Издательство и Год в i-ой записи массива воспользуемся инструкциями:
Books(i).Издательство=”Недра” : Books(i).Год=1999
В этом пособии мы намеренно пользуемся примерами, а не строгими определениями синтаксиса инструкций VBA. Как уже отмечалось, такие определения легко получить в справочной системе Visual Basic – когда программист тонет, он кричит <F1> !
Кроме переменных, в программах используются данные, значения которых не изменяются – это константы. Приведем примеры их определения:
Const Pi As Double = 3.14159
Const Nmin As Long = 0
Const Nmax As Long = 999999
Определив константы один раз, например, в начале модуля, ими можно пользоваться во многих инструкциях, не вспоминая каждый раз точное значение числа π. Если же в процессе разработки программы потребуется изменить ограничение Nmax , то это надо будет сделать в единственной инструкции.
Некоторые данные во время работы приложения могут храниться в качестве свойств объектов: свойств ячеек листа Excel, свойств элементов управления и др. Приведем примеры:
Лист2.Cells(2,6).Formula = “=Sum(B1:B5)”
Лист2.Range("A1:D4").Value = Range("A1:D4").Value
TextBox1.Text = “M=” & Str(M) & “ S=” & Format(S, “0.00”)
В первом примере свойству Formula объекта Cells(2,6) , принадлежащего, в свою очередь, объекту Лист2, присваивается конкретная формула. Этот пример, кстати, показывает, как при программировании на VBA можно пользоваться встроенными в Excel формулами. Но верно и обратное: разрабатывая функции на VBA, можно расширить набор формул, доступных в Excel. Во втором примере значения, хранимые в прямоугольной области ячеек на текущем (активном в момент выполнения инструкции) листе, присваиваются ячейкам одноименной области на листе 2. В третьем примере с помощью операции конкатанации (&) три подстроки объединяются (суммируются) в одну строку, и эта строка присваивается свойству Text объекта TextBox1. Cells (Row,Column) обозначение ячейки, где Row - номер строки, а Column - номер столбца. Например, ячейка A2 обозначается Cells(2,1). Последний пример показывает, как значения M и S вывести в поле, размещенное на форме или на листе Excel.