Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Приемы программирования в среде Visual Basic for Application. Учебное пособие
.pdf
• получить на число
X=Application.InputBox("Укажите ячейку", , , , , , , 1)
• получаем ссылку на указанную ячейку
Set X=Application.InputBox("Укажите ячейку", , , , ,
, , 8)
в данном случае мы создаем объект и присваиваем ему данные объекта,
с которым мы хотим работать.
Отметим, что в справочной системе подпрограмма
МsgВох
называется функцией, т.к. ее можно использовать в арифметических
выражениях. При этом в программу возвращается значение типа
Integer
тель. Приведем пример использования
, соответствующее кнопке, на которой кликнул пользова-
В программу
Pythagoras
этого:
введем расчет площади прямоуголь-
ного треугольника. Для этого седьмой оператор заменим тремя операторами:
Sub Pythagoras()
Dim a As Single
Dim b As Single
Dim c As Single
Dim s As String
1: s = _
InputBox ("Введите длину 1 катета и нажмите ОК")
2: a = Val(s)
3: s = _
InputBox ("Введите длину 2 катета и нажмите OK")
4: b = Val(s)
5: c = Sqr(a^2 + b^2)
6: s = Str(c)
Dim Ret As Integer
Ret = MsgBox(s, vbYesNo, "Paccчитать площадь?")
If Ret = vbYes Then MsgBox Str(a * b / 2)
End Sub
При выполнении полученной программы изменится содержимое
окна с результатом расчета длины гипотенузы (рис.15). При клике на
кнопке Уеs появится окно с результатом расчета площади треугольника (рис.16).
В ряде заданий вам надо будет получить набор произвольных данных, с которыми надо выполнить некоторые операции (найти максимальное или минимальное число, отсортировать, найти первое положительное или отрицательное число и т.п.). В этом случае можно пользо-
- 61 -

ваться генератор случайных чисел с помощью функции «Rnd()».
Рис.15. Первое окно с результатом
расчета
Рис.16. Второе окно с результатом
расчета
Функция возвращает случайное число в интервале от 0 до 1 с равномерным распределением. Для получения различных наборов можно
строить различные комбинации вычислений с использованием этой
функции:
Public Sub InputDates()
Dim X() As Integer
N = InputBox("Введите размер массива(от 2 до 10")
ReDim X(N)
For i = 0 To N
X(i) = Rnd() * 50
Next i
End Sub
Здесь мы генерируем N целых чисел в интервале от 1 до 50 в виде одномерного массива Для генерации, например, чисел в интервале
от -25 до 25 надо в строку
X(i) = Rnd() * 50
дописать
- 25
Чтобы получить вещественные числа достаточно просто описать массив как
Double
.
Можно записать общую формулу для генерации чисел в заданном
диапазоне, которая будет иметь вид
– начало набора, dX – размер диапазона и
X=Xнач +СлЧисло*dX
СлЧисло
– случайное число.
, где
Хнач
Приемы работы в среде программирования VBA
Теперь разберем пошагово весь процесс создания своей программы, начиная от простой функции пользователя до создания своей
оконной формы пользователя.
Запуск среды VBA
Находясь в любом пакете MS Office, можно вызвать оболочку VBA
комбинацией клавиш Alt+F11 или по следующей команде Сер-
висМакросРедактор Visual Basic. Открывается окно похожее
.
на рис.1 в зависимости от настроек системы. Переходы между оболоч-
- 62 -

кой программирования и самим пакетом происходят через указанную
выше комбинацию горячих клавиш Alt+F11.
Создание функции пользователя
Создадим свою функцию, например, нам нужно часто использовать какое-либо достаточно большое уравнение. Назовем функцию
«My_fun» и в дальнейшем будем использовать в наших расчетах. В
качестве простейшего примера создадим полином следующего вида:
2
XAXAAY ⋅+⋅+=
210
В первом варианте примем, что наши коэффициенты А0, А1 и А2
известны и имеют соответственно следующие значения 21, 5 и 0.5.
Нам надо задать значение Х и получить значение Y. Начинаем создавать свою первую программу.
Сначала вставляем в наш проект новый модуль, который собственно и содержит программный код. Для этого выполняем команду
InsertModule, здесь нельзя ошибаться и выбрать не Module, а
Class Module, который создаст специальный модуль нового объекта,
что нам пока не надо. В рабочей области экрана появляется чистая
область модуля, куда теперь можно вносить программный код.
Теперь можно вводить программу, хотя гораздо проще пользоваться мастерами создания необходимых процедур. Для этого выполняем команду InsertProcedure,
которая была до создания модуля не
активна. Появляется окно, показанное на рис.17. В нем заполняем необходимую информацию. Вносим
имя процедуры (Name) – это может
быть любое имя, которое начинается с русской или латинской буквы и
может содержать также цифры и
Рис.17. Вставка процедуры
знак подчеркивания, если хотите
разделить слова в имени.
Обязательно помните, что начинать имя процедуры с циф-
ры и ставить пробелы внутри него недопустимо!!!
Во-вторых, выбираем тип процедуры – функция (Function), так
как мы хотим иметь ее в качестве функции пользователя на листах
данной книги. Затем выбираем область видимости процедуры
- 63 -

