
С.Н.
Зятикова
Учебно-методическое
пособие
по курсу
«Visual Basic
for applications»
Содержание
Пункт
1. Введение в VBA. Элементы среды разработки программ VB. Переменные. Две основные
функции преобразования типов данных. Константы. Синтаксис оператора
присваивания……….…………………………………………..
|
3
|
Пункт
2. Арифметические выражения. Математические функции. Логические
выражения………………………….……………..
|
6
|
Пункт
3. Оператор перехода. Конструкция принятия решений………………………………......................................................
|
8
|
Пункт
4. Циклы……………….………………………………………………
|
11
|
Пункт
5. Массивы…………………………………………………………….
|
13
|
Пункт
6. Пользовательские процедуры………………………………..
|
16
|
Пункт
7. Использование стандартных окон операционной системы
WINDOWS…………………………………………………………...
|
19
|
Пункт
8. Работа со строками…......................................................
|
20
|
Пункт
9. Работа с текстовыми файлами…………………..………..
|
22
|
Пункт
10. Загрузка формы. Макросы…………………………………..
|
27
|
Пункт
11. Объекты и события…………………………………………..
|
29
|
Visual Basic for
Applications (VBA)
Пункт 1. Введение в VBA.
Элементы среды разработки программ VB. Переменные. Две основные функции
преобразования типов данных. Константы. Синтаксис оператора присваивания.
Решение какой-либо задачи с помощью компьютера требует
ввода в него последовательности команд, которая называется программой.
Программы пишутся на том или ином алгоритмическом языке. К настоящему времени
разработано множество алгоритмических языков: Pascal, Object Pascal, C, C++, Basic и
др.
Мы будем изучать Visual Basic (VB). Выбор языка объясняется тем, что VB
используется в популярном пакете Microsoft Office. При работе с офисными приложениями мы будем
использовать язык Visual Basic for Applications (VBA), являющийся расширением VB. VBA-код
позволяет расширить возможности таких приложений, улучшить пользовательский
интерфейс.
Для входа в среду VB надо в Excel выполнить Сервис > Макрос > Редактор VB. В
результате откроется окно Microsoft VB, в котором можно выполнять различные
действия: ввод и редактирование текста программы, ее отладку и выполнение.
Основные элементы среды VB:
1.
строка меню. В ее состав
входят все меню, которые используются при создании программы.
2.
контекстное меню. Служит
для удобства выполнения действий, относящихся к той области окна среды VB, в
которой находится указатель мыши.
3.
панели инструментов: Standart,
Edit, Debug и др. По умолчанию отображается только
стандартная панель инструментов Standart.
В окне кода набирается текст программы. Первая и последняя
строки программы стандартные
Sub
имя ( )
End Sub
Между первой и последней строками набираются остальные
строки программы. Ввод строки оканчивается нажатием клавиши Enter.
Например, расчет длины гипотенузы прямоугольного
треугольника с катетами 3 и 4 по теореме Пифагора.
Sub Пифагор ( )
a = 3
b = 4
c = Sqr (a ^ 2 + b ^ 2)
End Sub
Sqr –
операция извлечения квадратного корня.
Если для наглядности оператор следует разместить на
нескольких строках, то для переноса следует использовать символ пробела с
последующим символом _. Если несколько операторов следует разместить на одной
строке, то между ними надо поставить двоеточие и символ пробела. Комментарии
обозначаются апострофом.
Например,
Sub
Пифагор ( )
a = 3 :
b = 4
c = _
Sqr (a ^ 2 + b ^ 2) ‘согласно
теореме Пифагора
End Sub
Перед тем, как использовать переменную, ее
рекомендуется описать (объявить).
Синтаксис оператора описания переменной:
Dim
переменная [As тип]
В этой конструкции:
§
Dim – ключевое слово, свидетельствующее о том, что
объявляется переменная (dimension - размер);
§
As – ключевое слово, используемое при задании типа
данных (as - как);
§
Переменная – имя
объявляемой переменной;
§
Тип – тип данных для
объявляемой переменной.
Одним оператором Dim можно описать несколько переменных,
перечислив их через запятую, например,
Dim a, b, c
Если в окне кода отсутствует строка
Option Explicit
то переменные в VB можно не описывать.
Однако часто это приводит к ошибкам в программе,
которые трудно «вылавливать». Поэтому рекомендуется среду настроить так, чтобы
она требовала описания переменных. Для этого надо:
1)
в среде VB
открыть меню Tools (Сервис);
2)
выбрать пункт Options (Параметры);
3)
открыть вкладку Editor (Редактор);
4)
включить опцию Require Variable Declaration
(Явное описание переменных), поставив галочку;
5)
нажать Ok.
В результате в окне кода первой будет строка вида
Option Explicit
Если при описании переменной не указан тип данных, то
переменной автоматически будет присвоен тип Variant.
Рассмотрим оператор
Dim i, j As Integer
Этот оператор эквивалентен следующему:
Dim i As Variant, j As Integer
Если мы хотим, чтобы обе переменные имели тип Integer,
то должны их описать так:
Dim i As Integer, j As Integer
или
Dim i As Integer
Dim j As Integer
Пример. Программа расчета количества дней в 20 веке и
определения текущей даты и времени.
Sub Век_20()
Dim d1 As Date
Dim d2 As Date
Dim n As Long
d1 = #1/1/1900# 'начало века
d2 =
#12/31/1999# 'конец века
n = d2 - d1 + 1 'количество
дней
d1 = Now 'текущая
дата и время
End Sub
Часто бывает необходимо преобразовать число в строку.
Для этого используется функция Str. Аргументом этой функции является число,
значением – строка. Для обратного преобразования (то есть строки в число)
используется функция Val. Если функция Val этого сделать не
может, то она возвращает 0.
Наряду с переменными в VB используются
константы. Существует 2 разновидности констант: пользовательские и встроенные.
Пользовательские константы требуют объявления. Для этого используется
оператор вида
Const константа [As тип] = значение
Примеры объявления констант:
Const pi As Currency = 3.1416
Const Message = “Завершение
работы”
Const Millennium As Date = #1 Jan 2000#
При помощи одного оператора Const
можно объявить несколько констант, перечислив их через запятую.
Пример:
Const Min = 0, Max = 1000, Flag As Boolean = False
Встроенные константы не требуют объявления.
Имена встроенных констант начинаются с префикса vb,
например, vbFriday (число 6; Friday - пятница).
Встроенные константы Excel имеют префикс xl.
Оператор присваивания имеет следующий синтаксис:
переменная = выражение
При выполнении оператора присваивания может
происходить преобразование типа данных.
Пункт 2. Арифметические выражения. Математические
функции. Логические выражения.
В числе дробная часть от целой отделяется точкой.
Существует экспоненциальная форма представления чисел. Например, десятичное
число 0.095 = 9.5 10-2
может быть записано в виде 9.5Е-2.
Примеры выражений
Математическое выражение
|
Арифметическое выражение VB
|

