Рис. 28.Схема преобразования данных без потерь
 
   VBA имеет также набор функций, которые можно использовать для явного преобразования типов данных в операциях. Эти функции приведены в табл. 11.
 
    Таблица 11
Функции преобразования типов
Операции со строками
   Для данных типа String существует только одна операция – конкатенация (объединение). Например, результатом операции конкатенации трех строковых значений «Петр» & " " & «Иванович» будет строка «Петр Иванович». Возможно также использование другого оператора для операции конкатенации, например: «десяти» + «тысячник». Разница между этими выражениями состоит в том, что в первом случае операндами могут быть значения любого типа (они просто будут преобразовываться в строковые), а во втором – оба операнда должны иметь тип String.
   Для работы со строками существует большое количество функций (табл. 12).
 
    Таблица 12
Функции работы со строками
 
   Для сравнения строковых значений можно использовать обычные операторы сравнения числовых значений, так как при сравнении символов сравниваются их двоичные коды.
   Для сравнения строковых значений также применяется оператор Like, который позволяет обнаруживать неточное совпадение, например выражение «Входной сигнал» Like «Вход*» будет иметь значение True, так как сравниваемая строка начинается со слова «Вход». Символ звездочка (*) в строке заменяет произвольное число символов. Другие символы, которые обрабатываются оператором Like в сравниваемой строке:
    ? – любой символ (один);
    #– одна цифра (0–9);
    [<список>] – символ, совпадающий с одним из символов списка;
    [!<список>] – символ, не совпадающий ни с одним из символов списка.
   Следующие три функции позволяют работать с массивом строк.
   Split (<строка> [,<разделитель>]) – преобразует строку в массив подстрок. По умолчанию в качестве разделителя используется пробел. Данную функцию удобно использовать для разбиения предложения на слова. Однако можно указать в этой функции любой другой разделитель.
   Например, Split(3, «Этo тестовое предложение») возвращает массив из трех строковых значений: «Это», «тестовое», «предложение».
   Join (<массивСтрок> [,<разделитель>]) – преобразует массив строк в одну строку с указанным разделителем.
   Filter(<массивСтрок>,<строкаПоиск>[,<включение>] [,<сравнение>]) – просматривает массив строковых значений и ищет в нем все подстроки, совпадающие с заданной строкой.
   Эта функция имеет четыре аргумента:
   <строкаПоиск> – искомая строка;
   <включение> – параметр (булевское значение), который указывает, будут ли возвращаемые строки включать искомую подстроку или, наоборот, возвращаться будут только те строки массива, которые не содержат искомой строки в качестве подстроки;
   <сравнение> – параметр, определяющий метод сравнения строк.
   Еще три функции обеспечивают преобразование строк:
   LCase(<строка>) – преобразует все символы строки к нижнему регистру, например функция LCase(«ПОЧTA») возвращает строку «почта»;
   UCase(<строка>) – преобразует все символы строки к верхнему регистру;
   StrConv(<строка>,<преобразование>) – выполняет несколько типов преобразований строки в зависимости от второго параметра. Этот параметр описывается встроенными константами, например функция StrConv(«poccия»,VbProperCase) возвращает значение «Россия».
   И последние две функции генерируют строки символов:
   Space(<число>) – создает строку, состоящую из указанного числа пробелов;
   String(<число>,<символ>) – создает строку, состоящую из указанного в первом аргументе числа символов. Сам символ указывается во втором аргументе.
    Пример 13. Создать программу, работающую со строковыми переменными. Для этого создать форму, в метки которой выходят следующие сообщения:
   1 метка: сообщается длина строки, введенной в первое текстовое поле (1 строка);
   2 метка: преобразует все символы третьего текстового поля (3 строка) в заглавные буквы;
   3 метка: выводит вместе содержание первого и второго текстовых полей (1 и 2 строки).
    Технология выполнения
   1. Откройте приложение Word, сохраните документ и перейдите в редактор VBA.
   2. Создайте форму аналогично приведенному рис. 29.
   3. Пропишите обработчик события кнопки ОК.
 
    Рис. 29.Форма примера 13 в режиме конструктора и в рабочем состоянии
   Private Sub CommandButton1_Click()
   Dim a As String
   Dim b As String
   Dim c As String
   Dim k As String
   Dim d As String
   Dim n As Integer
   a = TextBox1.Text
   n = Len(a)
   Label7.Caption = «длина первой строки равна» & n & « символам»
   c = TextBox3.Text
   k = Ucase(с)
   Label8.Caption = k
   b = TextBox2.Text
   d = a + " " + b
   Label9.Caption = d
   End Sub
   4. Откомпилируйте программу.
   5. Запустите форму на выполнение.

