19.2. СОЗДАНИЕ ПРИЛОЖЕНИЙ НА ЯЗЫКЕ VISUAL BASIC FOR APPLICATIONS

Теория Инструментарий технологии программирования Инструментальные средства пользователя в среде Microsoft office19.2 Создание приложений на языке Visual Basic for applications

## 19.2. СОЗДАНИЕ ПРИЛОЖЕНИЙ НА ЯЗЫКЕ VISUAL BASIC FOR APPLICATIONS

- ### Характеристика языка VBA

- ### Операторы языка VBA

- ### Работа с файлами

- ### Диалоговые окна

### ХАРАКТЕРИСТИКА ЯЗЫКА VBA

#### Основные понятия

Visual Basic for Applications (VBA) является общей языковой платформой для всех приложений (Excel 5.0, Word 6.0, Mail, Power Point). VBA соблюдает основной синтаксис и правила программирования языков-диалектов Basic (BASICA, GW-BASIC). Концепция и синтаксис языка VBA рассмотрены в данной главе применительно к Excel 5.0.

Visual Basic for Applications (VBA) - развитая система визуального программирования для создания прикладных программ в среде Microsoft Office.

С помощью VBA можно создавать объекты управления графического интерфейса пользователя, задавать и изменять свойства объектов, подключать к ним соответствующий программный код. Методика программирования с использованием средств VBA сводится к следующему:

- создание объектов управления и контроля (диалоговые окна, пиктограммы, меню);
- разработка процедур, используемых при вызове объектов.
- Прикладные программы на языке VBA оперируют со следующими понятиями:
- объект управления и контроля - экранные формы, графические элементы внутри форм, в том числе текстовые окна, линейки прокрутки, пиктограммы, окна-списки, командные кнопки и др.;

- свойство (параметр) - характеристика или атрибут объекта управления;

- значение свойства;

- событие - действие, которое распознается объектом управления;

- метод доступа - аналогичное понятиям функция, оператор, который воздействует всегда на объект;

- процедура - подпрограммы и функции, произвольная последовательность операторов VBA; процедуры делятся на событийные (запускаются при наступлении событий) и общие процедуры.

Программы на языке VBA для приложений, функционирующих в среде Excel 5.0, создаются двумя способами:

- в автоматическом режиме как результат построения клавишной макрокоманды (см. подразд. 19.1);

- в неавтоматическом режиме путем создания программного кода.

Ниже рассматривается вариант традиционного программирования на языке VBA применительно к Excel 5.0.

Для создания программного модуля в составе рабочей книги выполняется команда меню ВСТАВКА, Макрос с указанием типа макроса - Модуль. При этом создается новый рабочий лист со стандартным именем Модуль и порядковым номером программного модуля в рабочей книге. Имя модульного листа можно изменить.

При работе с модулем на экран выводится новая панель инструментов Visual Basic (рис. 19.20).

Рис. 19.20. Панель инструментов

Первый ряд кнопок панели (слева направо):

<Вставка Модуля> - вставляет в активную рабочую книгу новый программный модуль;

<Редактор Меню> - редактирование строк и команд меню рабочей книги;

<Просмотр Объектов> - просмотр списка доступных в текущей рабочей книге процедур, модулей, объектов и их свойств.

Второй ряд кнопок:

<Выполнить Макрос> - выбор нужного макроса для запуска через окно диалога Макрос;

<Шаг Макроса> - пошаговое выполнение выбранного макроса (шаг - одна строка кода); .

<Продолжить Макрос> - возобновление выполнения макроса после его останова;

<0становить Макроc> - останов выполнения или записи макроса;

<3аписать Макрос> - ввод через окно диалога Макрос имени нового макроса и его запись.

Третий ряд кнопок:

<Точки Прерывания> - установление (снятие) точки прерывания для строки процедуры;

<Наблюдение> - указание в окне диалога выражения VBA для наблюдения его значений;

<Вход в Процедуру> - выполнение следующей строки кода процедуры VBA;

<Выход из Процедуры> - выполнение следующей строки кода процедуры VBA с приостановкой.

Экран модуля используется для записи строк программы на языке VBA. Основные наборы (классы объектов), с которыми работает программа на языке VBA в среде Excel 5.0, представлены в табл. 19.3.

Таблица 19.3. Перечень наборов VBA Excel 5.0

Имя набора | Вид объектов в наборе

Sheets

Workbooks

Worksheets

Charts

Range

Все листы любых типов в рабочей книге

Все текущие открытые рабочие книги

Все таблицы в рабочей книге

Все листы диаграмм в рабочей книге

Диапазон ячеек таблицы (строк, столбцов, несмежных ячеек,

трехмерных выделений )

Доступ к компоненту набора осуществляется двумя способами:

1) по номеру компонента

Пример 19.5.

Wоrkbooks(" Имя_книги"). Worksheets(2)

2) по имени компонента

Пример 19.6.

Workbooks("Имя_книги").Worksheets("Имя-листа")

Наборы обладают следующими свойствами:

- Count - определяет число компонентов в наборе;

- Name - определяет имя компонента;

- Parent - определяет имя объекта, включающего набор.

Для добавления и удаления компонентов набора используют методы Addи Delete.

Отдельные ячейки таблицы доступны через объект Range и следующие методы:

1.Cell - в качестве аргументов указываются два целых числа, определяющих место положение отдельной ячейки таблицы - Cell (число1; число2)

Пример 19.7.

Cell(l;2).Value=5

Присваивает ячейке В2 текущего рабочего листа активной рабочей книги значение 5;

Cells(2,l).Formula="=SUM(Bl:B5)"

Записывает в ячейку А2 формулу суммирования значений в ячейках В1:В5.

2.Range - работа с прямоугольной областью ячеек, в качестве аргументов используется одна или две ссылки на ячейки таблицы в стиле А1:

Range("A2";"G10")

Range("f4")

либо на блок ячеек по их имени.

Пример19.8.

Worksheets("PRIMTR").Range("Al0";"F12").Value=10

Присвоение блоку ячеек постоянного значения 10.

Range("D15").Value = "Test"

Присвоение ячейке текущего рабочего листа активной рабочей книги значения "Test".

Range("Criteria").ClearContents

Очистка содержимого именованного блока ячеек текущего рабочего листа активной рабочей книги.

Примечание. Можно использовать форму записи Range(Cells(1;1); Cells(2;2)).

3.Offset - в качестве аргументов передаются два числа, указывающие местоположение ячейки относительно верхнего левого угла указанной области. При записи макросов с относительными ссылками макрорекордер использует данный метод для указания выбора.

Пример19.9.

Selection.Offset(2,5).Select

Относительно текущей ячейки, например, А1, происходит смещение в ячейку F3.

["Адрес_ячейки"] - краткая ссылка на ячейку по ее адресу.

4.Union - метод множественного выделения областей ячеек - Uniоп(область1; область2).

Каждую область формируют с помощью метода Range.

Пример 19.10.