(Scope) как общую (Public). Если мы укажем ее как внутреннюю
(Private), то она не будет видна на листах книги. Данное свойство
надо использовать только для внутренних процедур, о которых разговор будет далее. Теперь можно нажимать кнопку Ok, и в окне модуля
получаем заготовку самой процедуры в виде следующего текста:
Public Function My_fun()
End Function
Начинаем писать программный код. Так как функция имеет
входной параметр Х, то мы должны внести его имя в строку после
имени процедуры внутри скобок. В пустую строку записываем код
вычисления значения Y, используя правило – надо присвоить к пе-
ременной с именем процедуры (без скобок, которые имеются в заголовке) возвращаемое значение. Самый простой вариант записи
будет выглядеть так
Public Function My_fun(X)
My_fun = 21 + 5 * Х + 0.5 * Х ^ 2
End Function
Если необходимо выполнить более сложные вычисления, то перед присвоением результата имени функции могут располагаться и
другие операторы. Это может выглядеть так
Y = 21 + 5 * Х + 0.5 * Х ^ 2
My_fun = Y
Теперь надо сохранить книгу Excel и перейти на ее рабочий
лист и попробовать использовать созданную
функцию. Для этого на
листе книги Excel в
ячейку А1 введем любое число, например,
10
,
и в ячейку В1 запишем
следующую формулу
«=My_fun(A1)
». Для
этого вводим знак =, который автоматически
вызывает мастер создания функции (рис.18.),
Рис.18. Мастер построения функций
- 64 -

выбираем категорию функции – Определенные пользователем,
и в списке видим имя созданной нами функции, выбираем ее и нажимаем Ok. Далее открывается окно мастера этой функции (рис.19), где в
поле Х вводим ссылку на ячейку А1. Внизу окна сразу же выводится
результат вычисления.
Теперь попробуем сделать данную функцию более гибкой в своем использовании. Сделаем коэффициенты уравнения параметрическими, то есть они будут передаваться как аргументы функции.
Рис.19. Окно ввода аргументов в функцию пользователя
Внесем следующие изменения в программный код функции: добавим за именем функции в скобках перед параметром Х новые имена
в список формальных параметров и пропишем их в самой функции.
Для этого заменим наши константы 21, 5 и
0.5
в вычисляемом урав-
нении на соответствующие параметры А0, А1, А2.
Чтобы сохранять все созданные процедуры, будем перед исправлениями копировать весь код и изменять имя процедуры, добавляя к нему очередной номер. В приведенном ниже примере имя
функции изменено на
Public Function My_fun1(A0, A1, A2, X)
My_fun1 = A0 + A1 ^ X + A2 * X ^ 2
End Function
My_fun1
.
Чтобы использовать эту функцию на листе книги, необходимо
подготовить исходные данные на листе. Для этого введем в ячейки
А1–А3 имена коэффициентов, чтобы наглядно видеть в какие ячейки
вводить исходную информацию, и сразу же иметь готовую таблицу
для ее использования в отчетах. В ячейки В1–В3 введем значения
самих коэффициентов уравнения.
- 65 -

Попробуем подготовить таблицу значений нашей функции. Для
этого сделаем заготовку таблицы, введя заголовки столбцов X и Y в
ячейки D1 и E1. Значение параметра Х введем в столбец D. В ячейки D2
и D3 введем
выделив ячейки
маркер заполнения (это черный в
правом нижнем углу выделенных ячеек),
растянем эти данные до числа 22 (таблица
справа). Теперь введем саму функцию в
ячейку Е2, используя мастер функций, и
увидим окно с аргументами функции
(рис.20). Оно изменилось, в нем появились
10
и
10
и
12
соответственно,
12
и схватив за
A0
A1
A2
21
5
0,5
X
10
12
14
16
18
20
22
дополнительные параметры – коэффициенты уравнения. Введем необходимые данные, причем значения коэффициентов вводим как ссылки
на ячейки с абсолютной адресацией, используя клавишу F4.
После ввода функции, растягиваем эту формулу с помощью
маркера заполнения на группу ячеек Е3 – Е8.
Попробуем создать следующую функцию
My_fun2
, которая будет вычислять полином любого порядка. Ее аргументами должны
быть – степень полинома (N), массив коэффициентов Ai из N+1 элементов и значение параметра Х. Программа показана ниже. Рекомендуем создать заготовку процедуры
My_fun2
, как было показано выше, и в заголовок ввести формальные параметры, а внутри заготовки
записать сам код
Рис.20. Окно ввода аргументов в функцию пользователя My_fun1
- 66 -