3.3. Процедуры и функции VBA

Описание процедур и функций VBA
   Процедуры VBA бывают двух типов:
    процедуры обработки событий;
    общие процедуры.
   Имя процедуры обработки события, связанного с элементом управления, состоит из имени элемента управления, символа подчеркивания и имени события, например Закрытъ_ click– процедура обработки нажатия кнопки Закрытьв форме.
   Общие процедуры VBA могут храниться в любом типе модулей VBA, так как они не связаны с конкретным объектом. Они выполняются только тогда, когда явно вызываются другими процедурами. Обычно эти процедуры реализуют какие-то общие действия, которые могут вызываться разными процедурами обработки событий.
   Процедуры, как и переменные, должны быть объявлены до того, как они могут быть вызваны. Объявления общих процедур помещаются в разделе General (Общая область) модуля. Процедуры обработки событий хранятся в разделах модуля формы или отчета, соответствующих связанным с этими процедурами объектам.
   В свою очередь, процедуры VBA делятся на подпрограммыи функции.Они являются фрагментами программного кода, который заключается между операторами Sub и End Sub или между Function и End Function соответственно. Процедуры-подпрограммы выполняют действия, но не возвращают значение, поэтому они не могут быть использованы в выражениях. Процедуры обработки событий представляют собой процедуры-подпрограммы. Процедуры-функции всегда возвращают значение, поэтому они обычно используются в выражениях. Общие процедуры могут быть как процедурами-подпрограммами, так и процедурами-функциями.
   Синтаксис процедуры-подпрограммы VBA:
   Sub <имяПроцедуры> (<аргумент1>, <аргумент2>, …) <оператор1>
   <оператор2>
   End Sub
   Список аргументов у процедуры может отсутствовать и может содержать необязательные аргументы.
   Объявление каждого аргумента имеет следующий синтаксис:
   <имяАргумента> [As <типДанных> [=<значениеПоУмолчанию>]],
   где <имяАргумента>– идентификатор, составленный согласно правилам создания имен и представляющий аргумент в теле процедуры;
    <типДанных>– это либо встроенный тип данных, либо тип, определенный пользователем. Тип данных аргумента может не указываться, и тогда считается, что он имеет тип Variant. Аргументом процедуры может быть и массив. Тогда после имени аргумента должны стоять круглые скобки.
 
   Для необязательного аргумента может быть указано < значение по умолчанию>,которое будет использоваться, если этот аргумент будет опущен. Если значение по умолчанию не указано, необязательный аргумент инициируется точно так же, как переменная, т. е. числовой аргумент – в 0, строковый – в строку нулевой длины и т. д.
   Описание функции:
   Function <имяФункции> (<аргумент1>, <аргумент2>, …) [As
   <типЗначение>]
   <оператор1>
   <оператор2>
   <имяФункции> = <возвращаемоеЗначение>
   End Function
   Кроме того что ключевое слово Sub заменяется на Function, в теле функции обязательно присутствует оператор присваивания имени функции какого-нибудь значения. Это значение и возвращается функцией. В заголовке функции может быть описан тип возвращаемого значения. Если этот тип не указан, функция возвращает значение Variant.
   Рассмотрим два примера объявления подпрограмм и функций.
Объявление процедуры инициализации массива
   Sub Init (arr() As Integer)
   Dim i As Integer, str As String
   For i * LBound(arr) To UBound(arr)
   str = "Введите количество книг на полке № " & I
   arr(i) = InputBox(str) 'функция ввода строки
   Next I
   End Sub