|
5 * x
+ 12 * y
|

|
x / y
|

|
y ^ x
|

|
x
|

|
19.55E-6
|
Арифметические операции: + (сложение), - (вычитание),
* (умножение), / (деление), ^ (возведение в степень), \ (целочисленное деление,
то есть деление целых чисел с отбрасыванием остатка), Mod
(определение остатка от деления целых чисел, являющегося целым числом).
Приоритет выполнения операций:
1)
возведение в степень (^);
2)
умножение, деления (*, /,
\)
3)
определение остатка от
деления (Mod);
4)
сложение и вычитание (+,
-)
Если тип переменной в левой части оператора
присваивания не совпадает с типом, полученным при вычислении значения выражения
в правой части оператора присваивания, то при выполнении оператора присваивания
производится преобразование типа. Так, при Integer слева и Double справа производится округление результата до
целого.
Операции \ и Mod применимы только к целым числам. Результаты
выполнения этих операций так же являются целыми числами.
Функции преобразования типов данных
Название функции
|
Получаемый тип данных
|
CBool
|
Boolean
|
CByte
|
Byte
|
CCur
|
Currency
|
CDate
|
Date
|
CDbl
|
Double
|
CInt
|
Integer
|
CLng
|
Long
|
CSng
|
Single
|
CStr
|
String
|
CVar
|
Variant
|
Основные математические функции в VB:
Обращение к функции
|
Возвращаемое значение
|
Abs(x)
|

|
Atn(x)
|

|
Cos(x)
|

|
Exp(x)
|

|
Fix(x)
|
Результат отбрасывания дробной части х
|
Int(x)
|
Наибольшее целое число, не превосходящее х
|
Log(x)
|
Натуральный логарифм х
|
Sgn(x)
|
1, 0 или -1 в зависимости от знака х
|
Sin(x)
|

|
Sqr(x)
|
Квадратный корень из х
|
Tan(x)
|