Public Function My_fun2(N, Ai, X)
Dim Aa()
ReDim Aa(N)
i = 0
For Each Cl In Ai.Cells
Aa(i) = Cl.Value
i = i + 1
Next
Y = Aa(0)
For i = 1 To N
Y = Y + Aa(i) * X ^ i
Next i
My_fun2 = Y
End Function
Разберем процедуру более подробно. Первая строка после заголовка описывает динамический массив. Во второй строке массив переопределяется под необходимый размер, здесь мы указываем его
размер N. Далее заполняем его значениями коэффициентов, перебирая
все ячейки, которые переданы в качестве аргумента Ai в процедуру, и
присваивая их значения элементам массива коэффициентов Аа. Подготавливаем переменную Y для суммирования членов полинома, приравнивания ее нулевому коэффициенту полинома. Потом реализуем
алгоритм вычисления полинома любого порядка суммированием коэффициентов, умноженных на значение Х в степени равной индексу
коэффициента. Введем третью функцию на наш лист. Окно ввода аргументов функции показано на рис.21.
- 67 -

Рис.21. Окно ввода аргументов в функцию пользователя My_fun2
10
12
Список коэффициентов уравнения вводится как группа ячеек,
которые так же задаются абсолютным адресом.
Попробуем свести все результаты вычислений в одну таблицу
для оценки точности их результата. Как видим, результат вычисления
во всех случаях остается одинаковым (см. таблицу ниже).
A0 21
A1 5
A2 0,5
14
16
18
20
22
X My_fun My_fun1 My_fun2
121
153
189
229
273
321
373
121
153
189
229
273
321
373
121
153
189
229
273
321
373
Создание макрокоманды (макроса)
Макрокоманды – это укрупненные наборы стандартных команд,
которые могут выполняться одновременно друг за другом. Макрокоманды оформляются как подпрограммы (Sub) и могут вызываться по
команде Excel СервисМакросы… или комбинацией горячих кла-
виш Alt+F8. По ней открывается окно со списком всех, имеющихся в
проекте макросов, из которых надо выбрать нужный и нажать кнопку
Выполнить.
При создании макроса можно существенно упростить процесс
программирования, воспользовавшись режимом записи макроса по
команде Excel Сервис Начать Запись….
Попробуем создать макрос, который будет форматировать
фрагмент листа, как показано на таблицах выше: наружная рамка будет нарисована двойной линией, а внутренние линии – одинарными
линиями.
Каждая отдельная программа или группа связанных между собой программ могут располагаться в своем модуле, их число в проекте не ограничено, но названия программ должны быть разными. Поэтому для нашей новой процедуры лучше создать новый модуль, но
мы этого пока делать не будем, а познакомимся с записью макроса.
Начнем запись нашего макроса по команде Excel Сервис
Начать Запись…. Появляется окно, в котором должны быть запол-
- 68 -

нены исходные данные по записываемому макросу (рис.22). Здесь
можно задать имя макроса, сочетание горячих клавиш, которыми он
будет вызываться, и внести небольшой комментарий к подпрограмме.
После нажатия кнопки Ok по-
является панель инструментов с элементами управления записью, и начинается запись. Теперь все команды, которые мы выполняем, записываются в кодах VBA. Выполним
следующие действия на новом листе
книги:
• выделим несколько ячеек в виде
Рис.22. Окно параметров макроса
прямоугольника, например, прямоугольник из 3 столбцов и 5
строк;
• вызовем команду форматирования ячеек с помощью горячих клавиш
Ctrl+1 или по команде ФорматЯчейки. В открывшемся окне
выбираем закладку Границы (рис.23);
Рис.23. Оформление границ ячеек
• на ней выбираем тип линии «двойная» и щелкаем по кнопке
Внешние на панели Все;
- 69 -

• потом выбираем тип линии «одинарная» и щелкаем по кнопке
Внутренние на панели Все;
• заканчиваем запись макроса, нажимая кнопку Остановить за-
пись.
Переходим в VBA и смотрим изменения в нашем проекте. Там
появился новый модуль2, и в нем подпрограмма
Макрос1
, которая
имеет следующее содержание
Sub Макрос1()
' Макрос1 Макрос
' Макрос записан 02.09.2007 (Ves)
'
Range("B3:D7").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlDouble
.Weight = xlThick
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
- 70 -
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