Объявление функции, подсчитывающей сумму любого числа аргументов
   Function SummaVar(ParamArray varArg() As Variant) As Integer
   Dim intSum As Integer, numb As Variant
   For Each numb In varArg 'цикл по всем элементам массива
   intSum = intSum + numb 'по умолчанию инициируется в 0
   Next numb
   SummaVar = intSum 'присвоение возвращаемого значения
   End Function
Вызов подпрограмм и функций
   Чтобы использовать написанную подпрограмму или функцию, ее нужно вызвать.Вызов процедуры-подпрограммы отличается от вызова процедуры-функции.
   Обычно подпрограмма вызывается из другой подпрограммы или функции с помощью специального оператора VBA. Если она имеет аргументы, ей передается список фактических параметров.
   Оператор вызова подпрограммы может использоваться в двух формах:
   <имя Процедуры><список фактических параметров>
   или
   Call <имя Процедуры> (<список фактических параметров>).
   В первом случае список фактических параметров задается без скобок, во втором – использование скобок обязательно. Но всегда список фактических параметров должен полностью соответствовать списку аргументов, заданному в объявлении подпрограммы. Все фактические параметры для обязательных аргументов должны быть перечислены в том порядке, в каком они присутствуют в описании подпрограммы, после чего могут идти параметры для необязательных аргументов.
   Вызов функции имеет следующий вид:
   <имя переменной>=<имя функции>(<список фактических параметров>).
    Примечание.Список фактических параметров при вызове функции должен обязательно заключаться в кавычки.
   Например, вызов объявленной в вышеприведенном примере функции SummaVar может выглядеть следующим образом:
   Dim intShelfs (I To 30) As Integer
   Dim intS As Integer
   Init intShelfs инициируем массив intShelfs
   intS = SummaVar(1,2,3,4,5,6,7,8,9)'суммируем целые числа
    Пример 14. Создать программу, работающую с процедурами и функцией, параметрами которых являются значения, вводимые в текстовые поля формы. После нажатия кнопки Счетна форме основная программа вызывает процедуры и функцию и выводит полученные результаты в три соответствующие метки.
   Процедуры и функция выполняют следующие действия:
   1) первая процедура производит суммирование двух первых введенных значений a и b;
   2) вторая процедура производит умножение третьего и четвертого введенных значений c и d;
   3) функция вычисляет выражение a+b-c*d.
    Технология выполнения
   1. Откройте приложение Word, сохраните документ и перейдите в редактор VBA.
   2. Создайте форму (рис. 30).
   3. Пропишите обработчик события кнопки Счет.
   При создании данной программы необходимо обратить внимание на следующие моменты. В начале программы создаются глобальные переменные, область видимости которых распространяется на все создаваемые процедуры, функцию и основной блок программы.
   При создании процедур происходит считывание информации с текстовых полей. Так как вся информация, введенная в текстовые поля, априори считается текстовой, то необходимо перевести данные строковые переменные в числовые. Для чего используется функция преобразования Val. Функция работает с уже вычисленными значениями в процедурах, поэтому в теле функции вызываются процедуры, точнее их результат.
   Основной блок программы также вызывает процедуры и результат созданной функции. Обратите внимание на различие написания вызова значений процедур и функции.
 
    Рис. 30.Форма примера 14 в режиме конструктора и в рабочем состоянии
 
    Листинг примера 14
   Dim a, b, c, d, k, m, h As Integer
   Sub summ()
   a = Val(TextBox1.Text)
   b = Val(TextBox2.Text)
   k = a + b
   End Sub
   Sub umn()
   c = Val(TextBox3.Text)
   d = Val(TextBox4.Text)
   m = c * d
   End Sub
   Function prim() As Integer
   Call summ
   Call umn
   prim = k – m
   End Function
   Private Sub CommandButton1_Click()
   Call summ
   Call umn
   ' переменные a и b являются глобальными для запуска функции prim, где k, m являются локальными переменными в соответствующих процедурах
   h = prim(a, b)
   Label8.Caption = «сумма a + b =» & k
   Label9.Caption = «произведение c * d =» & m
   Label10.Caption = "значение функции a+b-c*d= " & h
   End Sub
   4. Откомпилируйте программу.
   5. Запустите форму на выполнение.
    Пример 15. Создать программу, которая, используя данные, считанные из текстовых полей формы, выполняет вычисление значений двух выражений: y= sin( a+ b) + 5 и z= tg( c+ + 3) – cos(3 * d), где a, b, c, d– значения переменных, введенных в соответствующие текстовые поля (рис. 31). Данные значения yи zвычисляются в соответствующих процедурах (процедуре) или функциях. Основной блок программы сравнивает полученные значения, и об этом выдается сообщение на форму.
    Рис. 31.Форма примера 15 в рабочем состоянии
 
    Примечание.Для того чтобы определить, какое из двух чисел больше, необходимо из первого числа вычесть второе. Если разность больше нуля, то первое число больше второго (укажет, на сколько), если разность отрицательная, то второе число больше первого. При этом необходимо взять модуль от полученного значения, чтобы определить, на сколько второе число больше первого.