|
Аргумент тригонометрических функций задается в
радианах, а не в градусах.
Следует помнить, что в VB функция Log(x)
рассчитывает натуральный логарифм, а не десятичный, как в Excel.
Функция Excel, рассчитывающая натуральный логарифм – Ln(x).
Для округления вещественных чисел используется функция
Round(x [, n]). Эта функция возвращает значение
арифметического выражения х, округленное до n знаков после десятичной точки. Если второй
аргумент отсутствует, то функция Round возвращает целое число и Round(x) = CInt
(х), причем если дробная часть значения х равна 0.5, то округление производится
до четного числа.
Полезной является функция Rnd,
предназначенная для расчета случайных чисел, которые нужны для моделирования
случайных явлений.
Помимо арифметических выражений, в VB можно использовать логические выражения.
Пример.
Sub Логика1()
Dim x As Integer, y As Integer
Dim blnA As Boolean
x = 5: y = 2
blnA = x > y ‘ Результат: blnA=True
blnA = x = y ‘ Результат: blnA=False
End Sub
В программе – 2 логических выражения: x > y и x = y.
Более сложные логические выражения составляются с
помощью логических операций – Not, And, Or.
Пункт 3. Оператор перехода. Конструкция
принятия решений.
Рассмотренные ранее программы были линейными,
операторы в них выполнялись поочередно. Для изменения последовательности
выполнения операторов используется оператор перехода GoTo,
имеющий следующий синтаксис:
GoTo
метка
В нем метка – это целое неотрицательное число без
знака (0, 1, 2, 3, …) или последовательность букв и цифр, начинающаяся с буквы.
Перед оператором, на который должен быть осуществлен
переход, ставится метка с двоеточием. Если метка является числом, то как
правило, под ней понимается номер строки, на которую осуществляется переход.
Типичной является ситуация, когда в определенном месте
программы необходимо выполнить те или иные операторы в зависимости от некоторых
условий. Выбор операторов осуществляется с помощью одной из двух конструкций
принятия решений – If…Then и Select Case.
Первая конструкция принятия решений - If…Then, называемая условным оператором.
Существует несколько разновидностей этой конструкции.
Простейший условный оператор:
If
условие Then оператор
В этой конструкции условие представляет собой
логическое выражение. При истинности условия выполняются оператор, находящийся
после ключевого слова Then, при ложности оператор не выполняется.
Частным случаем рассмотренной конструкции If…Then
является оператор условного перехода, включающий в себя оператор перехода GoTo.
Синтаксис:
If
условие Then GoTo метка
Согласно этому оператору, при истинности условия происходит
переход на метку и выполняется помеченный оператор.
Если при истинности условия требуется выполнить
несколько операторов, то следует использовать конструкцию вида
If
условие Then
операторы
End If
Этот условный оператор работает следующим образом. Если
условие истинно, то выполняется блок операторов, находящийся после ключевого
слова Then. Если же условие ложно, то блок операторов не
выполняется. Далее выполняется оператор, следующий за служебным словосочетанием
End
If, вне зависимости от того, выполнен блок операторов или нет.
Рассмотрим следующую конструкцию If…Then:
If
условие Then
операторы1
Else
операторы2
End If
Эта конструкция условного оператора работает следующим
образом. Если условие истинно, то выполняется блок операторы1, если условие
ложно, то выполняется блок операторов операторы2. После выполнения блока
операторы1 или операторы2 выполняется оператор, следующий за служебным
словосочетанием End If.
Последнюю конструкцию If…Then можно записать в виде:
If
условие Then
операторы1
Else
: оператор
операторы3
End If
В этой конструкции оператор, стоящий после двоеточия,
представляет собой первый оператор блока операторы2, а блок операторы3 –
оставшиеся операторы блока операторы2.
В том случае, когда блок операторов нужно выполнять
после проверки не одного, а нескольких условий, следует использовать такую
конструкцию If…Then:
If
условие1 Then
операторы1
ElseIf условие2 Then
операторы2
ElseIf условие3 Then
операторы3
…………………….
[Else
операторыN]
End If
Если условие1 истинно, то выполняется блок операторы1.
Если оно ложно, то проверяется условие2, находящееся после ключевого слова ElseIf .
При истинности условия2 выполняется блок операторы2, и т.д. Если ни одно из
условий не является истинным, то выполняется блок операторыN,
расположенный после ключевого слова Else.
Мы рассмотрели конструкции условного оператора. В
дополнение к ним рассмотрим функцию
IIf
(условие, выражение1, выражение2)
В ней условие представляет собой логическое выражение,
а выражени1 и выражение2 – арифметические или логические выражения или строки,
которые можно рассматривать как выражения.
Функция IIf возвращает в программу значение выражения1
или выражения2 в зависимости от того, какое значение принимает логическое
выражение Условие, True или False.
Например,
Sub pr ()
Dim intA As Integer
Dim strA As String
intA = 6
strA = IIf (intA Mod 2 = 0, “Четное”, “Нечетное”)
End Sub
Вторая конструкция принятия решений – Select Case. Эта конструкция, называемая оператором
выбора, выглядит так:
Select Case
выражение
Case
значение1
Операторы1
Case
значение2
Операторы2
………………………….
[Case Else
операторыN]
End Select
В ней Выражение – арифметическое или логическое
выражение или строка. Работает оператор выбора следующим образом. Если
Выражение принимает значение1, то выполняется блок операторов операторы1. Если
Выражение принимает значение2, то выполняется блок операторы2, и т.д. Если
Выражение не равно ни одному из приведенных значений, то выполняется блок
операторыN, находящийся после служебного словосочетания Case Else.
В том случае, когда при нескольких значениях Выражения
необходимо выполнить один и тот же блок операторов, эти значения нужно
перечислить после ключевого слова Case, разделяя их запятыми.
Пример.
Sub Выбор ()
Dim x As Integer
x = 1
Select Case 2*x + 1
Case 1
x = x + 1
Case 2, 3, 4
x = 10
Case Else
x = 20
End Select
End Sub
Пункт 4. Циклы.
Для многократного выполнения блока операторов
используются три оператора цикла – For…Next, While…Wend, Do…Loop.
Цикл For…Next используется в том случае, когда количество
выполнений заданного блока операторов известно заранее. Данная конструкция
имеет следующий синтаксис:
For
счетчик = начало To конец [Step шаг]
Операторы
Next
[счетчик]
Шаг может быть как положительным так и отрицательным
числом. По умолчанию шаг равен 1.
В качестве параметров цикла начало, конец и шаг можно
использовать не только числа, но и арифметические выражения. Важно, чтобы к
моменту выполнения цикла все переменные в этих арифметических выражениях имели
числовые значения.
Зачастую требуется досрочно выйти из цикла. В этом
случае цикл For…Next записывается в виде:
For
счетчик = начало To конец [Step шаг]
Операторы1
If условие Then Exit For
Операторы2
Next
[счетчик]
Досрочное окончание цикла обеспечивается оператором Exit For.
Цикл While…Wend применяется в том случае, когда число
выполнений операторов цикла заранее неизвестно. Синтаксис этого цикла:
While условие
Операторы
Wend
Если результатом проверки условии является True, то
операторы цикла выполняются. В противном случае выполнение цикла оканчивается.
Цикл Do…Loop, как и цикл While…Wend,применяется,
когда число выполнений операторов цикла заранее неизвестно. Существует четыре
разновидности данной конструкции.
Первой разновидностью является цикл Do While …Loop,
имеющий следующий синтаксис:
Do While условие
Операторы
Loop
Если результатом проверки условия является True, то
блок операторов выполняется. В противном случае выполнение цикла оканчивается.
Цикл Do While …Loop эквивалентен рассмотренному ранее циклу While…Wend.
Вторая разновидность конструкции Do…Loop –
цикл Do Until…Loop – имеет синтаксис:
Do Until условие
Операторы
Loop
Если результатом проверки условия является False,
то блок операторов выполняется. В противном случае выполнение цикла оканчивается.
Очевидно, что в циклах Do While …Loop и Do Until…Loop
существует ситуация, когда блок операторов не выполняется ни разу, так как
условие окончания цикла проверяется перед выполнением этих операторов.
Третья разновидность конструкции Do…Loop –
цикл Do…Loop While – имеет синтаксис
Do
Операторы
Loop While условие
Блок операторов выполняется до тех пор, пока
результатом проверки условия является True. В противном случае выполнение цикла
оканчивается.
Четвертая разновидность конструкции Do…Loop –
цикл Do…Loop Until – имеет синтаксис
Do
Операторы
Loop Until условие
Операторы цикла выполняются до тех пор, пока
результатом проверки условия является False. В противном случае выполнение цикла
оканчивается.
Очевидно, что в последних двух разновидностях цикла Do…Loop
операторы цикла хотя бы один раз обязательно выполняются, так как условие
окончания цикла проверяется после выполнения этих операторов.
Внутри цикла Do…Loop может находиться оператор Exit Do,
предназначенный для досрочного выхода из цикла.
Для цикла While…Wend не существует оператора досрочного выхода из
цикла.
Пункт 5. Массивы.
Массивом называется последовательность или таблица
переменных одного типа, называемых элементами массива. В обращении к элементу
указывается имя массива и один или несколько индексов.
Прежде чем использовать массив, его следует описать
(объявить). Кроме того, для каждого индекса должны быть определены нижняя и
верхняя границы, в пределах которых индекс может меняться.
Объем оперативной памяти, требуемый для массива,
равен произведению количества байтов для одного элемента массива на количество
элементов.
Существует два вида массивов — статические и
динамические.
Статические массивы. При описании статического одномерного массива
задаются нижняя и верхняя границы для индекса, определяющие количество элементов
массива, причем заданные границы не могут быть изменены в программе.
Статические массивы описываются в программе так же,
как и переменные, то есть при помощи ключевых слов Dim и As. Границами являются
целые числа в скобках. Между нижней и верхней границами ставится ключевое
слово То. Примеры:
Dim arrB(l То 10) As Integer
Dim A(-10 То
10) As
String
Если в скобках указано только одно целое число, то это
— верхняя граница. При этом нижняя граница полагается равной нулю.
Пример:
Dim arrA(9) As Byte
Если нужно, чтобы нижней границей массивов была
единица, то перед первой строкой программы следует набрать строку
Option Base 1
Значения границ не должны выходить за пределы
диапазона значений для данных типа Long.
Одномерный массив аналогичен строке или столбцу
таблицы Excel (при стиле ссылок R1C1).
Для описания многомерных массивов (имеющих несколько
индексов) используются конструкции, аналогичные рассмотренной. Отличие состоит
в том, что указывается несколько границ, через запятую.
Примеры:
Dim A(4, 4) As Byte
Dim B(l To 5, -5 То -1) As Byte
В данных примерах объявленные массивы А и В являются
двумерными и содержат одинаковое количество элементов, равное 5x5 = 25.
Двумерный массив аналогичен прямоугольному диапазону
ячеек таблицы Excel (при стиле ссылок R1C1).
Обращение к элементу многомерного массива осуществляется
при помощи имени массива и индексов, перечисленных через запятую.
Примеры обращений:
A(i, j + 1) = 17
В(2, -3) = 25.5
b = C(K, 25)
Пример описания трехмерного массива, содержащего 5x5x5
= 125 элементов:
Dim C(l To 5, -5 To -1, 4) As Byte
Максимальное число «измерений» массива очень велико —
60.
Динамические массивы используются в том случае, когда количество
элементов массива заранее неизвестно, а определяется в процессе выполнения программы.
По окончании работы с динамическим массивом можно освободить память, которую он
занимает. Это важно для задач, требующих большого объема оперативной памяти.
Описание динамического массива осуществляется в
следующие два этапа.
1.
Объявляется массив с
использованием оператора Dim, но без указания размерности. Признаком массива
являются скобки после его имени.
2.
В нужном месте программы
описывается данный массив с указанием размерности при помощи оператора ReDim,
причем в качестве границ можно использовать не только целые числа, но и
арифметические выражения. Важно, чтобы к моменту выполнения оператора ReDim
все переменные в этих арифметических выражениях имели числовые значения.
Пример:
Sub ДинамическийМаcсив()
Dim A() As Byte 'объявление массива
Dim M As Integer, N As Integer
M = 3
ReDim A(-5 To M ^ 2) 'указание размерности
For N = -5 To M ^ 2
A(N)
= N + 30
Next
ReDim A(5) 'указание размерности
N = 0
Do
A(N) =N^3 : N=N+1
Loop Until N ^ 2 > 10
End Sub
Следует иметь в виду, что при каждом выполнении
оператора ReDim (то есть при каждом переопределении массива) значения
элементов массива будут потеряны, так как оператор ReDim обнуляет все элементы
массива.
Для того чтобы при переопределении массива значения
элементов не пропали, следует использовать ключевое слово Preserve.
Пример:
Sub Сохранение1()
Dim J As Integer, arrAO As Integer
ReDim arrA(-5 To 1) 'указание
размерности
For J = -5 To 1
arrA(J) = J ^ 2
Next J
ReDim Preserve arrA(-5 To 4) 'указание
размерности
For J = 2 To 4
arrA(J) = J ^ 3
Next J
End Sub
Отметим, что в программе ключевое слово Preserve
используется при изменении верхней границы одномерного массива. При изменении
нижней границы Preserve использовать нельзя.
В случае многомерного массива ключевое слово Preserve
можно использовать только при изменении верхней границы последнего «измерения»
массива.
Существует возможность определения значений нижней и
верхней границ массива любой размерности. Для этого следует использовать
функции LBound и UBound соответственно. Описания этих функций можно найти в
справочной системе, вызываемой нажатием клавиши F1.
Пример. Использование функций LBound и UBound для
определения границ одномерного массива аггА:
'Low - нижняя граница массива 'Up - верхняя граница
массива
Dim Low As Long
Dim Up As Long
Low = LBound(arrA)
Up = UBound(arrA)
Функция UBound необходима, например, когда значение
верхней границы одномерного массива неизвестно и при этом необходимо увеличить
это значение на определенное число.
Для решения многих математических задач требуются
массивы случайных чисел.
Пример. Программа, рассчитывающая 10 случайных чисел
от 0 до 1, имеет вид
Sub СлучайныеЧисла()
Dim N As Long
Dim I As Long
Dim S() As Single
N = 10
ReDim S(l To N)
Randomize
For I = 1 To N
S(I) = Rnd
Next I
End Sub
Случайные числа рассчитываются с помощью функции Rnd.
В данном случае обращение к ней производится в цикле For...Next.
Перед серией обращений к функции Rnd должен находиться
оператор Randomize.
Пункт 6. Пользовательские процедуры.
Блок операторов, предназначенный для многократного
выполнения в разных точках программы, целесообразно оформить как процедуру. При
этом блок записывается один раз и ему присваивается имя с параметрами
(формальными). Эта запись блока операторов называется описанием процедуры.
В общем случае процедура имеет:
·
входные параметры, которые
считаются заданными;
·
выходные параметры,
рассчитываемые в ходе выполнения блока операторов.
После того, как произведено описание процедуры, в
программу помещаются обращения к этой процедуре с нужными параметрами
(фактическими). Эти обращения помещаются в те точки программы, в которых по
смыслу должен присутствовать блок операторов, оформленный как процедура.
Процедуры делятся на функции и подпрограммы. Функции
можно использовать в арифметических и логических выражениях и строках (так как
функция возвращает значение в программу); подпрограммы в выражениях и строках
использовать нельзя. В этом состоит основное отличие функций от подпрограмм.
Описание пользовательской
функции имеет следующий синтаксис:
Function название (формальные_параметры)
[As тип]
операторы
End Function
где название — имя
функции; формальные_параметры — имена параметров, перечисленные через
запятую; тип — тип значения функции; операторы — блок операторов.
В блоке операторы обязательно
должен присутствовать оператор присваивания, в левой части которого находится
имя функции название.
Обращение к функции (находящееся
в программе) имеет вид
название (фактические_параметры)
где фактические_параметры
— массивы, переменные, константы, числа и/или строки, перечисленные через
запятую.
В результате обращения к функции
название в программу возвращается значение этой функции, соответствующее
заданным параметрам.
Рассмотрим следующий код
программы и описания функции, находящийся в одном модуле:
Sub Program1()
Dim L As Long, W As Double
L = Fact(12): W = 4.2 + Fact(10)/2
End Sub
Function Fact(N) As Long ‘N < 13
Dim I As Byte, J As Long
J = 1
For I = 1 To N
J = J * I
Next I
Fact = J
End Function
Первая группа операторов — это
программа Program1. Вторая группа операторов — описание функции Fact, которая
рассчитывает факториал целого положительного числа N, являющегося формальным
параметром.
В программе два обращения к
функции Fact, с фактическими параметрами 12 и 10.
Обращение к функции Fact
фигурирует в правой части оператора присваивания L = Fact (12). В результате
выполнения этого оператора значение функции Fact при N = 12 (то есть значение,
возвращаемое функцией Fact в программу) присваивается переменной L.
Обращение к функции Fact
фигурирует в арифметическом выражении 4.2 + Fact(10) / 2. Значение этого
арифметического выражения присваивается переменной W.
Описание пользовательской
подпрограммы имеет следующий синтаксис:
Sub название (формальные_параметры)
операторы
End Sub
где название — имя
подпрограммы; формальные_параметры — имена параметров, перечисленные
через запятую; операторы— блок операторов.
Имеется два эквивалентных
оператора обращения к подпрограмме:
Call название(формальные_параметры)
название фактические_параметры
где фактические_параметры
— список фактических параметров, как в обращении к функции. При наличии
ключевого слова Call список фактические_параметры заключается в скобки,
в отсутствие Call скобки не ставятся.
Вернемся к вопросу объявления
переменных.
До сих пор мы говорили о том,
как объявлять переменные, но не говорили, где их объявлять. Их можно объявлять
в двух местах:
·
внутри программы или
процедуры;
·
в верхней части окна кода,
которая называется областью общих объявлений модуля.
Место объявления переменной
определяет область ее использования. Если, например, переменная объявлена в
процедуре, то только эта процедура ее видит. Другие процедуры (если они есть) и
программа не могут использовать значение этой переменной и менять его. Такую
переменную называют локальной. Говорят также, что переменная видима на уровне
процедуры.
Чтобы значение переменной было
доступно всем процедурам данного модуля, ее надо объявить в области общих
объявлений модуля. Тогда программа и все процедуры, определенные в данном
модуле, могут использовать значение этой переменной и менять его. Такую
переменную называют глобальной. Говорят также, что переменная видима на уровне
модуля.
Пункт 7. Использование стандартных окон
операционной системы WINDOWS
В VB имеется большое количество встроенных процедур,
которые отличаются от пользовательских процедур тем, что их описания были
запрограммированы разработчиками Visual Basic. От пользователя компьютера
тексты встроенных процедур скрыты.
Встроенные процедуры, как и пользовательские, делятся
на функции и подпрограммы.
Со встроенными функциями мы уже неоднократно
встречались. К ним относятся:
математические функции; функция IIf; и
др.
Существует встроенная функция inputBox,
предназначенная для ввода информации (в программу) с помощью стандартных окон
Windows.
Примером встроенной подпрограммы является
подпрограмма MsgBox, предназначенная для вывода информации (из программы) в
стандартные окна Windows.
Используем встроенные процедуры InputBox и MsgBox в
программе расчета длины гипотенузы прямоугольного треугольника по длинам
катетов.
1. В окно кода нового модуля введем программу
Sub Pythagoras()
Dim a As Single
Dim b As Single
Dim с As Single
Dim s As String 1: s = InputBox("Введите длину
первого катета и нажмите ОК")
2: а = Val(s)
3: s = InputBox("Введите длину второго катета и
нажмите ОК")
4: b = Val(s)
5: с = Sqr(a л 2 + b л 2)
6: s = Str(c)
7: MsgBox s
End Sub
Если запустить программу Pythagoras. Появится окно, предлагающее ввести длину первого катета. С помощью
клавиатуры введем,
например, значение 400 (без кавычек) в текстовое поле этого окна и нажмем
кнопку ОК. Появится окно, предлагающее ввести длину второго катета. Введем,
например, значение 300; после этого нажмем кнопку ОК.
Появится окно, содержащее рассчитанное значение длины
гипотенузы. Кликнем на кнопке ОК для закрытия окна и завершения выполнения
программы Pythagoras.
Первый оператор программы (с меткой 1) содержит
функцию inputBox. Она используется для ввода информации с клавиатуры.
Возвращает эта функция строку, введенную в текстовое поле первого окна, то есть
''400''. Эта строка присваивается переменной s строкового типа.
Второй оператор преобразует значение строки s в число
400 и присваивает это значение переменной а.
Третий оператор присваивает переменной s строку ''300'',
введенную в текстовое поле второго окна.
Четвертый оператор преобразует значение строки s в
число 300 и присваивает это значение переменной b.
Пятый оператор рассчитывает длину гипотенузы по
теореме Пифагора. Полученное значение 500 присваивается переменной с.
Шестой оператор преобразует значение 500 в строку. В
результате его выполнения переменной s присваивается строка ''500''.
Седьмой оператор, представляющий собой обращение к
подпрограмме MsgBox, выводит на экран дисплея окно с рассчитанным значением
500.
В обращениях к процедурам InputBox и MsgBox фигурирует
один параметр (строкового типа), который является обязательным. Однако
параметров может быть несколько. Назначение необязательных параметров можно
посмотреть в справочной системе, вызываемой нажатием клавиши F1. Отметим, что в
справочной системе VB подпрограмма MsgBox называется функцией, так как ее
можно использовать в арифметических выражениях. При этом в программу
возвращается значение типа Integer, соответствующее кнопке, на которой
кликнул пользователь.
Пункт 8. Работа со строками.
Строкой будем называть не только последовательность
символов, заключенную в кавычки, но и переменную строкового типа, объявленную
с помощью ключевого слова String.
Пример:
Dim A As String
Dim В As String * 15
A = ''Информатика''
В = ''Информатика''
В примере А, В и ''Информатика'' являются строками.
Строка как переменная может иметь переменную или постоянную длину.
Строка переменной длины характеризуется тем, что
занимаемый ею объем оперативной памяти может меняться в процессе выполнения
программы.
В примере А — строка переменной длины. Строка постоянной длины занимает
фиксированный объем оперативной памяти. При ее объявлении после ключевого
слова String ставится значок * (звездочка) и указывается объем памяти (в
байтах), выделяемый этой строке. В примере В — строка постоянной длины,
занимающая 15 байт оперативной памяти.
Значение, присваиваемое строке постоянной длины,
может содержать количество символов как меньшее указанного в описании
(пятнадцати), так и большее. В первом случае в конец строки вместо недостающих
символов автоматически будут добавлены пробелы, а во втором случае лишние
символы будут автоматически удалены.
Для объединения двух и более строк используется символ
& (амперсанд). Результатом объединения строк является строка.
Пример:
Sub Строки1()
Dim strA As String
Dim strB As String
Dim strC As String
strA = "Строковая "
strB = "переменная"
strC = strA & strB
'Результат: strC = 'Строковая переменная'
strC = strA & "переменная"
'Результат: strC = 'Строковая переменная'
End Sub
Благодаря операции объединения строк &, строку
можно рассматривать как выражение, аналогичное арифметическим и логическим
выражениям.
При работе со строками используются три функции
удаления пробелов:
·
LTrim удаляет все пробелы в начале строки (слева —
left);
·
RTrim удаляет все пробелы
в конце строки (справа — right);
·
Trim удаляет все пробелы в
начале и конце строки.
Пример:
Sub Строки2()
Dim strA As String
Dim strB As String
strA =
“ Строковая переменная “
strB = LTrim(strA)
'Результат: strB = “Строковая
переменная “
strB = RTrim(strA)
'Результат: strB = “ Строковая переменная”
strB = Trim(strA)
'Результат: strB = “Строковая переменная”
End Sub
Для того чтобы заменить какую-либо часть строки или
определенные символы, следует использовать функцию Replace.
Пример:
Sub Строки5()
Dim strA As String
Dim strB As String
strA = "Павел Иванов"
strB = Replace(strA, "Иванов",
"Гусев")
'Результат: strB = "Павел
Гусев"
End Sub
Для определения количества символов в строке (не
считая кавычек) применяется функция Len, причем аргументом является строка.
Пример:
Sub Строкиб()
Dim strA As String
Dim intA As Integer
strA =
"Строковая переменная"
intA = Len(strA) 'Результат: intA =20
End Sub
Нередко возникает необходимость выделения из строки
той или иной ее части. В этом случае следует использовать одну из функций Left,
Right и Mid (middle — середина).
Обращения к функциям Left и Right имеют следующий
вид:
Left(строка, количество)
Right(строка, количество)
Эти функции возвращают строку, содержащую указанное
количество символов количество начала и конца строки строка соответственно.
Обращение к функции Mid имеет вид
Mid(строка, номер[, количество])
Эта функция возвращает строку, содержащую указанное
количество символов строки строка, начиная с символа с заданным порядковым
номером. Если количество символов не указывается, то функция Mid возвращает все
символы до конца строки.
Пункт 9. Работа с текстовыми файлами.
Файлом называется область на жестком диске,
компакт-диске или каком-либо другом носителе информации, содержащая однотипную
информацию и имеющая название. При работе программы с файлами основными
являются операции считывания информации из файла и записи информации в файл.
Существует несколько разновидностей файлов. Мы
рассмотрим текстовые файлы. Их содержимым является последовательность строк
произвольной длины. В конце каждой строки находится сочетание символов
«возврат» и «новая строка», означающее окончание этой строки.
Текстовые файлы мы будем изучать с помощью редактора
Блокнот, входящего в состав операционной системы Windows. При этом символы
«возврат» и «новая строка» мы не увидим.
Для начала работы с текстовым файлом используется
оператор открытия файла Open, имеющий следующий синтаксис:
Open имя For назначение As номер
Здесь имя — полное имя файла (строка,
содержащая имя файла с путем и расширением), номер — номер файла, назначение
— это ключевое слово Input, Output или Append.
Input означает, что файл открывается для
считывания из него информации.
Output — файл открывается для записи в него
информации.
Append — файл открывается для добавления
информации.
В качестве номера файла рекомендуем использовать
переменную типа Integer, значение которой задается с помощью оператора
присваивания
номер = FreeFile
Этот оператор должен находиться перед оператором Open;
FreeFile — функция, возвращающая в программу незанятый номер файла.
По окончании работы с файлом его следует закрыть с
помощью оператора Close. Синтаксис:
Close номер
Для добавления в файл новых строк используется
оператор Print, имеющий следующий синтаксис:
Print #номер, строка
Пусть файл с указанным номером открыт при помощи
ключевого слова Output. При выполнении оператора Print в начало файла будет
записана строка. При повторном выполнении оператора Print в файл добавляется
вторая строка и т. д.
Пусть файл с указанным номером открыт при помощи
ключевого слова Append. При выполнении оператора Print строка
будет добавлена в конец файла.
Рассмотрим два способа извлечения информации из
текстового файла, открытого при помощи ключевого слова Input.
Первый способ извлечения информации — с помощью
оператора Line Input, имеющего синтаксис
Line Input #номер, переменная
Этот оператор производит считывание из файла очередной
строки, которая присваивается переменной строкового типа.
Второй способ извлечения информации из файла
— с помощью функции
Input(количество, номер)
Эта функция возвращает в программу строку, содержащую
указанное количество символов из файла с указанным номером.
В программах Создание и Добавление, приведенных ниже,
используются рассмотренные операторы и функции работы с файлами. На примере
этих программ рассмотрим и другие полезные операторы и функции.
Sub
Создание()
Dim FNamel As String
Dim FName2 As String
Dim FNuml As Integer
Dim FNum2 As Integer
Dim nl As Long
Dim n2 As Long
Dim strA As String 'вспомогательная строка
MkDir(“c:\My Documents\texts”) 'создание папки texts
FNamel = “c:\My Documents \texts\a.txt” 'полное имя 1-го файла
FName2 = “c:\My Documents \texts\b.txt” 'полное имя 2-го файла
'Создание файла a.txt:
FNuml = FreeFile
Open FNamel For Output As FNuml 'открытие
файла a.txt
strA = "Создан текстовый файл,”
Print #FNuml, strA
Print #FNuml, “который состоит из нескольких строк.”
'Определение количества символов в файле
a.txt:
nl = LOF(FNuml)
Close FNuml 'закрытие файла
a.txt
MsgBox “B файле a.txt” & Str(nl) & “
символов”
'Копирование информации из файла a.txt в файл b.txt:
FNuml = FreeFile
Open FNamel For Input As FNuml 'открытие
файла a.txt
FNum2 = FreeFile
Open FName2 For Output As FNum2 'открытие
файла b.txt
Do Until EOF (FNuml) 'цикл
считывания-записи
Line
Input #FNuml, strA
Print #FNum2, strA
Loop
Close FNuml 'закрытие файла
a.txt
'Добавление новой строки в файл b.txt:
strA = “Добавлена новая строка.”
Print #FNum2, strA
'Определение количества символов в файле
b.txt:
n2 = LOF(FNum2)
Close FNum2 'закрытие
файла b.txt
FNum2 = FreeFile
Open FName2 For Input As FNum2 'открытие
файла b.txt
strA = Input(1, FNum2) 'считывание
символа
Close FNum2 'закрытие файла
b.txt
MsgBox “В файле b.txt” & Str(n2) & “ символов,
“ & “причем первый символ – “ & strA
End Sub
Оператор
MkDir(“c:\My Documents\texts”) создает папку texts внутри папки My Documents, входящей в
состав операционной системы Windows. (При
повторном запуске программы Создание оператор создания папки MkDir следует
убрать, например, пометив его апострофом.)
Если операционная система русифицирована, то в тексте
программы Создание следует использовать имя папки Мои документы вместо My
Documents.
Функция LOF возвращает в программу количество символов
в файле, причем символы «возврат» и «новая строка» (которыми оканчивается
каждая строка) принимаются в расчет. Аргументом этой функции является номер
файла.
Функция EOF, используемая в условии окончания цикла Do
Until … Loop, возвращает True при достижении конца файла. Аргументом этой
функции является номер файла.
Подпрограмма MsgBox выводит строку, являющуюся ее
параметром, на экран дисплея. В программе Создание два обращения к MsgBox,
поэтому по ходу выполнения программы на экране по очереди появляются окна.
По окончании выполнения программы Создание файлы a.txt и b.txt имеют
следующее содержание.
Файл a.txt:
Создан текстовый файл,
который состоит из нескольких строк.
Файл b.txt:
Создан текстовый файл,
который состоит из нескольких строк.
Добавлена новая строка.
Чтобы уничтожать файлы a.txt и b.txt и папку texts по
окончании выполнения программы, перед последней строкой (End Sub) следует
вставить следующие операторы ликвидации файлов и папки:
Kill(FNamel)
Kill(FName2)
RmDir(“c:\My Documents\texts”)
Рассмотрим программу добавления строки в файл b.txt и
запуска редактора Блокнот (Notepad)
Sub
Добавление()
Dim FNum As Integer
Dim n As Long
Dim RetVal 'для функции
Shell
FNum = FreeFile
'Открытие файла b.txt и ввод новой строки:
Open "c:\My Documents\texts\b.txt” For Append As
FNum
Print #FNum , "Добавлена вторая новая строка.”
'Определение количества символов в файле
b.txt:
n = LOF(FNum)
Close FNum 'закрытие файла
b.txt
MsgBox “В файле b.txt” & Str(n) & “ символов”
'Запуск редактора Блокнот:
RetVal = Shell(“c:\Windows\notepad.exe”,l)
End Sub
Редактор Блокнот (Notepad) запускается с помощью функции Shell.
Отметим, что функция Shell позволяет запустить
исполняемый файл любой программы, имя которого имеет расширение ехе, в
частности, созданный в автономной среде VB.
По окончании выполнения программы Добавление
файл b.txt принимает вид
Создан текстовый файл,
который состоит из нескольких строк.
Добавлена новая строка.
Добавлена вторая новая строка.
Одним из результатов выполнения программы Добавление
является окно редактора Блокнот (Notepad), запускаемого функцией Shell. С
помощью этого редактора можно увидеть содержимое файла, в частности b.txt, и
при необходимости создать новый файл или отредактировать существующий.
При открытии файла на добавление информации (с помощью
ключевого слова Append) его может не существовать. В этом случае файл
создается. При открытии файла на считывание информации (с помощью ключевого
слова Input) файл, естественно, должен существовать.
Пункт 10. Загрузка формы. Макросы.
Загрузка формы из окна Excel.
Создадим простейшую программу, которая
позволит загружать форму из окна Excel.
В окне среды VB выполним Insert
(Вставка) > Module (Модуль). В окне кода наберем программу
Sub LoadForma()
UserForm1.Show
End Sub
В этой программе UserForm1
– имя формы. Теперь форму можно загружать из окна Excel.
Для этого надо выполнить следующее: Сервис > Макрос > Макросы >
строка LoadForma >Выполнить. Выполнив Сервис > Макрос > Макросы >
строка LoadForma > Параметры > …., можно назначить сочетание клавиш,
запускающее программу LoadForma, то есть загружающее форму UserForm1.
Если вы хотите, чтобы в загруженной форме
мигающий курсор находился, например, во втором текстовом поле, то в программу LoadForma
после первой строки вставьте оператор
UserForm1.TextBoxB.SetFocus
При этом программа примет вид
Sub LoadForma()
UserForm1.TextBoxB.SetFocus
UserForm1.Show
End Sub
Программу LoadForma можно назвать макросом Excel,
разработанным с помощью среды Visual Basic.
Понятие макроса Excel. Два
метода разработки макросов.
Макросом (или макрокомандой) Excel
называется последовательность команд, снабженная именем, которая может быть
выполнена автоматически.
Макрос записывается на языке программирования VBA.
Используются два метода разработки макросов:
1.
С помощью среды VB
2.
С помощью макрорекодера Excel.
Первым методом мы уже пользовались, например,
в предыдущем пункте. Второй метод более простой, но менее универсальный по
сравнению с первым; его обычно рассматривают при изучении Excel.
Если вы не знаете, как на VBA записать какое-либо действие, вам следует с
помощью макрорекодера создать макрос, выполняющий это действие, а затем изучить
получившийся текст макроса на VBA.
Кроме того, макрорекодер облегчает
использование первого метода. Дело в том, что программу на VBA
часто удобней разрабатывать не «с нуля», а начиная с прототипа, разработанного
с помощью макрорекодера.
Работа макрорекодера во многом напоминает
запись с помощью обычного магнитофона. Макрорекодер:
1.протоколирует операции, выполняемые
пользователем
2.преобразует их в последовательность операторов
VBA.
Создадим с помощью макрорекодера макрос для
выполения следующей последовательности операций:
1)
установление сетки на листе и задание
стиля ссылок R1C1;
2)
Присвоение ячейкам денежного формата;
3)
Выделение ячейки R14C5,
то есть Е14.
Для создания макроса выполним следующее.
1.
Сервис > Макрос
>
Начать запись.
2.
В текстовые поля открывшегося окна Запись
макроса введем имя макроса и другую информацию (имя макроса, сочетание
клавиш для запуска макроса, место хранения макроса (эта книга, все книги и тд))
3.
В окне Запись макроса с
заполненными текстовыми полями кликнем на кнопке ОК. В строке состояния Excel
появится сообщение Запись, свидетельствующее о том, что запись макроса
началась.
4.
Установим отображение сетки в окне Excel
и установим тип адресации R1C1.
5.
Зададим денежный формат для всех ячеек
активного листа.
6.
Кликнем на ячейке R14C5.
7.
Кликнем на кнопке Остановить запись
панели инструментов с двумя кнопками, соответствующей записи макроса или
выполним Сервис > Макрос > Остановить запись. Сообщение Запись
исчезнет из строки состояния, что говорит об окончании работы макрорекодера.
Способы запуска макроса.
1.
Запуск с помощью присвоенной комбинации
клавиш.
2.
Запуск макроса путем выбора имени: Сервис
> Макрос > Макросы > строка Имя макроса > Выполнить.
При выполнении макроса компьютер
повторяет действия, перечисленные в пунктах 4-6. Для удаления макроса надо
выполнить Сервис > Макрос > Макросы > строка Имя макроса
> Удалить.
Пункт 11. Объекты и события.
Все современные языки
программирования, в частности VB и VBA, являются объектно- и
событийно-ориентированными.
Объектно-ориентированный подход
подразумевает выделение обособленной части предметной области, обладающей
некоторыми характеристиками (свойствами) и способами изменения этих
характеристик (методами). Программная реализация этой части предметной области
называется объектом.
Событийно-ориентированный
подход опирается на следующие два понятия:
1.
«событие» - качественное изменение
состояния объекта, возникающее в результате действий пользователя или работы
компьютера;
2.
«обработчик события» - набор команд,
выполняемых компьютером при возникновении события.
Примеры объектов VB – UserForm
(Пользовательская форма), CommandButton (Кнопка), CheckBox (Флажок) и др. Пример события – клик на
кнопке, результат обработки события – например, запуск программы.
VBA
предназначен для создания программ в приложениях Microsoft Office.
Отличается от VB наличием специфических объектов. Мы будем
рассматривать объекты VBA, собранные в библиотеке Excel и
называемые объектами Excel. Например, диапазон ячеек, книга, лист.
Синтаксис возвращения свойства объекта:
Переменная = объект.свойство
Где переменная – имя переменной.
Синтаксис установки свойства объекта:
Объект.свойство = выражение
Синтаксис выполнения метода объекта:
[переменная = ] объект.метод
Как правило, при выполнении метода никакое
значение в программу не возвращается. В этом случае часть последнего оператора,
находящаяся в квадратных скобках, должна отсутствовать. Однако есть методы, при
выполнении которых в программу возвращается некое значение. Но и в этом случае
часть последнего оператора, находящаяся в квадратных скобках, может
отсутствовать, если возвращаемое значение не представляет интерес (то есть не
используется в программе).
Существует иерархия объектов. Высшим в
иерархии объектов приложения является объект Application (Приложение),
все остальные объекты Excel «вложены» в него.
Полная ссылка на объект состоит из ряда имен,
разделенных точками. Ряд начинается с Application и заканчивается именем самого объекта.
Например, полная ссылка на ячейку А1 листа Код книги Архив имеет вид:
Application.Workbooks(“Архив”).Worksheets(“Код”).Range
(“A1”)
Приводить каждый раз полную ссылку на объект
не обязательно. Часто достаточно ограничиться неполной ссылкой, в которой активные
в данный момент объекты опускаются.
Если книга Архив является активной, тогда
ссылку можно сократить
Worksheets(“Код”).Range (“A1”)
Оставьте свой комментарий
Авторизуйтесь, чтобы задавать вопросы.