Union(Range(Cells(1;1); Cells(2;2)); Range(Cells(5;5); Cells(7;7)).Select

Выделяет области ячеек: А1:B2,E5:G7.

### Встроенные типы данных

VBA использует 11 встроенных типов данных (табл.19.4).

- Boolean использует 2 байта, или 16 бит, памяти для хранения логических данных; имеет два возможных значения: True и False.

- Integer использует 2 байта памяти для хранения целых чисел, в том числе 1 бит для хранения знака числа, 15 бит - для числа.

- Long использует 4 байта, или 32 бита, памяти для хранения целого числа двойной точности, в том числе 1 бит, для хранения знака числа, 31 бит -для числа.

- Single использует 4 байта для раздельного хранения мантиссы (цифровая часть числа - максимум 7 знаков) и порядка (расположение десятичной точки).

- Double использует байтов для раздельного хранения мантиссы (максимум 15 знаков) и порядка.

- Currency использует байтов, десятичная точка всегда располагается между 4 и 5 цифрами справа, обеспечивает автоматическое округление результатов вычислений.

- Date использует байтов и предназначен для хранения дат и времени. Даты записываются в виде целых чисел дней, а время - как дробная часть дня.

- String использует 1 байт для хранения 1 символа плюс 1 байт для отметки конца строки. Символы хранятся в виде кодов ANSI.

- Object использует 4 байта памяти для ссылки на любой объект Visual Basic.

- Array определяет список данных любого типа и любой размерности.

- Variant используется всегда, когда явно не указан какой-либо другой тип; может соответствовать любому другому разрешенному типу данных.

Таблица 19.4 Встроенные типы данных VBA

Тип данных | Размер ( в байтах) | Разряд-ность (цифр) | Диапазон

Boolean

Integer

Long

Single

Double

Currency

Date

String

Object

Array

Variant

2

2

4

4

8

8

8

1+1

4

Зависит от числа элементов и их размера

Зависит от самих данных

1

5

10

7

15

19

True, False

-32768; 32768

-2147483648; 2147483648

-3.402823E+38; 1.401298E-45 и 1.401298Е-45 ;

3.402823Е+38

-1.79769313486232Е+308; -4.94065645841247Е-324 и

4.94065645841247Е-324; 1.79769313486232Е+308

-922337203685477.5808; 922337203685477.5808

01.01.100; 31.12.9999

0; 65535

Любой определенный объект

Любой встроенный тип данных

## Переменные

Переменной называется поименованная область в памяти компьютера во время выполнения программы.

Переменная требует явного объявления своего имени, которое образуют алфавитно-цифровые символы и специальные знаки. Имя всегда начинается с буквы и представляет собой непрерывную последовательность символов, но не более 255 и не содержит специальных символов.

Пример 19.11.

Разрешенное имя переменной | Неразрешенное имя переменной | Комментарий
ПРИмер; приМЕР; EXAMPLE; example |  | Нет различия прописных и строчных букв, кириллицы и латиницы в написании имен
Тарифная_ставка_1_разряда; Tax_off_1_class |  | Для улучшения семантики переменные могут состоять из отдельных слов, соединенных знаком_
| Тарифная ставка $; #room; Class&subclass | Нельзя использовать пробелы в имени переменной, а также специальные символы типа: #$%&!

Программа на языке VBA имеет модульную структуру - главный модуль, в составе которого вложенные модули, содержащие одну или более вложенных процедур.

Каждая переменная имеет определенный тип значений и сферу действия, в противном случае ей приписывается тип Variant. На рис. 19.21 показана сфера действия переменных.

Рис. 19.21. Сфера действия переменных в программе на языке VBA

Переменные, объявленные только в процедуре, действуют в пределах процедуры. Объявление переменной на уровне .модуля делает ее доступной для всех процедур модуля. При этом допускается переопределение имени переменной во вложенных процедурах. Для использования переменной во всех вложенных процедурах и модулях она объявляется глобальной на уровне внешнего модуля (например, переменная Var0 доступна всем вложенным модулям и их процедурам).

Пример 19.12. Переменные var4 var5 используются только в самих процедурах. Переменная var2 объявлена в процедурах 1 и 2. Это соответствует двум различным переменным с одинаковым именем и своей сферой действия (они имеют разные значения и/или типы данных, независимы друг от друга). Переменные на уровне модуля, var1 - в модуле 1 и var3 - в модуле 2. используются во всех вложенных в модуль процедурах. Переменная var1 предопределена в процедуре 1, но сохраняет свое значение в процедуре 2; переменная var3 предопределена в процедуре 3.

Переменные в модуле объявляются с помощью операторов различных типов:

- локальные переменные

Dim <var> As <type>, <var> As <type>, <var> As <type>, . . .

глобальные переменные

Public <var> As <type>, <var> As <type>, <var> As <type>, . . .

где <var> - имя переменной;

<type>- встроенный тип данных переменной.

### Массивы переменных

Массивы переменных имеют произвольную размерность - одномерные, двухмерные, трехмерные и т.п, объявляются следующими операторами:

- локальный массив

Dim <Arr> (размерность) As <type>

- глобальный массив

Public <Arr> (размерность) As <type>

где <Arr> - имя массива,

(размерность) - размерность массива,

Пример 19.13.

Размерность массива | Обозначение размерности | Комментарий и примеры
Одномерный | (число) | Dim Ball (5) as Integer-6 элементов массива, индекс элементов начинается с 0
| (число1 To число2) | Dim Basket (45 To 74 ) as Single-30 элеме- нтов массива
Двухмерный | (число1, число2) | Dim Foot (1, 3) as Long- 8 элементов массива: Foot (0, 0) Foot (0, 1) Foot (0, 3) Foot (0, 3) Foot (1, 0) Foot (1, 1) Foot (1, 2) Foot (1, 3)
| Комбинация | Dim Cross (1, 4 To 5) As Date-4 элемента массива: Cross (0, 4) Cross (0, 5) Cross (1, 4) Cross (1, 5)
Трехмерный | (число1, число2, число3) | Public Game (2, 2, 3) As Single- 36 эле-ментов массива: Game (0, 0, 0) Game (0, 1, 0) Game (0, 2, 0) Game (0, 0, 1) Game (0, 0, 2) Game (0, 0, 3) Game (0, 1, 1) Game (0, 1, 2) Game (0, 1, 3) Game (0, 2, 1) Game (0, 2, 2) Game (0, 2, 3) и т.д.

### Пользовательские типы данных

Оператор Type позволяет на уровне модуля определить пользовательскую структуру данных, включающую другие разнородные, логически связанные переменные, например:

[Private] [Public]Type<typename>

< elementname 1 > As <type>

< elementname2> As <type>

End Type

где <typename> - имя пользовательского типа данных;

< elementname> - имя составляющей структуры.

В модуле с помощью операторов Dim или Public необходимо объявить переменную, использующую пользовательский тип данных. Как правило, это массивы.

Пример 19.14.

Type Student

FullName As String *20

Group As Single

BrithDay As Date

Hight As Integer . . .

End Type

Dim Student_Card (1 To 1000) As Student

Тип Student служит для объявления массива Student_Card размерностью 1000 элементов, структура записи включает: фамилию, имя, номер учебной группы, дату рождения, рост.

### Объявление констант

Константа - величина, сохраняющая постоянное значение во время выполнения программы, но изменяемая по желанию пользователя.

Константы объявляют с помощью оператора:

Const <const> = <значение>

где <const> - имя константы;

<значение> - значение константы.

Для констант существует понятие сфера действия:

- лобальные константы имеют ключевое слово Public:

  Public Const Datel=#12.12.96#

- локальные константы:

  Const Date2=#12.12.97#

  Локальные константы объявляются в пределах процедуры или модуля, глобальные константы - на уровне внешнего модуля и доступны для всех вложенных модулей и процедур.

  VBA имеет встроенные константы, которые применяют без специального объявления и начинаются с символов vb. Excel 5.0 использует встроенные константы, начинающиеся символами xl.

  ### ОПЕРАТОРЫ ЯЗЫКА VBA

  Оператор присваивания

  Данный тип оператора служит для присвоения начальных значений, записи результата вычисления в переменную, изменения значений.

  Оператор присваивания имеет следующую структуру построения:

  <var>= <formula>

  где <var> - имя переменной;

  <formula> - формула.

  Переменная слева от знака "=" может быть простой переменной, элементом массива или свойством объекта. Формула состоит из переменных, констант, операций и функций.

  Пример 19.15.

  Place="d:\windows\system"

  File="GameTree.Exe"

  Student_Card(100).Group= 133

  С помощью оператора присваивания сохраняются результаты вычислений по формуле в памяти машины - под именем переменной.

  VBA использует различные операции для построения выражений, проверки условий Операции имеют определенный приоритет (старшинство) выполнения (табл. 19.5).

  Таблица 19.5. Основные операции языка VBA

  Операция | Название | Приоритет | Операция | Название | Приоритет
  Операция для построения формул
  ^ | Возведение в степень | 1 | Mod | Остаток от деления | 5
  - | Отрицание ( НЕ) | 2 | + | Сложение | 6
  * | Умножение | 3 | - | Вычитание | 6
  / | Деление | 3 | & | Объединение (конка-тенация) строк | 7
  \ | Деление нацело | 4 |  |  |
  Операции сравнения
  = | Равно |  | >= | Больше или равно |
  <> | Не равно |  | Is | Идентично ( только для объектов, вместе с зарезервированным словом Null используется для проверки, является ли значение пустым) |
  < | Меньше |  | Like | Использование шаблонов для поиска и сравнения |
  <= | Меньше или равно |  | Between┘ And | Проверяет принадлежность выражения указан-ному диапазону значений |
  > | Больше |  | In | Проверяет выражение на совпадение с любым из элементов в списке |

  Приоритеты перечислены в порядке убывания (чем больше номер, тем меньше приоритет операции). Для изменения естественного порядка выполнения операций используются круглые скобки.

  Пример 19.16.

  Disct=(S - P)/(dt)^2

  Сначала вычисляется разность S - Р, затем произведение dt возводится в степень 2, после этого вычисляется частное от деления; результатприсваивается переменной Disct.

  #### Оператор комментариев

  Комментарий - это пояснение к программе. Любой комментарий начинается в строке с произвольного места программы символом '. Комментарии предназначены для сопровождения и поддержки программ. Как правило, разработка и сопровождение программ осуществляются различными специалистами. Текст комментариев должен обеспечить понимание логики программы, отражать ее специфику.

  Пример 19.17.

  Текст программы | Комментарий
  Option Explicit | Обязательность объявления всех переменных в модуле перед их использованием
  Sub случ_числа( ) | Процедура генерации случайных чисел в выделенной области электронной таблицы Excel 5.0
  Dim numrows As Integer; numcols As Integer Dim therow As Integer; thecol As Integer | Объявление переменных
  numrows=Selection.Rows.Count numcols=Selection.Columns.Count | Присвоения значения числа строк и столбцов в выделенной области электронной таблицы
  Randomize | Запуск генератора случайных чисел
  For therow= 1 To numrows | Организация цикла типа For-Next, внешний цикл
  For thecol= 1 To numcols | Внутренний цикл
  Selection.Cell( therow; thecol).Value=Rnd | Присваивание текущей ячейке случайного числа Selection- выбор ячейки Cell- метод доступа к ячейке с определенными координатами Value- свойство "значение"
  Next thecol | Конец внутреннего цикла
  Next therow | Конец внешнего цикла
  End Sub | Конец процедуры

  ### Процедуры

  Программные модули VBA состоят из процедур (одной или более).

  Процедура - минимальный модуль в составе прикладной программы на языке VBA.

  Процедуры имеют стандартное оформление:

  Sub <имя_процедуры> (аргументы)

  тело процедуры (операторы)

  End Sub

  Оператор Sub - объявление процедуры, задается имя, указывается состав аргументов, передаваемых при вызове процедуры из программы. Каждому оператору Sub обязательно соответствует End Sub.

  Тело процедуры - набор последовательно выполняемых операторов на языке VBA. В программе можно не только использовать процедуры данного программного модуля, но и ссылаться на процедуры других модулей текущей рабочей книги, а также процедуры других рабочих книг. Для этого необходимо задать ссылки; при нахождении на рабочем листе модуля выполняется команда СЕРВИС, Ссылки. В диалоговом окне "Ссылки" показан список доступных ссылок на библиотеки или другие рабочие книги.

  Для установления новых ссылок необходимо нажать кнопку <Пролистать> и вызвать диалоговое окно для выбора диска, каталога и файла, содержащего процедуры, на которые возможны ссылки из данного программного модуля. Доступность процедур определенного программного модуля или библиотеки указывается с помощью переключателя.

  Различают 4 типа процедур:

- процедуры общего назначения (стандартные), как правило, не вносят изменений вне себя;
- командные процедуры расширяют возможности прикладных программ, реализуя новые виды обработки;
- процедуры обработки событий выполняются при наступлении событий определенного вида (например, открытие или закрытие электронной таблицы Excel, нажатие кнопки, перемещение объекта и т.п.);
- функции пользователя, возвращающие вычисленное значение, которое может быть использовано по аналогии с вызовом встроенных функций VBA.

  Существует несколько вариантов вызова процедур (все необходимые ссылки на соответствующие процедуры заранее устанавливают).

  1. Из другой процедуры того же модуля вызов осуществляется по имени процедуры

  Sub Рrос_А () ' вызывающая процедура Рrос_А ()

  Рrос_В ' вызов процедуры Рrос_В()

  End Sub ' Завершение работы процедуры Рrос_А ()

  Sub Proc_B () ' вызываемая процедура

  End Sub ' Завершение работы процедуры Proc_B ()

  2. Из другой процедуры другого (подключенного) модуля вызов осуществляется по имени модуля, имени процедуры (в пределах одного приложения)

  Sub Рrос_А () 'вызывающая процедура Рrос_А ()

  [Модуль#].Рrос_В ' вызов процедуры Рrос_В() модуля Модуль#

  End Sub ' Завершение работы процедуры Proc_A ()

  3. Из другого приложения (другой рабочей книги ППП Excel 5.0) - вызов осуществляется по имени модуля, имени процедуры и имени рабочей книги

  Sub Рrос_А () 'вызывающая процедура Рrос_А ()

  [RWl.XLS].[Модуль#].Proc_B ' вызов процедуры Рrос_В() модуля

  'Модуль# рабочей книги RW1.XLS

  End Sub ' Завершение работы процедуры Рrос_А ()

  Примечание. Если в нескольких рабочих книгах имеется ряд процедур с определенным именем, следует указать имя файла рабочей книги и имя модуля в этой книге при вызове процедуры.

  Чтобы предотвратить доступ к процедуре из других модулей, процедуру делают частной. Для этого в операторе процедуры следует указать:

  Private Sub Proc_B ()

  End Sub

  Для защиты модуля рабочей книги от доступа к нему из процедур другой рабочей книги в начале модуля указывают: Option Private Module

  Если в момент вызова процедуре передаются какие-то величины либо значения при ее выполнении, определяют список аргументов, который содержит данные обмена с вызывающей процедурой.

  В теле процедуры могут быть объявлены внутренние переменные, которые не являются предметом обмена с вызывающей процедурой, такие переменные не могут изменяться вне пределов вызываемой процедуры.

  Объявление аргументов в заголовке процедуры имеет стандартный вид:

  Sub Proc_B (Val 1 As Single; Val 2 As Date;...)

  Через выбранный разделитель списков (в зависимости от настройки Windows - запятая или точка с запятой) следуют аргументы с указанием имени и типа значения.

  Если аргумент необязательный, т.е. может не задаваться при вызове процедуры, указывается ключевое слово Optional.

  Пример 19.18. Процедура вычисления площади прямоугольника по двум сторонам

  Текст программы | Комментарий
  Sub SquarPr (L As Single; H As Single; S As Single; Optional F) | Объявление процедуры SquarPr и ее аргументов
  If IsMissing( F) Then F=100 | Встроенная функция VBA- IsMissing проверяет наличие аргумента , если F не задано, по умолчанию F присваивается значение 100 ( F имеет тип Variant )
  S=L*H | Вычисление площади прямоугольника
  End Sub | Конец процедуры

  Вызов такой процедуры выполняется различным образом.

  1-й вариант - непосредственное задание значений аргументов при вызове процедуры

  Текст программы | Комментарий
  Sub Proc_A ( ) Dim Sq as Single | Вызывающая процедура
  SquarPr 12; 23; Sq | Вызов процедуры с передачей значений длин сторон прямоугольника в явном виде, результат вычисления будет присвоен переменной Sq
  End Sub | Конец процедуры

  2-й вариант - через имена переменных, которым присвоены значения

  Текст программы | Комментарий
  Sub Proc_A ( ) | Вызывающая процедура
  | Объявление переменных
  Dim Sq as Single | ПЛОЩАДЬ
  Dim LL as Single | ДЛИНА
  Dim HH as Single | ВЫСОТА
  LL=12 HH=23 | Присвоение значений переменным
  SquarPr LL HH Sq | Вызов процедуры с передачей значений длин сторон прямоугольника в явном виде, результат вычисления будет присвоен переменной Sq
  End Sub | Конец процедуры

  3-й вариант - использование списка поименованных аргументов при вызове процедуры

  Текст программы | Комментарий
  Sub Proc_A ( ) | Вызывающая процедура
  | Объявление переменных
  Dim Sq as Single | ПЛОЩАДЬ
  Dim LL as Single | ДЛИНА
  Dim HH as Single | ВЫСОТА
  LL=12 HH=23 | Присвоение значений переменным
  SquarPr L:=LL; H:=HH; Sq | Вызов процедуры с указанием соответствия имен аргументов вызываемой процедуры, которые разделяются в строке знаком :
  End Sub | Конец процедуры

  При завершении работы вызываемой процедуры и передаче управления вызывающей процедуре происходит потеря значений переменных, объявленных в вызываемой процедуре.

  Для предотвращения этого сохраняемые переменные следует объявлять оператором:

  Static <var> As <type>

  Обычно при вызове процедуры происходит передача адреса, по которому находится значение (адрес соответствует имени переменной). Процедура может изменить значение аргумента. Для блокировки изменения значения аргумента следует передача величин значением. Для этого выполняется либо модификация заголовка процедуры, либо передача аргументов в виде формулы.

  Для модификации заголовка процедуры выполняется указание ключевого слова By Val перед именами аргументов, значение которых не изменится внутри процедуры.

  Пример 19.19.

  Sub SquarPr (By Val L As Single; By Val H As Single; S As Single)

  S=L*H

  L=10

  H=20

  End Sub

  Для преобразования аргумента в виде формулы при вызове процедуры имя переменной заключается в круглые скобки.

  Пример 19.20.

  Текст программы | Комментарий

  Sub Proc_A ( )

  Dim Sq as Single

  Dim LL as Single

  Dim HH as Single

  LL=12

  HH=23

  SquarPr L:=(LL); H:= (HH); S:= Sq

  End Sub

  Вызывающая процедура

  Объявление переменных

  ПЛОЩАДЬ

  ДЛИНА

  ВЫСОТА

  Присвоение значений переменным

  Преобразование аргумента в формулу

  Конец процедуры

  Встроенные функции VBA

  Встроенные функции VBA обеспечивают сложные виды обработки данных, избавляя пользователя от разработки собственных программ. Функции имеют аргументы, в качестве которых используются переменные, константы, выражения. Как правило, встроенные функции VBA (табл. 19.6) возвращают отдельные значения (не массивы).

  Некоторые встроенные функции VBA имеют два варианта реализации, в одним случае возвращается значение типа Variant, в другом - типа String. Предпочтительнее использовать строковый тип данных (String), если:

  ∙в большой программе используется много переменных;

  ∙программа детально структурирована;

  ∙данные записываются непосредственно в файл прямого доступа.

  Некоторые встроенные функции VBA возвращают значение в виде строки символов, если к имени функции добавлен символ - $, Следующие встроенные функции имеют одинаковые формат и правила применения, что и без символа $:

  Chr$═ | Oct$ | CurDir$ | Right$ | Date$ | RTrim$ | Dir$
  Error$ | Space$ | Formats$ | Str$ | Hex$ | String$ | Input$
  Lcase$ | Trim$ | Left$ | UCase$ | Ltrim$ | Seek$ | Mid$
  |  |  |  |  |  | Time$

  Таблица 19.6. Категории встроенных функций VBA

  Категории встроенных функций | Примеры функций
  Математические | ABS()-абсолютное значение числа; RND()-случайное число; INT()выделение целой части числа; Тригонометрические функции и др.
  Строковые | LCASE()-преобразование в строчные буквы строки символов; UCASE()-преобразование в прописные буквы строки символов; LEFT()-выделение подстроки слева; RIGHT()-выделение подстроки справа; LEN()-определение длины строки и др.

  Даты и времени

  DATE()-возврат текущей системной даты;

  CDATE()-конвертирование выражения в формат дата/время;
  TIME()-возврат текущего системного времени;

  NOW()-возврат текущей даты и текущего времени ( по компьютеру);

  DAY()-возврат номера дня года;

  MONTH()-возврат номера месяца года;

  WEEKDAY()возврат номера дня недели;

  YEAR()-возврат номера года и др.

  Преобразование типов данных

  CINT()-преобразование действительного числа в целое ( с округлением);

  CSTR()-преобразование числа в строку символов;

  CVAR()-преобразование в тип данных VARIANT;

  FORMAT()-форматирование данных типа дата, время, число, строка символов для печати или записи в файл;

  STRCOMP()-сравнение двух строк;

  VAL()-преобразование строки символов в число и др.

  Файловые системы | FILEATRR()-возврат атрибутов файла; FILEDATETIME()-определяет дату и время создания (модификации ) файла; FILELEN()-определяет длину файла в байтах; FREEFILE()-определяет следующий свободный номер для работы с файлом и др.

  ### Функции пользователя

  На языке VBA можно создавать функции пользователя, которые, в отличие от процедуры, возвращают вычисленное значение (одно); оно может участвовать в выражениях оператора присваивания.

  Заголовок функции пользователя имеет вид:

  Function <имя_процедуры>(аргументы) As <type>

  тело процедуры (операторы)

  End Function

  Внимание! Для функции указывается тип возвращаемой величины - As <type>. В теле функции используется оператор присваивания вычисленного значения имени функции.

  Пример 19.21. Использование пользовательской функции вычисления площади прямоугольника

  Текст программы | Комментарий

  Sub Proc_A ( )

  Dim S as Single

  Dim LL as Single

  Dim HH as Single

  LL=12

  HH=23

  S=Sq(LL; H)/2+1200

  End Sub

  Function Sq (H As Single; L As Single As Single)

  Sq=H*L

  End Function

  Вызывающая процедура

  Объявление переменных

  ПЛОЩАДЬ

  ДЛИНА

  ВЫСОТА

  Присвоение значений

  переменным

  формула вызова функции Sq

  конец процедуры

  Объявление функции Sq с аргументами

  Присвоение функции Sq результата вычисления

  Конец функции

  ### Управляющие структуры

  VBA относится к категории языков структурного программирования и позволяет использовать стандартные управляющие структуры, к которым относятся: условный оператор, альтернативная выборка, циклы.

  Условный оператор If. Оператор может использоваться в двух нотациях: в виде простой и блочной структур.

  Оператор простой структуры имеет следующий формат записи:

  If <выражение> Then <оператор>

  Данный оператор обеспечивает проверку выражения (условия). Если условие истинно (True), выполняется простой или составной оператор, следующий за словом Then; если условие ложно (False), управление передается следующему за If оператору.

  Составной оператор - последовательность операторов одной строки, разделенных знаком : (двоеточие).

  При построении выражения с помощью операторов логического сравнения следует обеспечить однотипность сравниваемых величин.

  Пример 19.22.

  If MaxPrice > 23,000.00$ Then MaxPrice=23,500.00$

  If Student_Card(100).FullName Like "Пе*" Then number=Sludent_Card (100).Group

  При построении выражений используют специальные функции логических проверок VBA.

  Логические выражения могут быть построены с помощью стандартных логических функций:

  Функция | Описание |  | Функция | Описание
  Not And Or | Инверсия или отрицание Логическое "И" Логическое "ИЛИ" |  | Xor Imp Eqv | Исключающее "Или" Импликация Эквивалентность

  Оператор If блочной структуры имеет дополнения:

  If <выражение 1 > Then <блок операторов 1>

  ЕlseIf <выражсние2> Then

  <блок операторов2>

  ElseIf <выражение3> Then

  <блок операторов3>

  [Else

  <блок операторов Else>

  End If

  Последовательно выполняется проверка истинности выражений. Если выражение1 истинно, выполняется блок операторов1, иначе выполняется проверка истинности выражения2 и т.д.

  Если ни одно из выражений не соответствует требованиям истинности, выполняется блок операторов Else, если оно имеется, иначе - оператор, следующий за End If.

  Пример 19.23. Организация проверки условия блочной структурой оператора If

  Текст программы | Комментарий
  If AvgPrice >12000 Then DiffPrice=Full(234, 45600) | Проверка условия 1 Если условие 1 истинно, вызов процедуры

  ElseIf AvgPrice > 24000 Then

  DiffPrice=Full ( 12000, 45000)

  ElseIf AvgPrice > 36000 Then

  DiffPrice=Full ( 24000, 50000)

  Else

  DiffPrice=Full ( 36000, 70000)

  End If

  Проверка условия 2

  Если условие 2 истинно, вызов процедуры

  Проверка условия 3

  Если условие 3 истинно, вызов процедуры

  Если условие 1-3 не выполняются,

  Вызов процедуры

  Конец блока If

  Оператор выборки Select Case. Данный оператор применяется в том случае, если во всех логических условиях участвует одна и та же величина (переменная):

  Select Case <величина>

  Case <сравнение 1>

  <блок операторов 1>

  Case <сравнение2>

  <блок операторов2>

  [ Case Else

  <блок операторов Else> ]

  End Case

  Выражение для сравнения может быть записано в виде: Case 45 или Case 3, 4, 5, или Case 5 То 12.

  Если ни одно из сравнений не является истинным, выполняется блок операторов Else, если блок Else отсутствует, управление передается оператору, следующему за End Case.

  Пример 19.24. Организация последовательной проверки значения переменной

  Текст программы | Комментарий
  Select CDemse | Начало работы оператора Select, объявление имени переменной, для которой выполняются последующие проверки-Demse
  Case Demse 21 | Первое сравнение
  Dem=21 | Если первое сравнение истинно, выполняется оператор присваивания
  Case Demse 22; 25; 28 | Второе сравнение- указан список возможных значений
  Dem=31 | Если второе сравнение истинно, выполняется оператор присваивания
  Case Demse 45 To 48 | Третье сравнение истинно, выполняется оператор присваивания
  Case Else | Если не выполнилось ни одно из указанных сравнений
  Dem=51 | Выполняется присваивание
  End Case | Конец оператора Select

  Оператор цикла For-Next. Данный оператор относится к категории вычисляемых циклов, когда известно заранее число повторений цикла, заданы начальное, конечное значения и шаг (приращение) изменения начального значения, т.е.:

  Для каждого значения переменной этого цикла выполняется блок операторов, расположенных до ключевого слова Next. Затем происходит изменение переменной цикла (увеличение значения на шаг), проверяется полученное значение (не более указанного конечного значения) и повторяется выполнение блока операторов.

  Если переменная цикла превысила значение конец, управление передается оператору, следующему за фразой Next.

  В теле цикла может присутствовать оператор Exit For. При выполнении этого оператора прекращается цикл и управление также передается оператору, следующему за фразой Next. Цикл For-Next может быть вложенным.

  Пример 19.25. Организация циклов с использованием счетчика повторений

  Текст программы | Комментарий
  Sub stickRandom() | Объявление имени процедуры
  Dim numrows As Integer; numcols As Integer Dim therow As Integer; thecol As Integer | Объявление переменных
  numrows=Selection.Rows.Count | Определение числа строк в выделенном блоке ячеек
  numcols= Selection.Columns.Count | Определение числа столбцов в выделенном блоке ячеек
  Debug.Print numrows; numcols | Печать числа строк и столбцов в выделенном блоке ячеек
  Randomize | Генератор случайных чисел
  Debug.Print Rnd | Печать случайного числа
  For therow=1 To numrows | Внешний цикл по числу строк в блоке ячеек
  For thecol=1 To numcols | Внутренний цикл по числу столбцов в блоке ячеек
  Selection.Cell(therow; thecol).Value=Rnd | Присваивание текущей ячейке случайного числа Selection-выбор ячейки Cell-метод доступа к ячейке с определенными координатами Value - свойство "значение"
  Next thecol | Конец внутреннего цикла
  Next therow | Конец внешнего цикла
  End Sub | Конец процедуры

  Цикл Do-Loop. Логически управляемый цикл, оператор Do Loop - конец цикла; имеет 4 модификации:

  1) условие True в начале цикла

  Do While <условие>

  <блок операторов>

  Exit Do

  <блок операторов>

  Loop

  Цикл выполняется до тех пор, пока истинно <условие>. Минимальное число повторений тела цикла - 0. Оператор Exit Do предназначен для прекращения цикла и передачи управления оператору Loop - конец цикла.

  2) условие True в конце цикла

  Do

  <блок операторов>

  Exit Do

  <блок операторов>

  Loop While <условие>

  Цикл выполняется хотя бы один раз, в конце выполняется проверка <условия>.

  3) условие False в начале цикла

  Do Until <условие>

  <блок операторов>

  Exit Do

  <6лок операторов>

  Loop

  Until указывает, что цикл выполняется до тех пор, пока <условие> не станет истинным. Минимальное число повторений тела цикла - 0.

  4) условие False в конце цикла

  Do

  <блок операторов>

  Exit Do

  <блок операторов>

  Loop Until <условие>

  Условие проверяется в конце, цикл прекращается, когда условие станет истинным. Минимальное число повторений тела цикла - 1.

  Пример 19.26. Выполнение логически прерываемых циклов

  Текст программы | Комментарий
  Option Explicit | Обязательность объявления всех переменных перед их использованием
  Sub Do_Rnd() | Объявление имени процедуры без параметров
  Dim a As Single Dim i As Integer, | Объявление переменных
  Randomize | Вызова генератора случайных чисел
  Do While True | Начало цикла Do. Задание условия выполнение цикла- цикл бесконечный
  a=Rnd | Присвоение переменной случайных чисел
  Debug.Print a | Печать случайного числа
  If a>0.99 Then Exit Do | Блок условия - при его выполнении выход из цикла
  Loop | Конец цикла
  End Sub | Конец процедуры

  Цикл While-Wend. Данный оператор полностью соответствует структуре Do While-Loop. Отличительной особенностью оператора является невозможность прервать выполнение цикла из тела цикла (Exit Do отсутствует), проверка условия выполняется только в начале цикла.

  While <условие>

  <блок операторов>

  Wend

  ЦиклFor Each. Оператор относится к категории операторов объектного типа, т.е. применяется к массивам (элементам) и наборам объектов. Выполняется фиксированное число раз, число объектов в наборе определяется автоматически. Упорядочение элементов набора - произвольное.

  For Each <элемент> In <набор>

  <блок операторов>

  Exit For

  <блок операторов>

  где <элемент> представляет собой переменную типа Variant, <набор> - определенный набор объектов. Для прерывания цикла используется оператор Exit For.

  ### РАБОТА С ФАЙЛАМИ

  Основные понятия

  VBA работает с хранимыми на диске файлами двух типов: последовательного и произвольного доступа.

  Последовательный файл - текстовый, который обрабатывается стандартными средствами текстовых редакторов, так как содержит строки символов в формате ANSI. Все операции с последовательными файлами реализуются от начала файла: при этом одновременно нельзя читать и писать в последовательный файл.

  Файл произвольного доступа имеет записи фиксированной длины: можно одновременно выполнять чтение и запись в файл записей.

  Открытие файла

  Открывать можно как существующие на диске, так и новые файлы. Каждый файл идентифицируется в программе определенным номером, который присваивается ему в момент открытия. Свободный номер файла можно определить с помощью встроенной функции FileFree, которая возвращает очередной свободный номер для открытия файла (номер изменяется в диапазоне 1 - 511).

  Файл открывают в определенном режиме работы:

  Open <путь_имя__файла> [For <режимы>] [Access <направление_потока>] [<блокировка>] As [#]номер [Len=<длина_записи>]

  где <путь имя_файла> - строка символов, задающая местоположение и имя дискового файла;

  <режимы> - режимы работы с файлом:

  Append - добавление записей

  Binary - двоичный файл

  Input - файл для чтения

  Output - файл для записи

  Random - файл произвольного доступа;

  <направление_потока> - задает тип потока данных по отношению к файлу:

  Read - только чтение

  Write - только запись

  Read Write - чтение и запись одновременно;

  <блокировка> - определяет возможность работы с файлом других приложений:

  Shared - распределенный доступ

  Lock Read - блокировка файла для чтения

  Lock Write - блокировка файла для записи

  Lock Read Write - блокировка файла для чтения и записи;

  номер - условный идентификатор файла;

  <длина_записи> - указывается для записей фиксированной длины, максимум - 32767 байт. Оптимальная длина записи кратна размеру дискового сектора (512 байт).

  Для файлов произвольного доступа объявляется структура записи с помощью оператора Type; указываются типы и длина компонентов структуры. В режимах Binary, Input, Random под разными номерами можно открыть один и тот же файл, не закрывая ранее открытых; в режимах Append, Output требуется предварительно закрыть ранее открытые файлы.

  Пример 19.27. Открытие файлов

  Текст программы | Комментарий
  Open "FILE" For Input As #1 | Открытие последовательного файла для чтения
  Open "FILE" For Binary Access Write As #1 | Открытие двоичного файла только для записи
  Type Record Define userdefined type ID As Integer Name As String * 20 End Type Dim MyRecord As Record | Объявление пользовательского типа данных
  Open "FILE" For Random As #1 Len = Len (MyRecord) | Открытие файла произвольного доступа. Длина записи файла определяется встроенной функцией Len
  Open 'FILE" For Output Shared As #1 | Открытие последовательного файла с распределенным доступом (любые приложения могут читать и писать в файл)
  Open "FILE" For Binary Access Read Lock Read As #1 | Открытие двоичного файла для чтения, чтение файла другим приложениям запрещено

  Закрытие файла

  После завершения работы с файлом его закрывают с помощью оператора:

  Close [<список_номеров_файлов>]

  Если номер закрываемого файла не указан, закрываются все открытые файлы.

  Пример 19.28. Закрытие файлов

  Close # 1; #2;#4 ' закрытие файлов, ранее открытых под номерами 1, 2, 4

  Close ' закрытие всех открытых файлов

  Запись информации в файл

  Существует несколько операторов вывода информации в файл.

  1. Печать в последовательный файл

  Данный оператор обеспечивает запись форматированного вывода в последовательный файл текстового типа - по аналогии с функцией печати:

  Print#номер_файла;[<выходной_список_переменных>]

  Выходной список печати может содержать:

  [{Spc(n)|Tab[(n)]}] [<выражение>] [charpos]

  где Spc(n) - длина пустой строки;

  Tab(n) - печать с указанной позиции;

  <выражение> - выражение числового или символьного типа;

  charpos - определяет позицию вставки для следующего символа. Символ ; обеспечивает переход на другую строку (к другой записи файла).

  Если последовательный файл должен затем считываться, не рекомендуется применять оператор Print.

  Пример 19.29. Печать в последовательный файл

  Текст программы | Комментарий
  Open "FILE" For Output As #1 Print #1; "Печать любого текста" | Открытие файла для печати Вывод в файл текстовой строки
  Print #1; | Вставка пустой строки
  Print #1; "Код"; Tab ; "Наименование" | Вывод в две колонки
  Print #1; "Код" ; " " ; "Наименование" | Разделение двух слов пробелом
  Print #1; Sps(5); "Код" | Вставка 5 отступов перед печатью слова
  Print #1; Tab(10); "Код" | Позиционирование в колонку 10
  MyBool=False | Присвоение значений переменным различного типа
  MyDate=#February 12, 1969# MyNull=Null MyError=CVErr(32767) |
  Print #1; MyBool; Print #1; MyDate ; "это дата" Print #1; MyNull; "это пустое значение" Print #1; MyError; "код ошибки" | Печать значения переменной в файл
  Close#1 | Закрытие файла

  Результаты вывода:

  Печать любого текста

  Код Наименование

  Код Наименование

  Код

  Код

  False

  February 12, 1969 - это дата

  Nul - это пустое значение

  Error 32767 - это код ошибки

  2. Запись в последовательный файл

  В последовательный файл запись информации выполняется командой:

  Write #номер_файла; [<выходной_список_переменных>]

  Для данных числового типа используется символ точка для десятичной точки, В отличие от оператора Print при записи в файл автоматически вставляются специальные символы- разделители:

  - запятая - между элементами;
  - двойные кавычки - вокруг символьных данных.
- В запись файла вставляется символ возврата каретки (переход на новую строку - запись файла).

  Пример 19.30. Запись информации в последовательный файл

  Текст программы | Комментарий
  Open 'FILE" For Output As #1 Write #1;"⌠Всем привет!'; 1234567890 Write #1; | Открытие файла для печати Записать символьной строки и числа Вставка пустой строки
  MyBool=False MyDate="February 12, 1969" MyNull=Null MyError=CVErr(32767) | Присвоение значений переменным
  Write #1;; MyBool ; Write #1; MyDate ; Write #1; MyNull ; Write #1; MyError; | Запись значений переменных в файл
  Close#1 | Закрытие файла

  Результат вывода:

  "Всем привет!",1234567890

  #FALSE#,"February 12, 1969",#NULL#,#ERROR 32767#

  3. Вывод данных в файл произвольного доступа

  Вывод данных выполняется оператором:

  Put [#номер_файла; [#записи],<переменная>

  где #записи - номер записи для файла произвольного доступа либо номер байта, с которого начинается запись, для двоичного файла. Если номер не указан, используется следующий за последним использованным в операторах Get. Put, Seek.

  Пример 19.31. Запись в файл произвольного доступа

  Текст программы | Комментарий
  Type Record ID As Integer Name As String * 20 End Type | Объявление пользовательского типа данных для записи
  Dim MyRecord As Record | Объявление переменной на основе пользовательского типа данных
  Open "TESTFILE" For Random As #1 Len=Len(MyRecord) | Открытие файла произвольного доступа с длиной, соответствующей длине объявленного типа
  For RecordNumber=1 To 5 | Организация цикла для записи в файл
  MyRecord.ID=Number ═MyRecord.Name ="Запись номер" & RecordNumber | Формирование содержимого записи
  Put #1, RecordNumber, MyRecord | Непосредственная запись в файл
  Next RecordNumber Close #1 | Конец цикла Закрытие файла

  ### Ввод информации из файла

  1. Чтение данных из последовательного файла Чтение выполняется оператором:

  Input #номер_файла; <список_переменных>

  Двойные кавычки при считывании игнорируются, выполняется проверка соответствия типов данных переменных и файла.

  Пример 19.32. Запись в файл произвольного доступа

  Текст программы | Комментарий

  Open "FILE" For Input As #1

  Do While Not EOF(1)

  Input #1; MyString; MyNumber

  Debug.Print MyString; MyNumber

  Loop

  Close #1

  Открытие файла

  Цикл до конца файла

  Чтение данных записи в переменные

  Печать считанных данных

  Конец цикла

  Закрытие файла

  Другим оператором чтения из последовательного файла является

  Line Input #номер_файла; <переменная>

  Оператор обеспечивает посимвольное считывание данных строки по файлу до обнаружения символа "возврат каретки" (Сhг(13)) и присвоение этих данных указанной переменной символьного типа.

  Пример 19.33. Построчное чтение из файла последовательного доступа

  Текст программы | Комментарий

  Open "TESTFILE" For Input As #1

  Do While Not EOF(1)

  Line Input #1, TestLine

  Debug.Print TextLine

  Loop

  Close #1

  Открытие файла

  Цикл, пока не достигнут конец файла

  Чтение строки в переменную

  Печать в окне Debug

  Конец цикла

  Закрытие файла

  2. Чтение данных из файла произвольного доступа

  Данный оператор обеспечивает считывание записи файла произвольного доступа в указанную переменную:

  Get Put [#номер_файла; [#записи],<переменная>

  Пример 19.34. Чтение из файла произвольного доступа

  Текст программы | Комментарий
  Type Record | Объявление пользовательского типа данных для записи
  ID As Integer Name As String * 20 End Type |
  Dim MyRecord As Record | Объявление переменной на основе пользовательского типа данных
  Open "FILE" For Random As #1 Len=Len(MyRecord) | Открытие файла произвольного доступа с длиной, соответствующей длине объявленного типа
  Psition=3 Get #1, Position, MyRecord Close #1 | Задание номера ( индекс) записи Формирование содержимого записи Закрытие файла

  Позиционирование на запись в файле

  Позиция в записи (номер байта или номер записи) для очередного чтения или записи в файл устанавливается оператором:

  Seek [#] номер_файла; позиция

  где позиция.- число в диапазоне номеров байтов (1-2147483 647) файла.

  Для файла, открываемого в режиме последовательного доступа, с помощью оператора SEEK определяется байт.

  Пример 19.35. Позиционирование в файле последовательного доступа

  Текст программы | Комментарий
  Dim MyChar As String | Объявление переменной на основе пользовательского типа данных
  Open "FILE" For Input As #1 | Открытие файла произвольного доступа с длиной, соответствующей длине объявленного типа
  MaxSize=LOF(1) | Вычисление количества байтов в файле
  For NextChar- MaxSize To Step -1 | Организация цикла для последовательного считывания записей от конца файла к его началу
  Seek #1, NextChar MyChar= Input(1,#1) Next NextChar |
  Close #1 | Закрытие файла

  Для файла, открываемого в режиме произвольного доступа, определяется очередной номер записи, с которой будет работать программа.

  Пример 19.36. Позиционирование в файле произвольного доступа

  Текст программы | Комментарий
  Type Record | Объявление пользовательского типа данных для записи
  ID As Integer Name As String * 20 End Type |
  Dim MyRecord As Record | Объявление переменной на основе пользовательского типа данных
  Open "FILE" For Random As #1 Len=Len(MyRecord) | Открытие файла произвольного доступа с длиной, соответствующей длине объявленного типа
  MaxSize=LOF(1)\ Len(MyRecord) Get For RecordNumber=MaxSize To 1 Step-1 | Вычисление количества записей в файле Организация цикла для последовательного считывания записей от конца файла к его началу
  Seek #1, RecordNumber Get #1, , MyRecord Next RecordNumber |
  Close #1 | Закрытие файла

  ### ДИАЛОГОВЫЕ ОКНА

  Существует несколько типов диалоговых окон, которые необходимы для поддержания в программе интерактивного режима работы конечного пользователя (вывод сообщений пользователю, прием и интерпретация указаний, введенных пользователем, и др.).

  Диалоговые окна для обмена сообщениями

  Встроенная функция MsgBox() обеспечивает создание диалоговых окон различных типов.

  1. Простое окно-сообщение

  MsgBox ( "строка_сообщения")

  Если в сообщении должно присутствовать значение переменной или элемента массива переменной, элемент структуры пользовательского типа данных и т.п., следует преобразовать значения в строковый и обеспечить конкатенацию строк.

  Пример 19.37.вывод сообщения о значении переменной

  Текст программы | Комментарий

  Option Explicit

  Sub Msg_Priim()

  Dim a As Single

  Randomize

  a=rnd

  MsgBox "Значение случайного числа" & Str(a)

  End Sub

  Обязательность объявления всех переменных в модуле перед их использованием

  Объявление процедуры

  Объявление переменных

  Запуск генератора случайных чисел

  Присвоение переменной значения случайного числа

  Вывод сообщения

  Конец процедуры

  2. Окно-сообщение с командными кнопками

  Общий формат оператора:

  MsgBox("строка_cooбщение"[, <кнопки>] [, "заголовок_окна'' [, <файл-подсказки>, <контекст>])

  где <строка_сообщение> - максимальная длина строки - 1024 символа;

  <кнопки> - число, являющееся суммой кодов выбранных типов кнопок и пиктограммы, или имена кнопок;

  <заголовок_окна> - строка символов;

  <файл-подсказки> - имя файла-подсказки для контекстно-зависимой помощи при работе в окне, строка символов;

  <контекст> число, которое назначено подсказке дня данного окна.

  Коды задания командных кнопок и пиктограмм в функции MsgBox() приведены в таб. 19.7. Функция MsgBox() возвращает код (число), соответствующий нажатой кнопке-

  Таблица 19.7. Список видов командных кнопок и их кодов

  Код | Константа | Описание

  0

  1

  2

  3

  4

  5

  0

  256

  512

  16

  32

  48

  64

  0

  4096

  vbOKOnly

  vbOKCancel

  vbAbortRetryIgnore

  vbYesNoCansel

  vbYesNo

  vbRetryCansel

  vbDefaultButton 1

  vbDefaultButton 2

  vbDefaultButton 3

  vbCritical

  vbQuestion

  vbExclamation

  vbInformation

  vbApplicationModal

  vbSystemModal

  #### Коды командных кнопок

  ОК

  ОК, Отмена

  Прекратить, Повторить, Игнорировать

  Да, Нет, Отмена

  Да, Нет

  Повторить, Отмена

  #### Коды активности по умолчанию

  Активная 1

  Активная 2

  Активная 3

  #### Коды пиктограмм

  Важное сообщение

  Предупредительный запрос

  Предупредительное сообщение

  Информационное сообщение

  #### Коды модальности

  Программное модальное описание ( требуется обязательный ответ, работа приложения приостанавливается)

  Системное модальное описание ( требуется обязательный ответ, работа всех приложений приостанавливается)

  Пример 19.38. Формирование диалогового окна с кнопками

  Текст программы | Комментарий
  Option Explicit | Обязательность объявления всех переменных перед их использованием
  Sub Msg_Priim() | Объявление процедуры
  Dim Response As Integer Dim Msg As String Dim Title As String Dim Help═As String Dim═Ctxt As Integer | Объявление переменных
  Msg= "Вы хотите продолжить?" Styl=35 | Строка сообщения Кнопки для окна ( vbYesNoCancel+ vbDefaultButton+ vbQuestion)
  Title=" Пример окна-сообщения" | Заголовок окна
  Help= "DEMO.HLP" | Имя файла- подсказки
  Ctxt=0 | Номер контекста внутри файла- подсказки
  Response=MsgBox( Msg; Style;Title; Help; Ctxt) | Присвоение переменной кода ответа
  End Sub | Конец процедуры

  Диалоговые окна для ввода данных

  Функция InputBox() обеспечивает формирование окна для вывода строки сообщения и ожидания ввода строки символов или нажатия кнопки. Возвращает содержание текстового блока:

  InputВох(<строка_сообщение> [,<заголовок_окна>] [,<текст_по_умолчанию>] [,Хпоз][,Yпоз][, <файл-подсказки>, <контекст>])

  где <текст_по_умолчанию> - строка символов, выводимая в текстовом блоке (может быть пустой);

  Хпоз, Yпоз - позиция левого верхнего угла окна.

  Пример 19.39. Формирование окна ввода

  Текст программы | Комментарий
  Option Explicit | Обязательность объявления всех переменных в модуле перед их использованием
  Sub Msg_Inp() | Объявление процедуры

  Dim Response As String

  Dim Message As String

  Dim Default As String

  Dim Title As String

  Dim Help As String

  Dim Style As String

  Dim Ctxt As Integer

  Объявление переменной

  Message="Введите Фамилию, Имя, Отчество студента " | Строка-сообщение
  Title=" Пример окна для ввода" | Заголовок окна
  Default=" Смирнов Игорь Александрович" | Текст по умолчанию
  Response=InputBox ( Message; Title; Default; 100; 100) | Присвоение переменной сим-вольного типа результата ввода
  End Sub | Конец процедуры

  Диалоговые окна пользователей

  Диалоговые окна пользователей обеспечивают ввод и редактирование данных файлов и таблиц. Для создания диалогового окна выполняется команда ВСТАВКА, Макрос с указанием типа вставляемого листа - Диалог. Экран содержит основу для построения диалогового окна пользователя, а также панель инструментов Формы (рис. 19.26) для размещения и настройки (форматирования) элементов окна.

  Рис. 19.26. Панель инструментов Формы

  Таблица .19.8. Состав панели инструментов Формы

  В диалоговом окне могут размещаться элементы произвольного вида. которые создают наборы объектов. Доступ к конкретному элементу - по имени набора и имени или порядковому номеру элемента внутри набора.

  Метки не могут редактироваться пользователем в процессе работы с диалоговым окном, но могут изменяться программным путем с помощью свойства Caption объекта Labels().

  Пример 19.40.

  Sheets("<имя_листа_диолога>''). Labels ("<имя_ объекта_метки>")

  .Сарtion="строка текста"

  Поле ввода является многострочным, содержит текст, который можно редактировать. Поле ввода входит в набор EditBoxes(), его можно редактировать и программным способом.

  Пример 19.41.

  Sheets("<имя_листa_диaлoгa>").EditBoxes("<имя_ oкнa>").Text="cтрока текста"

  Кроме того, этот тип элемента диалогового окна обладает следующими свойствами:

  ∙ MultyLine =True - в случае многострочности поля ввода;

  ∙ InputType - ограничение типа данных, вводимых в окно (xlFormula, xlInteger,xllNumber, xlReference, xlText).

  Рамка группы обеспечивает объединение нескольких элементов диалогового окна. Этот тип окна изображается в первую очередь, а затем внутри него размещаются другие элементы. Для задания строки текста в верхней строке рамки программным образом используется его свойство - Caption.

  Флажок обеспечивает аддитивный выбор, имеет свойство Value (принимает значение True, если выбран, или False - в противном случае). Подобные переключатели образуют набор CheckBoxes().

  Кнопка переключателя обеспечивает альтернативный выбор из списка взаимоисключающих опций. Такие кнопки входят в состав группы, если они различны по назначению, либо все кнопки в диалоговом окне образуют единую группу; выбор одной из кнопок внутри группы означает автоматический невыбор других. Подобные переключатели образуют набор OptionButtons(). Свойство Value принимает значение True, если выбрана кнопка, и False - в противном случае.

  Окно списка предоставляет для выбора список значений, при этом редакция списка невозможна. Формирование списка осуществляется только программным путем. Существует несколько вариантов организации списков с помощью свойств объекта;

  ∙ ListFillRange ≈ ссылка на диапазон ячеек электронной таблицы, содержащей значения элементов списка;

  ∙ List() ≈ перечисление элементов списка непосредственно, замена старого списка новым целиком.

  Раскрывающийся список во многом соответствует окну списков, но этот элемент входит в набор DropDowns().

  Поле ввода со списком объединяет окно списка и окно редактирования. При выборе элемента списка он автоматически появляется в окне редактирования, где возможна его корректировка. В принципе это два разных окна с различными свойствами.

  Поле ввода с раскрывающимся списком представляет собой комбинацию выпадающего списка, элементы которого можно редактировать.

  Линейка прокрутки создает горизонтальную или вертикальную линейку прокрутки. Свойство Value содержит число, соответствующее положению ползунка, доступ к линейкам прокрутки через набор-ScrollBars(). Свойства Min и Мах управляют диапазоном значений, доступны как из программы, так и через диалоговое окно форматирования элемента. Свойства LargeChange и SmallCnange содержат величину изменения свойства Value.

  Регулятор счетчика аналогичен линейке прокрутки, но отсутствует свойство LargeChange.

  На рис. 19.27 представлено диалоговое окно пользователя для ввода данных об экзаменационных оценках.

  Диалоговое окно пользователя включает следующие элементы:

  - метки (Группа, Фамилия Имя Отчество, N зач.книжки и др.);
  - окно списка для выбора N группы - список может быть сформирован в ячейках рабочего листа, при этом выделение элемента списка может быть одинарным, множественным или связным. Результат выбора можно записать в указанную ячейку рабочего листа;
  - поля ввода (Фамилия Имя Отчество, ╧ зач.книжки, Дата), для которых может быть указан тип вводимой информации (текст, целое число, число, ссылка, формула), наличие многострочного текста и вертикальной линейки прокрутки;
  - раскрывающиеся списки (дисциплина, преподаватель, оценка), элементы которых могут быть записаны в ячейках рабочего листа, указывается максимально возможное число элементов;
  - кнопки управления (<По умолчанию>, <0тмена>, <3акрыть>, <Справка>).

  Рис. 19.27. Диалоговое окно пользователя

  Для выделенного элемента диалогового окна с помощью команды контекстного меню Формат объекта вызывается окно "Форматирование объекта" для задания указанных, характеристик.