Макросы
   Если приходится часто использовать одни и те же команды в одной и той же последовательности, имеет смысл сохранить эту последовательность в виде VBA-программы. Такая программа называется макросом.
   Запустить средство записи макросов можно командой: меню Сервис+ Макрос+ Начать запись.
   В результате любого из этих действий появится диалоговое окно «Запись макроса» (рис. 32).
 
    Рис. 32.Окно «Запись макроса»
 
   Имена макросов должны ассоциироваться с выполняемыми ими задачами. Однако при этом следует придерживаться определенных правил.
    Имя макроса должно начинаться с буквы, а не с цифры. Имя макроса не должно содержать пробелов. Для выделения начала слов в имени макроса следует использовать прописные буквы.
    Знаки пунктуации не допускаются.
   Командой для начала записи макроса будет щелчок на кнопке ОКв диалоговом окне «Запись макроса». О том, что запись началась, можно узнать по появившейся с этого момента панели инструментов Остановить запись
   Изменится также и указатель мыши, превратившись в небольшое изображение магнитофонной компакт-кассеты.
   После начала записи необходимо выполнить обычные действия, необходимые для работы с документом или приложением, – форматирование текста, вставку рисунков, таблиц, формул и т. д. Все, что будет сделано, – и выбор команд из меню, и форматирование изображений, и печатание текста – будет сохранено в макросе.
   Чтобы остановить запись после выполнения всех команд, которые нужно было записать, необходимо щелкнуть на кнопке «Остановить запись»в панели инструментов с тем же названием. Запись прекратится, а все записанные команды будут сохранены в виде VBA-программы.
   Если необходимо выполнить команду, которая не должна быть частью макроса, щелкните на кнопке «Пауза»(тоже находится в панели инструментов «Остановить запись»).
   Во время паузы в записи кнопка «Пауза»будет выглядеть нажатой. Официально теперь это будет кнопка «Возобновить запись».Щелкните на этой кнопке, чтобы продолжить запись в макрос необходимых действий с приложением.
   Весь смысл записи макросов состоит в возможности их последующего выполнения.Ввиду того, что макросы являются VBA-программами, все приемы, которые используются при запуске созданных вручную VBA-программ, применимы и для автоматически записанных макросов. Всегда можно сначала открыть диалоговое окно Макрос (<Alt+F8>), выбрать в нем нужный макрос, а затем щелкнуть на кнопке Выполнить(рис. 33).
   Независимо от сложности макроса сохраните документ перед тем, как выполнять этот макрос.
 
    Рис. 33.Диалоговое окно «Макрос»
Редактирование программного кода макроса в редакторе Visual Basic
   После того как макрос записан, полученную VBA-программу можно отредактировать. Для этого надо:
   1) выбрать команду Сервис + Макрос + Макросыили нажать <alt+f8 >,чтобы открыть диалоговое окно Макрос (рис. 33);
   2) выбрать нужный макрос из списка ниже поля Имя. Макрос, который был записан, не выбирается автоматически, поэтому, чтобы найти его, иногда придется полистать список;
   3) щелкнуть на кнопке Изменить.Открывается окно редактора Visual Basic с помещенным в него программным кодом, готовым для редактирования.
Задачи на закрепление материала
    Пример 16. Создать программу, рассчитывающую значения выражений в зависимости от выбранного переключателя на форме и введенных значений в текстовые поля. Основная программа после нажатия на кнопку Вычислитьвызывает процедуру Shet,рассчитывающую все необходимые выражения. После нажатия на кнопку Закрытьразработанное приложение закрывается (рис. 34).
    Примечание.При разработке данной формы используется новый элемент Переключатель
   (optionButton), который позволяет выбрать один из нескольких взаимоисключающих параметров или действий. Наиболее часто используемые свойства элемента управления OptionButton:
   value – возвращает True, если переключатель выбран, и False в противном случае;
   enabled – допустимые значения: Тrue (пользователь может выбрать переключатель) и False (в противном случае);
   visible – допустимые значения: Тrue (переключатель отображается во время выполнения программы) и False (в противном случае);
   caption – надпись, отображаемая рядом с переключателем.
 
    Рис. 34.Форма примера 16 в режиме конструктора и рабочем состоянии
 
    Технология выполнения
   1. Откройте приложение Word, сохраните документ и перейдите в редактор VBA.
   2. Создайте форму (рис. 34).
   3. Пропишите обработчики событий кнопок Закрытьи Вычислить.
    Объявление глобальных переменных
   Dim a, b, c, k, l, m As Double
    Создание процедуры Shet
   Sub shet()
   a = Val(TextBox1.Text)
   b = Val(TextBox2.Text)
   c = Val(TextBox3.Text)
   k = a * b + b / c
   l = Sin(a) + (b + c) ^ 2
   m = a + b + c
   End Sub
    Кнопка Вычислить
   Private Sub CommandButton1_Click()
   Call shet
   If OptionButton1.Value = True Then
   Label5.Caption = «a*b+b/c=» & k
   End If
   If OptionButton2.Value = True Then
   Label5.Caption = «sin(a)+(b+c)^2=» & l
   End If
   If OptionButton3.Value = True Then
   Label5.Caption = «a+b+c=» & m
   End If
   End Sub
    Кнопка Закрыть
   Private Sub CommandButton2_Click()
   Unload Me
   End Sub
   4. Откомпилируйте программу.
   5. Запустите форму на выполнение.
    Пример 17. Создать программу, выполняющую следующее: при вводе имени пользователя, среднего балла и числа пропусков в соответствующие текстовые поля формы:
    если средний балл от 4 до 5, число пропусков меньше 100, то приложение выдает сообщение: «Имя, Вы в поощрительном списке у директора!» (рис. 35);
    если средний балл меньше 4 и число пропусков больше 100, то выдается сообщение: «Имя, Вы еще учитесь здесь?».
   При другом раскладе выдумайте свое сообщение.
 
    Рис. 35.Форма примера 17 в рабочем состоянии
 
    Примечание.Можно использовать различные варианты построения данной программы, один из них – использование инструкций If else или Select case.
    Пример 18. Создать программу, выполняющую следующее: при вводе имени пользователя, среднего балла студента в текстовые поля формы и выбора числа пропусков:
    если средний балл 5, число пропусков меньше 100, то приложение выдает сообщение: «Имя, Вы молодец! У Вас меньше 100 часов пропуска и … средний балл»;
    если средний балл от 4 до 5 и число пропусков меньше 150, то выдается сообщение: «Имя, хорошо! У Вас меньше 150 часов пропуска и … средний балл» (рис. 36);
    если средний балл от 3 до 4 и число пропусков до 200, то выдается сообщение: «Имя, надо лучше! У Вас до 200 часов пропуска и … средний балл»;
    если средний балл от 2 до 3 и число пропусков больше 200, то выдается сообщение: «Имя, плохо! У Вас больше 200 часов пропуска и … средний балл».
   При другом раскладе выдумайте свое сообщение.
 
    Рис. 36.Форма примера 18 в рабочем состоянии
 
    Пример 19. Создать программу, выполняющую следующее: при вводе имени пользователя и возраста в текстовые поля формы, выбора среднего балла и числа пропусков:
    если средний балл 5, число пропусков меньше 100, то приложение выдает сообщение: «Имя, Вы молодец! У Вас меньше 100 часов пропуска, средний балл равен 5, и Вам всего … лет!»;
    если средний балл от 4 до 5, число пропусков меньше 150, то приложение выдает сообщение: «Имя, Вы молодец!
   У Вас меньше 150 часов пропуска, средний балл от 4 до 5, и Вам всего … лет!» (рис. 37);
    если средний балл от 3 до 4, число пропусков меньше 200, то приложение выдает сообщение: «Имя, надо лучше! У Вас до 200 часов пропуска и средний балл от 3 до 4, и Вам уже … лет!»;
    если средний балл от 2 до 3, число пропусков больше 200, то приложение выдает сообщение: «Имя, плохо! У Вас больше 200 часов пропуска, средний балл от 2 до 3, и Вам уже … лет!».
    Примечание.Предусмотреть выбор переключателей в произвольном порядке и прописать это в коде.
   При другом раскладе выдумайте свое сообщение.
    Рис. 37.Форма примера 19 в рабочем состоянии

Глава 4
Создание VBA-программ

4.1. Элемент управления ListBox

   В данной главе будут анализироваться VBA-программы, создаваемые в приложении Word без вывода результата в документ Word, поэтому программы применимы во всех приложениях пакета MS Office. Рассматриваемые примеры используют весь теоретический материал, рассмотренный в главах 1–3, а также добавляют новые возможности программирования.
   Во многих создаваемых приложениях используют возможности массивов. Для доступа к элементам массивов часто применяют элемент управления ListBox. Элемент управления ListBox(список) создается с помощью кнопки Список
   (ListBox). Данный элемент нужен для хранения списка значений. Из списка пользователь может выбрать одно или несколько значений, которые в последующем могут использоваться в тексте программы.
   Наиболее часто используемые свойства элемента управления ListBox:
   ListIndex – возвращает номер текущего элемента списка, нумерация элементов списка начинается с нуля;
   Listcount – возвращает число элементов списка;
   TopIndex – возвращает элемент списка с наибольшим номером;
   columnCount – устанавливает число столбцов в списке;
   textcolumn – устанавливает столбец в списке, элемент которого возвращается свойством text;
   text – возвращает выбранный в списке элемент;
   List (row, column) – возвращает элемент списка, стоящий на пересечении указанных строки и столбца;
   RowSourse – устанавливает диапазон, содержащий элементы списка;
   ControlCourse – устанавливает диапазон (ячейку), куда возвращается выбранный элемент из списка;
   multiSelect – устанавливает способ выбора элементов списка. Допустимые значения:
    fmMultiSelectSingle – выбор только одного элемента;
    fmMultiSelectMulti – разрешен выбор нескольких элементов посредством либо щелчка, либо нажатием клавиши Пробел;
    fmMultiSelectExtended – разрешено использование клавиши shift при выборе ряда последовательных элементов списка;
   selected – допустимые значения: True (если элемент списка выбран) и False (в противном случае), используется для определения выделенного текста, когда свойство multiSelect имеет значение fmMultiSelectMulti или fmMultiSelectExtended;
   columnWidths – устанавливает ширину столбцов списка.
   Синтаксис:
   columnWidths = string,
   где String – строка, устанавливающая ширину столбцов.
 
   В примере устанавливается ширина каждого из трех столбцов списка:
   With ListBox1
   ColumnCount=3
   ColumnWidths = “20;30;30”
   end With
   columnHeads – допустимые значения: True (выводятся заголовки столбцов раскрывающего списка) и False (в противном случае);
   listStyle – допустимые значения:
    fmListStylePlain – выбранный элемент из списка выделяется цветом;
    fmListStyleOption – перед каждым элементом в списке располагается флажок, и выбор элемента из списка соответствует установке этого флажка;
   boundColumn – устанавливает тип, возвращаемый свойством Value. А именно: