• Глава 1 Типы данных, услоные операторы и массиы VBA
  • 1.1. Введение в VBA. Типы данных
  • 1.2. Редактор VBA. Первое знакомство
  • 1.3. Изменение порядка выполнения операторов
  • Глава 2 Объект UserForm
  • 2.1. Свойства и методы объекта UserForm
  • 2.2. Использование форм
  • Глава 3 Массивы, процедуры, функции
  • 3.1. Организация массивов
  • 3.2. Работа с различными типами данных
  • 3.3. Процедуры и функции VBA
  • Глава 4 Создание VBA-программ
  • 4.1. Элемент управления ListBox
  • 4.2. Элементы управления ComboBox, OptionButton и Frame
  • 4.3. Элементы управления MultiPage, ScrollBar, SpinButton[2]
  • 4.4. Объект DataObject[3]
  • Часть I

    Осноные седения о программироании на VBA

    Глава 1

    Типы данных, услоные операторы и массиы VBA

    1.1. Введение в VBA. Типы данных

    Введение в VBA

    Настоящий курс является начальным руководством по разработке программ, написанных на языке Visual Basic for Application (для приложений).

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

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

    С помощью VBA можно изменять внешний вид или способ применения имеющихся средств приложения, а также добавлять свои, совершенно новые возможности.

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

    Microsoft создала VBA и обеспечила поддержку VBA во всех главных приложениях Office: Word, Excel, Access и PowerPoint.

    Объектно-ориентированное программирование

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

    Определения

    Объектом называется любая именованная сущность, имеющая:

    свойства, т. е. установки, которые можно проверить и изменить;

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

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

    Коллекция – это VBA-объект специального назначения. Коллекции предназначены для упрощения работы с набором объектов, когда этот набор объектов нужно использовать как одно целое. Как правило, все объекты в коллекции имеют один и тот же тип. Например, коллекция Pages состоит из объектов Page. Однако в VBA существует родовой объект Collection, предназначенный для хранения в нем объектов любых типов в любой комбинации.

    Формой называют любое созданное в VBA пользовательское окно. Официально формы в VBA описываются в терминах объекта UserForm. Каждый объект UserForm принадлежит одновременно двум коллекциям объектов: VBA-проекту, в котором хранится форма, и коллекции UserForms, содержащей все формы, загружаемые программой.

    Свойства – это характеристики объекта. Каждое свойство хранит информацию о некотором аспекте внешнего вида, поведения, содержимого объекта. Главной задачей свойства является описание некоторой характеристики объекта.

    Методы – это именованные действия, которые объект может выполнить по команде. Ввиду того, что любой метод является неотъемлемой частью объекта, объект сам знает, что ему делать, когда вызывается метод. Таким образом, методы – не что иное, как процедуры, привязанные к конкретному объекту. Чтобы вызвать метод, необходимо напечатать имя объекта, точку, а затем имя метода.

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

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

    ситуации, в которые попадает объект в ходе выполнения программы.

    Язык VBA является объектно-ориентированным. Это значит, что многие его команды имеют особенный формат. Типичная команда VBA имеет вид:

    <Объект>.<Объект, входящий в первый объект>.<…>.<Тот объект, с которым нужно произвести действие>.<собственно действие>

    Иными словами, каждая команда пишется как бы с «конца»: вначале определяется то, над чем надо произвести действие, – объект, а затем само действие – метод. Разделителями компонентов команды служат знаки «точка».

    Например:

    Application.activDocument.PageSetup.Orientation=wdOrientLandscape

    Эта команда устанавливает альбомную ориентацию листа в документе.

    Обзор типов данных VBA

    Тип данных – это термин, относящийся к определенным видам данных, которые VBA сохраняет и которыми может манипулировать. Любое определение типа задает:

    область возможных значений типа;

    структуру организации данных;

    операции, определенные над данными этого типа.

    VBA разделяет обрабатываемые данные на числа, даты, строки, логические значения и объекты (табл. 1).


    Таблица 1

    Типы данных VBA

    Рассмотрим более подробно данные типы и выделим их яркие особенности.

    VBA имеет шесть различных численных типов данных: Byte, Integer, Long, Single, Double и Currency. Численные типы данных используются для хранения (и манипулирования) чисел в различных форматах, в зависимости от конкретного типа. Численные типы предоставляют компактный и эффективный способ хранения чисел. Численный тип, заполняющий большую часть памяти (имеющий самый большой диапазон возможных значений), занимает не более восьми байтов памяти для хранения чисел, которые могут иметь до 300 цифр.

    Числа с плавающей точкой (floating point numbers) могут иметь любое число цифр до или после десятичной точки (в пределах границ конкретного типа данных) и получили свое название вследствие того факта, что десятичная точка «плавает» из одной позиции в другую, в зависимости от того, сохраняется в памяти большое или малое значение. Числа 24.09156, –1207.7, –0.00225 и 444.67779 – это числа с плавающей точкой. Числа с плавающей точкой иногда называют также действительными (real) числами. Данные типы с плавающей точкой используются всякий раз, когда требуется сохранить число, имеющее дробную часть. VBA имеет два различных типа данных с плавающей точкой: Single и Double.

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

    VBA-тип Currency – это число с фиксированной точкой (fixed-point number), т. е. десятичная точка всегда находится в одном и том же месте – справа от десятичной точки всегда имеются четыре цифры. Тип Currency используется для хранения чисел, когда точность крайне важна, что бывает при «денежных» вычислениях.

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

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

    Типы String играют важную роль во многих программах VBA. Большинство данных ввода пользователей (в диалоговых окнах, ячейках рабочих листов) – это строковые данные. Кроме того, поскольку на экране можно отображать только текст, все другие типы данных должны быть преобразованы в строковые данные перед тем, как они будут выведены на экран. Многие встроенные процедуры VBA используют строковые данные во всех или в некоторых своих аргументах.

    VBA использует тип Date для хранения даты и времени. VBA-тип Date является типом последовательных дат (serial Dates). (Последовательные даты сохраняют дату как число дней от заданной стартовой даты.) Базовой датой для VBA-типа Date является 30 декабря 1899. VBA использует отрицательные числа для представления дат ранее 12/30/1899 и положительные – для дат после 12/30/1899. Число 0 представляет саму дату 12/30/1899. По этой схеме 1 января 1900 записывается числом 2 (01/01/1990 – это 2 дня после 12/30/1899), однако число –2 является датой 12/28/1899 (два дня до 12/30/1899).

    Даты можно вычитать одну из другой, добавлять к дате или вычитать числа для изменения ее значения. Например, если необходимо определить количество дней между двумя датами, просто необходимо вычесть более раннюю дату из более поздней даты. Поскольку это значения типа Date, VBA «знает», что целью вычисления является получение разности в днях между двумя этими датами. Аналогично, если необходимо определить дату через 60 дней после определенной даты, необходимо прибавить 60 к этой дате.

    Во многих языках программирования, в том числе и в VBA-программе, рабочая программа должна «принять» решение, являются ли истинными различные условия. Для упрощения тестирования условий и обеспечения сохранения результатов такого тестирования в VBA имеется логический тип данных. Логические значения True и False называют булевскими (Boolean) значениями. Логический тип данных VBA называют также типом Boolean.

    Тип данных Variant – это особый тип данных, который может сохранять любые типы, приведенные в табл. 1, за исключением типа Object. VBA использует тип Variant для всех переменных, если в теле программы не объявлялся явно тип этих переменных.

    Данные типа Variant принимают характеристики определенного типа, который они сохраняют в этот момент. Например, если данные типа Variant содержат строковые данные, Variant принимает характеристики типа String. Если данные типа Variant содержат численные данные, Variant принимает характеристики какого-либо численного типа, обычно Double, хотя типы Variant могут также иметь характеристики типов Integer, Long, Single или Currency.

    Несмотря на то что типы Variant удобны и избавляют от некоторой части работы при написании процедур, они требуют большего объема памяти, чем любой другой тип данных, за исключением больших строк. Кроме того, математические операции и операции сравнения над данными типа Variant выполняются медленнее, чем подобные операции над данными любого другого типа.

    Переменные

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

    Идентификатор – это имя переменной. При выборе имени переменной необходимо соблюдать следующие правила:

    имя переменной должно начинаться с буквы алфавита;

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

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

    имя переменной не должно превышать 255 символов;

    имя переменной не должно дублировать определенные ключевые слова vba.

    Самым простым способом создания переменной является использование ее в операторе VBA. VBA создает переменную и тут же резервирует ячейку памяти для данной переменной.

    Сохранение значения данных в переменной называется присваиванием переменной. Присваивание выполняется с помощью оператора присваивания, представляемого знаком (=). Например, А = 145.

    Создание переменной путем ее использования в операторе называется неявным объявлением переменной. Все переменные, которые VBA создает неявным объявлением переменной, имеют тип данных Variant.

    VBA предоставляет возможность выполнять явное объявление переменных. Объявлять переменные явно лучше в начале программы, как это делается во всех языках программирования.

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

    Для объявления переменных используются операторы Dim, Public, Private и Static. Первый можно использовать на обоих уровнях, Public, Private – на уровне модуля, Static – только на уровне процедуры.

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

    Dim <имя переменной1, имя переменной2,…> As <имя типа>

    или

    Dim <имя переменной1> As <имя типа1>, <имя переменной2> As <имя типа2>,<имя переменной3> As <имя типа3>, …

    Примечание. Все переменные, которые создаются просто ключевым словом Dim, являются переменными типа Variant. Если используется ключевое слово As, то объявляемая переменная называется типизированной.

    Примеры объявлений типизированных констант:

    Dim ключ As single

    Dim стоимость Аs currency

    Dim дата_рождения AS Date

    Dim письмо Аs string

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

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

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

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

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

    Примечание. Имена переменных не «чувствительны» к состоянию регистра, т. е. переменные f и F в программе означают одно и то же.

    Константы

    Константа – это значение в программе VBA, которое не меняется. Существует несколько типов констант.

    Именованные константы – константы, имеющие заданное имя; это имя имеет конкретное неизменяемое значение.

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

    Следует помещать объявления констант на модульном уровне, чтобы у них была наибольшая область действия.

    Литеральные константы – это константы, записываемые непосредственно в код.

    Правила написания литеральных констант (String, Integer, Data, Boolean):

    строковые константы должны быть заключены в двойные кавычки ("");

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

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

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

    Правила написания численных констант:

    численные константы должны состоять только из числовых символов от 0 до 9;

    численная константа может начинаться со знака минус и содержать десятичную точку;

    можно использовать экспоненциальное представление для численных констант;

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

    Примеры:

    142

    – 789.3

    5.55Е4

    Константы Date необходимо помещать между знаками фунта (#). Независимо от того, в каком из форматов записывается литеральная константа Date, VBA переформатирует эту константу для соответствия одному из двух следующих форматов – в зависимости от того, содержит ли константа Date информацию о времени:

    #2/5/02 9:17:00 PM#

    #2/5/02#

    Константы Boolean – существуют только две правильные константы типа Boolean: True и False.

    Типизированные константы используются при явном задании типа константы. Объявление конкретного типа данных для константы может повысить точность вычислений. Для констант можно использовать типы данных Byte, Boolean, Integer, Long, Single, Double, Currency, Date, String.

    Синтаксис:

    Const имя_константы As type = value, name As type = value,…

    где type – имя любого из типов данных VBA;

    value – значение, присваиваемое константе.

    Пример:

    Const Pi As Double = 3.14

    Внутренние константы называются также предопределенными константами. Внутренняя константа – это именованная константа, которая была определена разработчиками VBA. Внутренние константы все начинаются с букв vb для указания того, что они определяются языком VBA (табл. 2).


    Таблица 2

    Математические функции

    1.2. Редактор VBA. Первое знакомство

    Запуск редактора VBA

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

    1) активизировать любое приложение пакета MS Office (Word, Excel);

    2) выполнить команду меню: Сервис + Макрос + Редактор Visual Basic.

    Или:

    1) активизировать любое приложение пакета MS Office (Word, Excel);

    2) нажать комбинацию клавиш Alt+F11.

    И в том, и в другом случае откроется редактор VBA (рис. 1).

    В левой части окна редактора появляется строение разрабатываемого проекта (аналог с Проводником). Необходимо обратить внимание на два главных объекта окна: Normal и Project (Операции).

    Рис. 1. Стартовое окно редактора VBA


    Примечание. Операции – это имя сохраненного документа в приложении Word, т. е. в скобках будет указано имя сохраненного документа.

    Объект Normal глобальный, т. е. при работе в редакторе VBA в данном объекте будут создаваться модули, формы и т. д., которые будут доступны всему приложению Word. При каждом запуске Word содержимое объекта Normal становится доступным. Вывод: в данном объекте ничего не надо создавать!

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

    Создание простейших программ

    Пример 1. Создать программу, которая работает с глобальными переменными, рассчитывая выражение:

    Результат выдается в диалоговое окно Msgbox.


    Технология выполнения

    1. Активизируйте приложение Word, создайте (сохраните) новый документ под именем Операции.

    2. Выйдите в редактор VBA (Alt+F11).

    3. Правой кнопкой мыши выделите Project(Document), где Document – название созданного документа, например Операции, и выберите команду Insert + Module (рис. 2). Если же имеется папка Modules, то добавьте в нее (рис. 6).



    Рис. 2. Добавление нового модуля в папку Project


    4. Дважды щелкните по классу Module1 (рис. 3). В результате в правой части редактора VBA активизируется модуль (появится курсор), в котором можно прописывать все создаваемые программы, причем при вводе заготовки создаваемого модуля (слово Sub) и его имени (list1 – от листинг, можно вписать любое имя) появляется окончание данного модуля End Sub.


    Рис. 3. Создание модуля List1


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


    Рис. 4. Создание переменных 4. Напишите следующую программу.

    Dim a As Double

    Dim b, c, d As Double

    Dim k As String

    Const Pi As Double = 3.14


    Sub list1()

    a = 5

    b = 25.6

    c = Sin(a ^ 2) + Cos(b) + Pi

    d = Sqr(c)

    MsgBox (d)

    End Sub

    5. Запустите программу на выполнение, предварительно ее откомпилировав (проверив синтаксические ошибки). Для компиляции проекта выполните команду меню: Debug + Compile Project. Если ошибок нет, запустите приложение при помощи кнопки

    Запуск панели инструментов или клавиши F5. Если все действия выполнены верно, то на экране появится диалоговое окно Msgbox с итоговым сообщением (рис. 5).


    Рис. 5. Итоговый результат расчетов примера 1


    Пример 2. Создать программу, которая производит сложение строковых переменных и результат выводит в диалоговое окно msgbox.

    Технология выполнения

    1. В том же документе Операции выделите правой кнопкой мыши папку Modules и выполните команду: Insert + Module (рис. 6).


    Рис. 6. Добавление нового модуля


    2. В результате появится новый модуль, где можно создать новую программу (модуль). Пропишите следующий код.

    Dim a, b, c As String

    Sub list2()

    a = «Привет!»

    b = « Пока не сложно?»

    c = a + b

    MsgBox (c)

    End Sub

    В данном примере переменным a и b присваиваются строковые значения (в кавычках!), после чего происходит сложение строк. Результат показан на рис. 7.

    Рис. 7. Результат примера 2


    3. Прокомпилируйте программу и запустите ее на выполнение.

    Примечание. Если в одном документе находятся несколько модулей, то при запуске программ может появляться диалоговое окно выбора макроса (модуля), в котором необходимо выбрать макрос, выделить его и нажать кнопку «Run» (рис. 8).


    Рис. 8. Выбор макроса на выполнение

    1.3. Изменение порядка выполнения операторов

    Операторы и выражения

    Выражение – это значение или группа значений, выражающая отдельное значение. Каждое выражение вычисляется до отдельного значения. Выражения состоят из одной или более следующих частей:

    константы (литеральные или именованные);

    переменные (любого типа данных);

    операторы;

    массивы;

    элементы массива;

    функции.

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

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

    выражение типа даты – вычисляется до значения типа date;

    численное выражение – вычисляется до любого числа;

    строковое выражение – имеет результатом значение типа string;

    логическое выражение – вычисляется до значения типа boolean.

    Очень важно контролировать и знать тип выражения, потому что если выражения содержат несовместимые типы, VBA выдает ошибку времени исполнения – ошибку несовпадения типов (type-mismatch). При обработке выражения, содержащего различные типы данных, VBA сначала пытается устранить любое различие типов, преобразуя значения в выражении в совместимые типы данных. Если устранить какие-либо различия преобразованием типов не удается, отображается ошибка времени исполнения и процедура прекращает выполняться.

    Рассмотрим основные арифметические операторы, используемые в VBA (табл. 3).


    Таблица 3

    Арифметические операторы

    Рассмотрим данные операторы более подробно.

    Сложение

    Оператор сложения (+) выполняет простое сложение. Оба операнда должны быть численными выражениями или строками, которые VBA может преобразовать в число. Оператор сложения можно также использовать для выполнения арифметических операций с данными типа Date.

    Вычитание

    Используется либо для вычитания одного числа из другого, либо для обозначения унарного минуса.

    Унарный минус (unary minus) – это знак минус, который помещают перед числом (выражением) для указания того, что это отрицательное число (выражение). Поместить унарный минус перед числом или выражением означает то же, что умножить это число на минус 1.

    Умножение

    Оператор умножения (*) перемножает два числа; результатом выражения умножения является произведение двух операндов. Оба операнда в выражении умножения должны быть численными выражениями или строками, которые VBA может преобразовать в число.

    Деление

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

    Целочисленное деление

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

    Деление по модулю

    Деление по модулю (mod) дополняет целочисленное деление. В делении по модулю выражение возвращает только остаток операции деления как целое. Оба операнда в выражении деления по модулю должны быть численными выражениями или строками, которые можно преобразовать в число.

    Возведение в степень

    Оператор возведения в степень (^) возводит число в степень. Оба оператора в выражении возведения в степень должны быть численными выражениями или строками, которые VBA может преобразовать в числа. Операнд слева от оператора возведения в степень может быть отрицательным числом, только если операнд справа является целым. Если какой-либо операнд является равным Null, то результатом выражения возведения в степень также будет Null; иначе результат выражения будет иметь тип Double.

    Оператор Like

    Оператор Like дает возможность выполнять особый тип операции сравнения строк, и его можно использовать только со строками.

    Оператор Like тестирует строку для определения того, совпадает ли она с заданным шаблоном.

    Синтаксис:

    выражение1 like выражение2,

    где выражение1 – любое строковое выражение VBA;

    выражение2 – строковое выражение, специально созданное для задания шаблона, который оператор Like сравнивает с выражением1.

    Результатом выражения Like является True, если первый операнд (выражение1) совпадает с шаблоном во втором операнде (выражение2); иначе результатом выражения будет False. Оба операнда в этом выражении должны быть строковыми выражениями, или VBA отобразит сообщение об ошибке несовпадения типов.

    Шаблон, с которым должна сравниваться строка, задается с использованием различных специальных символов. В табл. 4 содержатся методы и символы для создания образцов совпадения для оператора Like.


    Таблица 4

    Символы совпадения с образцом для оператора Like

    Логические операторы

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


    Таблица 5

    Логические операторы

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

    Изменение порядка выполнения операторов

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

    Оператор условного перехода – это структура, которая выбирает ту или иную ветвь кода процедуры на основе некоторого предопределенного условия или группы условий.

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

    Простейшими VBA-операторами изменения порядка выполнения кода являются операторы If … Then и If … Then … Else.

    Оператор If … Then позволяет выбрать единственную альтернативную ветвь кода в процедуре или функции.

    Синтаксис:

    If условие Then оператор(ы),

    где условие – любое логическое выражение;

    оператор(ы) – один, несколько или ни одного оператора VBA.


    Вторая форма синтаксиса оператора If … Then называется блоком оператора if. В блоке оператора If… Then условие и операторы записываются в отдельных строках, причем заканчивается данный оператор ключевыми словами End If.

    Синтаксис:

    If условие Then

    оператор 1

    оператор 2

    ….

    Оператор n

    End If

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

    If … Then … Else

    и If … Then … ElseIf.

    Синтаксис однострочного оператора If … Then … Else:

    If условие Then оператор1 Else оператор2,

    где условие – любое допустимое логическое выражение;

    операторы – один или несколько операторов VBA, которые должны находиться в одной и той же строке.


    Блок операторов If … Then … Else легче читать и понимать, и поскольку можно располагать операторы в разных строках внутри блока оператора If … Then … Else, он не имеет ограничения по размеру и числу операторов, которые можно помещать в альтернативные ветви.

    Синтаксис:

    If условие Then

    Оператор1

    Else

    Оператор2

    End If

    VBA, как и многие языки программирования, имеет условный оператор перехода для использования в случаях, когда необходимо выбирать из большего количества различных ветвей кода: оператор Select Case. Данный оператор работает во многом так же, как и оператор If. Ключевые слова Select Case используются со многими операторами Case, где каждый оператор Case проверяет появление другого условия и выполняется только одна из ветвей Case. Ветвь Case может содержать один, несколько или ни одного оператора VBA.

    Синтаксис:

    Select Case выражение

    Case условие_1

    Оператор_1

    Case условие_2

    Оператор_2

    …..

    Case условие_N

    Оператор_N

    [Case Else

    Оператор_N+1

    End Select,

    где выражение – любое численное или строковое выражение;

    условие_1, условие_2, условие_N – (каждый) представляет список логических выражений, отделенных запятыми;

    оператор_1, оператор_2, оператор_N, оператор_N+1 – (каждый) представляет один, несколько или ни одного оператора.


    В Select Case можно включать столько операторов Case условия, сколько необходимо.

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

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

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

    GoTo метка

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

    Пример 3. Создать программу, которая, используя инструкцию if … then, выполняет следующие действия: если переменной а присваивается значение больше нуля, то находится сумма чисел а и b, если меньше нуля, то находится произведение. Результат выводится в стандартное диалоговое окно msgbox.

    Технология выполнения

    1. В документе Операции (пример 2) выделите правой кнопкой мыши папку Modules и выполните команду: Insert + Module (рис. 6).

    2. В появившемся модуле пропишите программу и запустите на выполнение.

    Dim a, b, c As Integer

    Sub poradok()

    a = -5

    b = 25

    If a > 0 Then

    c = a + b

    MsgBox (c)

    End If

    If a < 0 Then

    с = a * b

    MsgBox (с)

    End If

    End Sub

    В данной программе переменной а присвоено значение меньше нуля, следовательно, должна выполниться нижняя инструкция If (рис. 9).



    Рис. 9. Результат работы при а < 0


    3. Измените программу, поменяв значение а на положительное:

    Dim a, b, c As Integer

    Sub poradok()

    a = 5

    b = 25

    If a > 0 Then

    c = a + b

    MsgBox (c)

    End If

    If a < 0 Then

    c = a * b

    MsgBox (c)

    End If

    End Sub

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



    Рис. 10. Результат работы при а > 0

    Dim a, b, c As Integer

    Sub poradok()

    a = 5

    b = 25

    If a > 0 Then

    c = a + b

    MsgBox (c)

    Else

    c = a * b

    MsgBox (c)

    End If

    End Sub

    Повторение действий: циклы

    Процесс выполнения всех операторов, заключенных в структуру цикла, один раз называется итерацией (iteration) цикла. Некоторые структуры цикла организуются так, что они всегда выполняются заданное количество раз. Структуры цикла, всегда выполняющиеся заданное количество раз, называются циклами с фиксированным числом итераций (fixed iteration). Другие типы структур цикла повторяются переменное количество раз в зависимости от некоторого набора условий. Поскольку количество раз повторений этих гибких структур цикла является неопределенным, такие циклы называются неопределенными циклами (indefinite loops).

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

    Самой простой структурой цикла является фиксированный цикл. VBA предоставляет две различные структуры фиксированного цикла: For… Next и For Each … Next. Обе структуры фиксированного цикла называются циклами For, потому что они всегда выполняются для (for) заданного количества раз.


    Использование цикла For… Next

    Цикл For…Next используется, когда необходимо повторить действие или ряд действий заданное количество раз, известное до начала выполнения цикла.

    Цикл For…Next имеет следующий синтаксис:

    For а = Start To End [Step StepSize]

    операторы

    Next [а],

    где а – любая численная переменная VBA, обычно переменная типа Integer или Long;

    Start – любое численное выражение, определяет начальное значение для переменной а;

    End – это также численное выражение, определяет конечное значение для переменной а.


    По умолчанию VBA увеличивает переменную а на 1 каждый раз при выполнении операторов в цикле (считает количество циклов). Можно задавать другое значение (StepSize), на которое будет изменяться а, включая необязательное ключевое слово Step. При включении ключевого слова Step необходимо задавать значение для изменения переменной а.

    Операторы представляют один, несколько или ни одного оператора VBA. Эти операторы составляют тело цикла For; VBA выполняет каждый из этих операторов каждый раз при выполнении цикла.

    Ключевое слово Next сообщает VBA о том, что достигнут конец цикла; необязательная переменная а после ключевого слова next должна быть той же самой переменной а, которая была задана после ключевого слова For в начале структуры цикла.

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


    Цикл For Each … Next

    Второй цикл For, который имеется в VBA, – это цикл For Each … Next. В отличие от цикла For…Next, цикл For Each … Next не использует счетчик цикла. Циклы For Each … Next выполняются столько раз, сколько имеется элементов в определенной группе, такой как коллекция объектов или массив. Другими словами, цикл For Each … Next выполняется один раз для каждого элемента в группе.

    Цикл For Each … Next имеет следующий синтаксис:

    For each а in группа

    операторы

    Next [а],

    где а – это переменная, используемая для итерации по всем элементам в определенной группе;

    группа – это объект коллекции или массив. Если группа – это объект коллекции, то а должна быть переменной типа variant, object или заданным объектным типом, таким как range, worksheet, document, paragraph и т. д.

    Если группа – это массив, то а должна быть переменной типа variant;

    операторы – один, несколько или ни одного оператора VBA, составляющих тело цикла.


    Примечание. Примеры на использование циклов будут рассмотрены в части II.

    Глава 2

    Объект UserForm

    2.1. Свойства и методы объекта UserForm

    Свойства объекта UserForm

    Рассматривая в п. 1.2 и 1.3 примеры, решаемые в редакторе VBA, можно прийти к выводу, что такие простейшие задачи с выводом единственного результата в диалоговое окно не всегда будут удовлетворять потребностям пользователей. Одним из достоинств языка программирования VBA является то, что он относится к объектно-ориентированным языкам. Следовательно, в данную среду программирования уже заложены возможности создания форм и его элементов простым использованием без составления громоздкого программного кода.

    Практически во всех приложениях Office используются пользовательские диалоговые окна. Диалоговые окна в VBA называются формами (объект UserForms). Каждому объекту UserForm присущи определенные свойства, методы и события, которые он наследует от класса объектов UserForms. Диалоговые окна (формы) и элементы управления составляют основу современного визуального интерфейса. Все элементы управления и технология работы с ними в основном стандартизованы и похожи для разных платформ и программных сред. Эти объекты помещены в специальную библиотеку MSForms.

    Выделим основные моменты, которые следует иметь в виду при создании визуального интерфейса.

    Все загруженные диалоговые окна представляют коллекцию UserForms со стандартными методами и свойствами. Элемент коллекции – объект класса UserForm – задает отдельное окно.

    Для каждого типа элементов управления в библиотеке msforms имеется класс объектов, имя которого совпадает с именем элемента управления (его типа). Например, есть классы SpinButton и TextBox.

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

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

    Последний момент – отладка. Для ведения отладки нужно предварительно откомпилировать приложение и затем перейти в режим выполнения приложения.

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

    1) запустить редактор VBA;

    2) выделить правой кнопкой мыши объект Project, выполнить команду Insert + UserForm (рис. 11), после чего появляются новая форма и панель элементов Toolbox (рис. 12).


    Рис. 11. Добавление формы


    Рис. 12. Новая форма


    Форма как объект имеет некоторые встроенные свойства, и их можно устанавливать или программным образом, или в Properties Window (окне свойств) редактора VBA (табл. 6).


    Таблица 6

    Наиболее часто используемые свойства объектов UserFormМетоды объекта UserForm

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


    Таблица 7

    Наиболее часто используемые методы для объектов UserFormСобытия объекта UserForm

    Событие – это что-то, что может произойти с диалоговым окном или элементом управления диалогового окна (табл. 8).

    Событийные процедуры следует записывать в модуль класса, который является частью User Form. При этом такие процедуры должны иметь имена в виде

    ObjectName_EventName,

    где ObjectName – имя формы или элемента управления, a EventName – имя события, с которым идет работа. Такой формат имени позволяет VBA сопоставлять заданному событию требуемую процедуру.


    Таблица 8

    События объектов UserFormЭлементы управления

    Объект UserForm может содержать те же элементы управления, что и находящиеся в диалоговых окнах Word, Excel или других приложений Windows (табл. 9). Элементы управления – это элементы диалогового окна, позволяющие пользователю взаимодействовать с программой. Они включают в себя кнопки-переключатели, текстовые поля, линейки прокрутки, командные кнопки и т. д.


    Таблица 9

    Стандартные элементы управления, включенные в VBA

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


    Таблица 10

    Cвойства стандартных элементов управления

    2.2. Использование форм

    Создание VBA-программ

    Используя формы, можно достаточно полно изучить возможности работы со всеми типами данных и их взаимодействия с учетом того, что значения переменных будут определяться не программно (примеры 1, 2, 3), а вводом через текстовые поля формы, т. е. при непосредственной работе пользователя с программой.

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

    Пример 4. Создать форму, в которой при вводе имени в текстовое поле после нажатия кнопки ОК выдается приветственное сообщение в метку в виде: «Имя, привет! Сегодня – дата и время запуска программы».

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

    Технология выполнения

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

    1-й шаг. Проектирование программы-примера

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

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

    2-й шаг. Реализация проекта

    Для выполнения данного шага выполните следующие действия.

    1. Активизируйте приложение Word, сохраните документ под соответствующим именем (Время) и перейдите в редактор VBA.

    2. Щелкните правой кнопкой мыши в окне проекта по пункту Project (Время), выберите пункт Insert + UserForm (появится новая форма UserForm с панелью элементов управления).

    3. Расположите на форме следующие элементы: TextBox, Button1, Button2, Label1, Label2 (см. рис. 13).


    Рис. 13. Форма для примера 4 в режиме конструктора


    Добавление надписи в форму

    Чтобы поместить надпись в пользовательскую форму, выполните следующее.

    Убедитесь, что форма активна, щелкнув по ней. Панель элементов управления видна только тогда, когда форма активна.

    Щелкните на кнопку А (метка) панели элементов управления.

    Поместите указатель мыши в форму, где необходимо расположить сообщение.

    В окне свойств (Properties – левая нижняя панель окна) выделите свойство Caption и наберите строчку «Введите имя», во второй метке данное свойство должно быть пустым, чтобы при запуске программы надпись Label2 была невидима.

    4. Измените заголовок самой формы. Для этого щелкните на полосе заголовка окна формы. В изменившемся при этом окне свойств найдите свойство Caption и измените его на «Время». Этот новый заголовок появится в полосе заголовка формы.

    Добавление программного кода

    Для нашей программы требуется создать две процедуры, и они связаны с событиями, возникающими в процессе выполнения программы. Первая процедура должна при нажатии на кнопку Сообщение отобразить нужное сообщение, а вторая – завершить выполнение программы, когда кто-нибудь щелкнет на кнопке ОК.

    5. Щелкните дважды по кнопке OK. В появившемся при этом окне программного кода появится заготовка процедуры. Первой строкой созданного программного кода будет Private Sub CommandButton2_Click().

    В любой VBA-процедуре первая строка программного кода определяет тип процедуры (в данном случае это процедура типа Sub, т. е. подпрограмма) и имя процедуры. Private и Sub относятся к ключевым словам VBA, т. е. к словам и символам, которые являются частью языка VBA. В данном случае VBA предлагает для процедуры имя CommandButton2_Click, которое представляет собой комбинацию имени кнопки и типа события.

    Последней строкой автоматически генерируемого программного кода будет End Sub.

    Такой строкой должны заканчиваться все процедуры типа Sub. Эта строка сообщает VBA о том, что выполнение процедуры завершено.

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

    Unload Me

    Оператор Unload убирает указанный объект из памяти. Здесь это объект с именем Me, имеющим в VBA специальный смысл. В данном случае оно означает форму и весь ее программный код.

    6. Создайте обработчик события для кнопки «Сообщение», для чего дважды щелкните по созданной кнопке и пропишите код:

    Dim ima As String

    ima = TextBox1.Text

    Label2.Caption = ima & ",привет! Сегодня " & Format(Now, «dddddd, hh ч. mm мин.»)

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

    Dim ima As String

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

    Вторая строка данной переменной присваивает строковое значение, введенное в элемент TextBox1 (текстовое окно может «читать» только текстовое значение). Третья строка выводит сообщение в расположенную на форме метку Label2, для чего устанавливает свойству Caption программно-строковое значение. Функция Format выдает дату и время.

    3-й шаг. Тестирование программы

    Чтобы запустить программу из редактора Visual Basic, выполните следующее.

    1. Щелкните либо в окне формы, либо в окне программного кода, чтобы соответствующее окно стало активным.

    2. Прокомпилируйте программу: меню + debug + compile project.

    3. Запустите программу на выполнение (F5).

    После небольшой задержки окно вашей программы появится на фоне вашего VBA-приложения (а не редактора Visual Basic). Если все в порядке, на фоне приложения (Word или Excel) появится созданная форма в рабочем состоянии (рис. 14).


    Рис. 14. Форма примера 4 в рабочем состоянии


    • Это важно!

    Если при запуске разработанной формы появляются сообщения вида (рис. 15 или рис. 16) о слишком большой защите приложения от макросов, т. е. вмешательства извне, необходимо выполнить следующие действия:

    1) закрыть редактор VBA;


    Рис. 15. Предупреждение 1-го вида


    Рис. 16. Предупреждение 2-го вида о высокой защите приложений


    2) в приложении Excel или Word (там, где происходит работа в текущий момент) выполнить команду: Сервис + Макрос + Безопасность;

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

    5) закрыть приложение (Word или Excel) и запустить его вновь.

    Рассмотрим простейшие примеры работы с циклами.

    Пример 5. Используя инструкцию case, создать программу, которая в зависимости от введенного значения переменной а производит различные вычисления с переменными b и c. Если значение переменной а не совпадает с программными, то выдается сообщение «Введено не то значение».

    Все переменные вводятся в текстовые поля формы. При нажатии на кнопку «Результат» происходят выбор действия и вывод полученного значения в специальную метку формы.


    Рис. 17. Включение режима низкой безопасности


    Технология выполнения

    1. Активизируйте приложение Word, сохраните документ под именем Case.

    2. Перейдите в редактор VBA и создайте форму (рис. 18).

    3. Пропишите обработчик кнопки «Результат».

    Dim a, b, c, d As Integer

    Private Sub CommandButton1_Click()

    a = Val(TextBox1.Text)

    b = Val(TextBox2.Text)

    c = Val(TextBox3.Text)

    Select Case a

    Case 5

    d = b + c

    Label4.Caption = «Результат: d=» & d

    Case 0

    d = – b – c

    Label4.Caption = «Результат: d=» & d

    Case 10

    d = b * c

    Label4.Caption = «Результат: d=» & d

    Case Else

    Label4.Caption = «Введено не то значение»

    End Select

    End Sub

    Рис. 18. Форма примера 5 в режиме конструктора


    Для того чтобы программа работала корректно, необходимо перевести все текстовые значения, которые вводятся в текстовые поля, в числовые. Для этого прописывают в коде преобразование: a = Val(TextBox1.Text) и т. д. После чего программа уже работает с числовыми значениями.

    Если программа в итоге выдает значение одного типа (числовое или строковое), то строку вывода результата можно прописывать по окончании всего блока Case. В данном примере сначала выводятся числовые значения (d), а затем строковое («Введено не то значение»). Поэтому вывод результата необходимо предусмотреть в каждой ветке Case.

    Результаты работы показаны на рис. 19.

    Пример 6. Создать программу, которая, используя пользовательское диалоговое окно (форму), выполняет следующие действия: при вводе трех переменных в текстовые поля она считывает данные и сравнивает с первой переменной а. Результат выдается в метку на форме (рис. 20).


    Рис. 19. Некоторые результаты работы формы примера 5


    Рис. 20. Форма примера 6 в режиме конструктора и в рабочем состоянии


    Листинг примера 6

    Private Sub CommandButton1_Click()

    Dim a, b, c As Integer

    a = Val(TextBox1.Text)

    b = Val(TextBox2.Text)

    c = Val(TextBox3.Text)

    If a > b And a > c Then

    Label1.Caption = «Значение а > b и a >c»

    Else

    Label1.Caption = «Значение а не всегда больше b и с» End If End Sub

    Пример 7. Создать программу, которая, используя форму, выполняет следующие действия: при вводе переменной в текстовое поле она считывает данное значение а, после чего организует цикл for с шагом, равным 5, где при каждом шаге значение переменной b становится равным значению переменной а плюс шаг изменения. Итоговое значение с суммирует полученное значение b и введенное значение а. Результат выдается в метку на форме (рис. 21).


    Рис. 21. Форма примера 7 в режиме конструктора и в рабочем состоянии


    Листинг примера 7

    Dim a As Variant

    Dim b As Integer

    Dim c As Integer

    Private Sub CommandButton1_Click()

    a = Val(TextBox1.Text)

    For i = 1 To 12 Step 5

    b = a + i

    c = a + b

    Next i

    Label1.Caption = a & "+" & b & "=" & c

    End Sub

    Пример 8. Создать программу, которая выполняет следующие действия: организованный цикл for each присваивает переменной b, объявленной в программе, последнее значение массива, также определенного программой. После этого происходят вычисления, предложенные в программе:

    в метку label2 выдается результат увеличения полученной переменной на значение первого элемента массива;

    в метку label3 выдается результат увеличения полученной суммы на значение второго элемента массива;

    в метку label4 выдается результат увеличения полученной суммы на значение третьего элемента массива;

    в метку label6 выдается результат увеличения полученной суммы на значение последнего элемента массива.

    Результат выдается для наглядности в различные метки на форме (рис. 22).


    Рис. 22. Форма примера 8 в режиме конструктора и в рабочем состоянии


    Листинг примера 8

    Dim b As Variant

    Private Sub CommandButton1_Click()

    Dim d(1 To 4) As Variant

    d(1) = 15

    d(2) = 0

    d(3) = -10

    d(4) = 25

    For Each b In d

    b = d(1) + b

    Label2.Caption = «d(1)=» & d(1) & « b=» & b

    b = d(2) + b

    Label3.Caption = « d(2)=» & d(2) & « b=» & b

    b = d(3) + b

    Label4.Caption = « d(3)=» & d(3) & « b=» & b

    b = d(4) + b

    Label6.Caption = « d(4)=» & d(4) & « b=» & b

    Next b

    End Sub

    Примечание. Как говорилось выше, For Each … Next не использует счетчик цикла. Циклы For Each … Next выполняются столько раз, сколько имеется элементов в определенной группе, такой как коллекция объектов или массив. Другими словами, цикл For Each … Next выполняется один раз для каждого элемента в группе. Вследствие чего данный цикл используется в основном в специфических действиях, таких как поиск необходимого листа в коллекции объектов и т. д., и не используется при решении простых задач.

    Задачи на закрепление материала

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

    «Здравствуй, введенное имя, студент группы номер группы специальности название специальности!»,

    где введенное имя – значение из первого текстового поля;

    номер группы – значение из второго текстового поля;

    название специальности – значение из третьего текстового поля.


    Пример 10. Создать программу, которая, используя данные, считанные из текстовых полей формы, выполняет следующие действия: если введенный текст одинаков, то выдается сообщение «значение1 совпало с значением2», если введенный текст неодинаков, то выдается сообщение «значение1 не совпало с значением2», где значение1 и значение2 – введенные слова.

    Примечание. При разработке программы лучше использовать оператор Like (рис. 23).


    Рис. 23. Форма примера 10 в рабочем режиме

    Глава 3

    Массивы, процедуры, функции

    3.1. Организация массивов

    Одномерные массивы

    Массив (array) – это коллекция переменных, которые имеют общие имя и базовый тип. Массив является удобным способом хранения нескольких связанных элементов данных. Все элементы данных, сохраняемых в массиве, должны иметь один и тот же тип.

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

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

    Массивы создаются при помощи оператора Dim:

    Dim ИмяМассива (размер) As ТипДанных

    Если вместо слова Dim набрать слово Public, будет создан массив, областью видимости которого станет вся программа.

    Пример:

    Dim МойМассив(3) As Integer

    Создан массив по имени МойМассив, состоящий из четырех элементов и способный хранить значения типа Integer.

    Так как отсчет элементов начинается с нулевого номера, то ставится цифра 3.

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

    Dim МойМассив (1 То 3) As Integer

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

    Dim Сотрудник(4) As String

    Если необходимо первому элементу массива присвоить значение Иван Никитин, надо прописать такой код:

    Сотрудник(0) = «Иван Никитин»

    В большинстве программ при создании массива сразу же инициализируют его, присвоив каждому элементу нулевое значение или пустую строку. Это можно сделать, используя цикл for next, например:

    Dim сотрудник(4) As String

    Dim I As Integer

    For I = 0 To 4

    Сотрудник (i) = ""

    Next I

    Значения элементов массива можно присваивать другим переменным, например:

    Dim сотрудник(4) As String

    Dim отпуск As String

    Сотрудник(3) = «Иван Никитин»

    отпуск = сотрудник(3)

    Здесь:

    1) первой строкой создается массив Сотрудник, состоящий из пяти текстовых значений;

    2) второй строкой создается текстовая переменная, именуемая отпуск;

    3) третьей строкой четвертому элементу массива (которому соответствует третий порядковый номер) присваивается значение Иван Никитин;

    4) в четвертой строке переменной отпуск присваивается значение элемента массива Сотрудник, которому соответствует третий порядковый номер.

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

    Dim МойМассив as object

    Элементы такого массива могут содержать значения разных типов:

    мойМассив(0) = «Спрут»

    мойМассив(1) = 56

    мойМассив(2) = 3.1415

    Двумерные массивы

    Порядок создания двухмерного массива тот же, что и одномерного, с той лишь разницей, что, указывая его размер, нужно указать два значения – строки и столбцы:

    Dim ДвухММассив (Строки, Столбцы) As ТипДанных

    Размер трехмерного массива будет определяться тремя числами и т. д.:

    Dim ТрехММассив (X, Y, Z) As ТипДанных

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

    Выбор размера массива может быть затруднен, если неизвестно, сколько данных будет введено в массив, или если объем данных, собираемых для массива, значительно меняется. Для подобных ситуаций VBA поддерживает особый тип массивов, называемый динамическим (dynamic) массивом.

    Динамические массивы создаются с помощью оператора Dim, Private, Public или Static, причем список размерностей опускается, затем их размер устанавливается с помощью оператора ReDim во время выполнения процедуры.

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

    ReDim [Preserve] varname (subscripts) [As type] [, varname (subscripts) [As type]],

    где необязательное ключевое слово Preserve приводит к тому, что VBA сохраняет данные в имеющемся массиве, когда изменяется размер массива с помощью ReDim;

    varname – имя существующего массива;

    subscripts – измерения массива (синтаксис для оператора subscripts в операторе ReDim такой же, как для оператора Dim);

    type – любой тип VBA или определенный пользователем тип.


    Необходимо использовать отдельный оператор As type для каждого массива, который вы определяете.

    Примеры:

    1) Dim Month() As String – объявляет динамический массив Month;

    2) ReDim Month(1 to 30) – изменяет размер массива до 30 элементов;

    3) ReDim Month(31) – изменяет размер массива до 31 элемента;

    4) ReDim Preserv Month(1 to 31) – изменяет размер массива до 31 элемента, сохраняя содержимое;

    5) Dim Table() As Integer – объявляет динамический массив;

    6) ReDim Table(3, 15) – делает массив двумерным;

    7) ReDim Table(4, 20) – изменяет размер двумерного массива;

    8) ReDim Preserv Table(4, 25) – только изменяет последний размер массива;

    9) Dim Mas as Variant – объявляет переменную типа Variant;

    10) ReDim Mas(20) As Integer – создает массив 20 целых чисел в Variant.

    Выводы:

    1) можно изменять только последнее измерение многомерного массива, когда используется ключевое слово Preserv;

    2) можно использовать ReDim для создания типизированного массива внутри переменной типа Variant.

    Массив в программе можно также определить поэлементно. Например, следующий код

    Dim B(l to 2, 1 to 2) as single

    В(1,1)=2

    В(1,2)=5

    В(2,1)=4

    В(2,2)=3

    создает двумерную таблицу

    При работе с массивами бывает полезно применять следующие функции и процедуры.

    1. Array (списокАргументов)

    Создает массив типа Variant. Аргумент в скобках представляет разделенный запятыми список значений, присваиваемых элементам массива.

    Пример:

    Dim День As Variant

    День=Array(«Пн»,"вт","ср",….)

    2. VBA имеет две функции, которые отслеживают верхний и нижний индексы предела массива, – функции Lbound и ubound. Эти функции возвращают нижнее и верхнее граничные значения индексов статического или динамического массива.

    Синтаксис:

    Lbound (имяМассива [, размерность])

    Ubound (имяМассива [, размерность]),

    где ИмяМассива – имя переменной массива;

    Размерность – целое число, указывающее размерность массива, нижнюю или верхнюю границу которой возвращает функция. Для первой размерности следует указать 1, для второй – 2 и т. д. Если аргумент размерность опущен, подразумевается значение 1.

    3. Использование оператора Erase для очистки или удаления массивов.

    Оператор Erase позволяет выполнять одну из двух задач в зависимости от того, каким массивом манипулирует пользователь – статическим или динамическим. В случае статических массивов Erase позволяет очищать все элементы массива, в основном переустанавливая массив в то же самое состояние, какое он имел, когда VBA создавал его в оперативной памяти. В случае динамических массивов Erase позволяет полностью удалять массив и его содержимое из оперативной памяти.

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

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

    Erase array1 [, array2, …]

    Здесь array1 и array2 представляют любое допустимое имя массива VBA.

    Оператор Erase удаляет из памяти динамические массивы, освобождая область памяти, ранее используемую этим массивом. При удалении динамического массива с помощью оператора Erase необходимо повторно создать массив с помощью оператора ReDim перед тем, как можно будет использовать этот определенный динамический массив снова. При попытке доступа к элементам в динамическом массиве, для которого был использован оператор Erase, без его переопределения, VBA отображает сообщение об ошибке.

    Обычно в VBA используются массивы с нулевой базой. В системе нумерации с нулевой базой индекс для первого элемента в любом измерении массива является равным 0; массив с 10 элементами имеет индексы от 0 до 9.

    Было бы гораздо удобнее, если бы элементы массива нумеровались начиная с 1, а не с 0. VBA позволяет задавать начальное число для элементов массива, используя директиву компилятора Option Base для указания того, должна ли нумерация индексов начинаться с 0 или с 1.

    Директива компилятора Option Base имеет следующий синтаксис:

    Option Base 0 | 1

    Если оператор Option Base не используется, VBA начинает нумерацию индексов массива с 0 (по умолчанию). Необходимо помещать оператор Option Base в область объявлений модуля перед объявлениями любых переменных, констант или процедур. Нельзя помещать оператор Option Base внутри процедуры. Можно иметь только один оператор Option Base в модуле; оператор Option Base влияет на все массивы, объявляемые в модуле, независимо от того, являются ли они локальными в процедуре или объявляются на модульном уровне.

    Например:

    Option Base 0 'установка по умолчанию с нуля

    Option Base 1 'индексы массивов начинаются с 1

    Пример 11. Создать программу, организующую три двумерных массива. Первые два массива определены поэлементно в программе. Третий массив А организуется путем суммирования соответствующих членов массивов В и С (рис. 24).

    Результаты организации массивов выведены в соответствующие метки на форме после нажатия на кнопку Массив.

    Листинг примера 11

    Private Sub CommandButton1_Click()

    Dim B(1 To 2, 1 To 2) As Integer

    Dim c(1 To 2, 1 To 2) As Integer

    Dim A(1 To 2, 1 To 2) As Integer

    B(1, 1) = 5

    B(1, 2) = 4

    B(2, 1) = 8

    B(2, 2) = 10

    c(1, 1) = 0

    c(1, 2) = 1

    c(2, 1) = 5

    c(2, 2) = 10

    For i = 1 To 2

    For j = 1 To 2

    A(i, j) = B(i, j) + c(i, j)

    Next j

    Next i

    Label1.Caption = «a(1,1)=» & A(1, 1) & « a(1,2)=» & A(1, 2)& « a(2,1)=» & A(2, 1) & « a(2,2)=» & A(2, 2) Label2.Caption = «b(1,1)=» & B(1, 1) & « b(1,2)=» & B(1, 2) & « b(2,1)=» & B(2, 1) & « b(2,2)=» & B(2, 2)

    Label3.Caption = «c(1,1)=» & c(1, 1) & « c(1,2)=» & c(1, 2) & « c(2,1)=» & c(2, 1) & « c(2,2)=» & c(2, 2)

    End Sub

    Рис. 24. Форма примера 11 в режиме конструктора и в рабочем состоянии


    Пример 12. Создать программу, создающую два двумерных массива: один массив вводом числовых элементов в соответствующие текстовые поля формы, второй – вводом четырех произвольных фамилий в соответствующие текстовые поля формы (рис. 25, 26). В результате все элементы первого массива увеличиваются на 10 и выводятся в соответствующую метку на форме. Элементы же второго строкового массива организуют вывод предложений типа: работник фамилия Иванов, где Иванов (например) берется из строкового массива, введенного в соответствующие текстовые поля. Данные результаты получаются после нажатия на кнопку Вывод пользовательского диалогового окна.


    Рис. 25. Форма примера 12 в режиме конструктора


    Рис. 26. Форма примера 12 в рабочем режиме


    Листинг примера 12

    Private Sub CommandButton1_Click()

    Dim B(1 To 2, 1 To 2) As String

    Dim c(1 To 2, 1 To 2) As String

    Dim A(1 To 2, 1 To 2) As String

    Dim d(1 To 2, 1 To 2) As Integer

    Dim k(1 To 2, 1 To 2) As Integer

    B(1, 1) = TextBox5.Text

    B(1, 2) = TextBox6.Text

    B(2, 1) = TextBox7.Text

    B(2, 2) = TextBox8.Text

    d(1, 1) = Val(TextBox1.Text)

    d(1, 2) = Val(TextBox2.Text)

    d(2, 1) = Val(TextBox3.Text)

    d(2, 2) = Val(TextBox4.Text)

    For i = 1 To 2

    For j = 1 To 2

    k(i, j) = d(i, j) + 10

    Next j

    Next i

    For i = 1 To 2

    For j = 1 To 2

    c(i, j) = «фамилия» + B(i, j)

    Next j

    Next i

    For i = 1 To 2

    For j = 1 To 2

    A(i, j) = «работник» + c(i, j)

    Next j

    Next i

    Label3.Caption = «a(1,1)=» & A(1, 1) & « a(1,2)=» & A(1, 2) & « a(2,1)=» & A(2, 1) & « a(2,2)=» & A(2, 2)

    Label6.Caption = «k(1,1)=» & k(1, 1) & « k(1,2)=» & k(1, 2) & « k(2,1)=» & k(2, 1) & « k(2,2)=» & k(2, 2)

    End Sub

    3.2. Работа с различными типами данных

    Тип, определяемый пользователем

    VBA позволяет пользователю определять свои собственные типы данных. Определенный пользователем тип нужен, когда одной переменной необходимо обозначить несколько связанных по смыслу элементов данных, причем эти элементы данных могут быть разных типов. Пример структурного типа приведен на рис. 27. Тип Book состоит из трех элементов: Title (название книги) имеет тип String, Content – динамический массив строкового типа, содержащий название глав книги, Author (автор книги), который, в свою очередь, тоже является структурным типом, состоящим из двух простых элементов – Name (имя) и Birthday (день рождения).

    Рис. 27. Пример структурного типа, определяемый пользователем


    Для объявления такого типа данных используется оператор Туре:

    Туре <имяТипа>

    …<имяЭлемента1> [([<размер1>])] As <типДанных1>

    …<имяЭлемента2> [([<размер2>])] As <типДанных2>

    End Туре

    Элементами типа могут быть простые переменные и массивы встроенных типов, а также переменные и массивы других определенных пользователем типов. Типы Book и Person (см. рис. 27) могут быть объявлены следующим образом:

    Type Person

    Name As String

    Birthday As Date

    End Type

    Type Book

    author As Person

    Title As String

    Content () as String

    End Type

    Объявление переменных структурного типа выполняется так же, как и обычных переменных:

    Dim MyBook As Book, Editor As Person

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

    MyBook.Title = «Учебник»

    ReDim MyBook.Content (0 to 10)

    MyBook.Content(0) = «От автора»

    Перечисляемый тип

    Еще одним видом структурного типа данных является перечисляемый тип. Элементами перечисляемого типа являются все его значения. Определяется перечисляемый тип с помощью оператора Enum:

    Enum <имяТипа> <имяЗначения1> [=<Константа>] <имяЗначения2>

    [=<Константа>]

    End Enum

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

    Примером перечисляемого типа данных является встроенный логический тип Boolean.

    Enum Boolean False

    True End Enum

    Над каждым типом данных определено некоторое множество простейших действий, называемых операциями. Язык VBA имеет большое количество встроенных функций для работы с каждым типом данных.

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

    Приведением называется автоматическое преобразование значения одного типа данных в эквивалентное значение другого типа в процессе выполнения операций с данными. Приведение выполняется, если операнды (данные, участвующие в операции) имеют разные типы. При этом результат операции будет иметь тот тип, к которому приводится один из операндов. Например, складываются два числа – целое (Integer) и вещественное (Double). В процессе этой операции целое число приводится к вещественному (Double), и результат будет иметь тип Double. Обратное преобразование (Double в Integer) может привести к потере данных. На рис. 28 приведена схема, показывающая, значения каких типов к каким типам приводятся без потери информации.


    Рис. 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. А именно:

    если свойство boundColumn равно 0, то свойство value возвращает индекс выбранной строки;

    если свойство boundColumn принимает значение из диапазона от 1 до количества столбцов в списке, то свойство value возвращает элемент из выбранной строки, стоящей в столбце, определенном свойством boundcolumn.

    Наиболее часто используемые методы элемента управления ListBox:

    clear – удаляет все элементы из списка;

    RemoveItem (index) – удаляет из списка элемент с указанным номером, где index – номер элемента;

    AddItem ([item[,varIndex]]) – добавляет элемент в список, где item – элемент (строковое выражение), добавляемый в список, и varIndex – номер добавляемого элемента.

    Заполнить список можно одним из следующих способов.


    Поэлементно, если список состоит из одной колонки

    With ListBox1

    AddItem «июнь»

    AddItem «июль»

    AddItem «август»

    ListIndex=0

    End With

    Массивом, если список состоит из одной колонки

    With ListBox1

    List=Array(«июнь»,"июль","август")

    ListIndex = 1

    End With

    Из диапазона A1:B4, в который предварительно введены элементы списка. Результат выбора (индекс выбранной строки) выводится в ячейку С1

    With ListBox1

    ColumnCount = 2

    RowSourse = «A1:B4»

    ControlSourse = «C1»

    BoundColumn=0

    End With

    Поэлементно, если список состоит из нескольких колонок, например двух

    With ListBox1

    ColumnCount = 2

    AddItem «июнь»

    List(0,1)="сессия"

    AddItem «июль»

    List(1,1)="каникулы"

    AddItem «август»

    List(2,1)="отработка"

    End With

    Массивом, если список

    состоит из нескольких

    колонок, например двух

    Dim A(2,1) As string

    A(0,0) = «июнь»

    A(0,1) = «сессия»

    A(1,0) = «июль»

    A(1,1) = «каникулы»

    A(2,0) = «август»

    A(2,1) = «отработка»

    With ListBox1

    ColumnCount = 2

    List = A

    End With

    Задачи на закрепление материала

    Пример 20. Создать программу, которая при вводе имени пользователя и числа от 1 до 10 в текстовые поля формы выдает в метку label1 предсказание в зависимости от введенного значения.

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

    Технология выполнения

    1. Откройте приложение Word, сохраните документ и перейдите в редактор VBA.

    2. Создайте форму (рис. 38).

    3. Пропишите обработчики событий нажатия на кнопки «Вывести предсказание» и «Закрыть».


    Рис. 38. Форма примера 20 в рабочем состоянии


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

    Примечание. Обратите внимание на создание процедуры, содержащей массив предсказаний, и вызов этой процедуры из процедуры нажатия кнопки «Вывести предсказание», учитывая «защиту от дурака».

    Sub fortune(a As String, b As Integer)

    Dim today(1 To 10)

    today(1) = «Вы станете богатым и знаменитым за 15 минут»

    today(2) = «Вам предстоит обед с незнакомцем»

    today(3) = «Стоимость Ваших вкладов удвоится!»

    today(4) = «Вы получите большой букет от своего почитателя»

    today(5) = «Вы опоздаете на пару»

    today(6) = «Все Ваши мечты сбудутся»

    today(7) = «Вам вернут долг»

    today(8) = «Вы выучите лекцию и ответите на опрос»

    today(9) = "Вы встретите своего давнего знакомого»

    today(10) = «На Вас обратят внимание»

    Label3.Caption = a & «, Вас ожидает следующее:» & today(b)

    End Sub

    Private Sub CommandButton1_Click()

    Dim a As String

    Dim b As Integer

    a = TextBox1.Text

    b = Val(TextBox2.Text)

    If b > 0 And b <= 10 Then

    Call fortune(a, b)

    Else: Label3.Caption = «Вы ввели не то число!»

    End If

    End Sub

    4. Откомпилируйте программу.

    5. Запустите приложение на выполнение.

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

    Технология выполнения

    1. Откройте приложение Word, сохраните документ и перейдите в редактор VBA.

    2. Создайте форму (рис. 39).


    Рис. 39. Форма примера 21 в рабочем состоянии. Сообщение о допуске


    3. Переименуйте форму с Name на frmOne. Для этого активизируйте форму (щелкните на ней), перейдите в окно свойств объекта (properties), выделите свойство Name (первая строка) и пропишите frmOne.

    4. Создайте текстовые поля textbox1 и textbox2. Первое будет использоваться для ввода имени, второе – для ввода пароля, поэтому переименуйте их на txtName и txtPassword (аналогично пункту 3).

    5. Как правило, вводимый пароль не отображается в поле. Чтобы вводимые символы пароля заменялись звездочками, выделите поле пароля, затем в окне Properties найдите свойство PasswordChar и задайте для него значение «*».

    6. Добавьте кнопки. Переименуйте первую кнопку на btnOK. Кнопка OK должна быть кнопкой по умолчанию. Это означает, что на нажатие клавиши Enter форма должна реагировать так же, как и на щелчок этой кнопки. Для этого измените значение свойства Default кнопки btnOK на True.

    7. Переименуйте вторую кнопку на btnCancel. Щелчок кнопки Cancel обычно эквивалентен нажатию клавиши Escape. Чтобы в вашем окне было именно так, задайте значение «True» для свойства Cancel.

    8. Создайте процедуру закрытия формы.

    9. Создайте процедуру работы кнопки ОК. В заготовке процедуры

    Private Sub btnOK_Click()

    End Sub

    вставьте оператор MsgBox Txtname & «получил(а) доступ». В этом операторе текст, введенный в поле txtName, объединяется с поясняющей строкой и выводится в информационном окне.

    10. Создайте процедуру для проверки пароля. Закроем доступ к кнопке OK, пока не введен верный пароль. Для этого измените свойство Enabled кнопки OK на False (доступ к кнопке закрыт) и введите новую процедуру:

    Private Sub CheckOK()

    Const pas = «abc» 'Пароль

    If Txtpassword = pas Then 'Если текст в поле

    Txtpassword совпадает с паролем, то btnOK.Enabled = True 'доступ к кнопке OK открыт

    Else 'иначе

    btnOK.Enabled = False 'доступ к кнопке OK закрыт

    End If

    End Sub

    Процедура должна запускаться при вводе нового пароля. Для этого в окне формы щелкните дважды второе текстовое поле (предназначенное для пароля). В появившуюся процедуру

    Private Sub Txtpassword_Change()

    End Sub

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

    11. Заполните список группы. Расположите на форме элемент управления ListBox. По умолчанию его имя ListBox1. Оставим его в таком виде. Заполнить список можно в операторе With:

    With ListBox1

    List = Array(«Иванова Марина», «Гончарова Елена», «Зотова Татьяна», «Кринченко Светлана», «Орлов Сергей», «Петров Александр»)

    End With

    Здесь List – свойство элемента ListBox, которое является массивом. Вставьте этот оператор в уже имеющуюся процедуру btnOK_Click.

    12. Проверка работы формы. После запуска формы введите свое имя и верный пароль. Должна стать доступной кнопка ok. После ее нажатия появляются сообщение «Имя получил(а) доступ» и заполненный список. После нажатия кнопки Закрыть форма должна закрыться.

    Дополнительные задания

    13. Дополните список с помощью метода AddItem. Синтаксис:

    ИмяСписка. AddItem «новый элемент списка».

    14. Обработайте событие, связанное со щелчком по форме (мимо элементов управления). Пусть в ответ на это выводится какое-нибудь сообщение типа «Вы не попали по кнопке!».

    4.2. Элементы управления ComboBox, OptionButton и Frame

    Поле со списком

    Элемент управления СотbоВох

    (поле со списком) создается с помощью соответствующего элемента. Элемент управления СотЪоВох применяется для хранения списка значений. Он сочетает в себе функциональные возможности списка ListBox и поля TextBox. В отличие от ListBox, в элементе управления СотЪоВох отображается только один элемент списка. Кроме того, у него отсутствует режим выделения нескольких элементов списка, но он позволяет вводить значение, используя поле ввода, как это делает элемент управления TextBox.

    Свойства объекта ComboBox, такие как ListIndex, ListCount, Enabled, List, и методы Clear, RemoveItem и AddItem аналогичны соответствующим свойствам и методам списка ListBox. Кроме того, у него есть ряд уникальных свойств:

    DropButtonStyle – устанавливает вид раскрывающегося списка. Допустимые значения:

    fmDropButtonStylePlain – кнопка без символов;

    fmDropButtonStyleArrowDisplays – кнопка со стрелкой;

    fmDropButtonStyleEllips – кнопка с эллипсом;

    fmDropButtonStyleReduce – кнопка с линией.

    ListRows – устанавливает число элементов, отображаемых в раскрываемом списке.

    MatchRequired – допустимые значения: True (нельзя ввести значения) и False (в противном случае).

    MatchFound – допустимые значения: True (среди элементов раскрывающегося списка имеется элемент, совпадающий с вводимым в поле ввода раскрывающегося списка) и False (в противном случае).

    Переключатель и рамка

    Элемент управления OptionButton

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

    Элемент управления Frame

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

    Задачи на закрепление материала

    Пример 22.[1] Создать программу, которая позволяет при выделении из списка формы нескольких чисел производить суммирование, находить произведение или среднее значение в зависимости от выбора действия (операции).

    Нажатие кнопки «Вычислить» должно привести к выполнению выбранной операции над выбранными числами и выводу результата в поле «Результат» (рис. 40).


    Рис. 40. Разработанная форма примера 22 в рабочем состоянии


    Технология выполнения

    Обсудим, как приведенная ниже программа решает перечисленные пункты задачи и что происходит в программе.

    UserForm_Initialize

    1. Активизирует диалоговое окно

    2. Запрещает ввод данных в поле Результат.

    3. Связывает с кнопками Вычислить и Закрыть, а также с переключателями всплывающие подсказки

    Нажатие кнопки Вычислить запускает на выполнение процедуру CommandButton1_Click

    Определяет, какой переключатель выбран. В зависимости от выбранного переключателя производит действие над выбранными в списке числами. Найденное число выводится в поле Результат

    Нажатие кнопки Закрыть запускает на выполнение процедуру CommandButton2_Click

    Закрывает диалоговое окно


    Процедура нажатия кнопки «Вычислить» производит вычисления с элементами списка в зависимости от выбранной операции. Вводятся переменные n и i, где n играет роль счетчика числа выбранных элементов из списка, а i – вспомогательная переменная. Также вводятся переменные, которые будут содержать результат вычислений: сумма, произведение и среднее. Все полученные вычисления присваиваются переменной Результат, которая и выдается в текстовое поле.


    Процедура нажатия кнопки Вычислить

    Private Sub CommandButton1_Click ()

    Dim i As Integer

    Dim n As Integer

    Dim Сумма As Double

    Dim Произведение As Double

    Dim Среднее As Double

    Dim Результат As Double

    ' При выборе первого переключателя вычисляется сумма

    If OptionButton1.Value = True Then

    Сумма = 0

    With ListBox1

    For i = 0 To.ListCount – 1

    If.selected(i)=true then

    Сумма = Сумма +.List(i)

    End if

    Next i

    End With

    Результат = Сумма

    End If

    ' При выборе второго переключателя вычисляется произведение выбранных элементов

    If OptionButton2.Value = True Then

    Произведение = 1

    With ListBox1

    For i = 0 To.ListCount – 1

    If.Selected(i)=True Then

    Произведение = Произведение *.List(i)

    End if

    Next i

    End With

    Результат = Произведение

    End If

    ' При выборе третьего переключателя вычисляется среднее арифметическое

    If OptionButton3.Value = True Then

    Среднее = 0

    n = 0

    With ListBox1

    For i =0 To.ListCount – 1

    If.Selected(i)=True Then

    n=n+1

    Среднее = Среднее +.List(i)

    End if

    Next i

    End With

    Результат = Среднее /n

    End If

    ' Полученное значение Результат выводится в текстовое поле

    TextBox1.Text = CStr(Format(Результат, «Fixed»))

    End Sub

    Процедура нажатия кнопки «Закрыть»

    Private Sub CommandButton2_Click()

    UserForm1.Hide

    End Sub

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

    Private Sub UserForm_Initialize()

    With ListBoxl

    List = Array(1, 3, 4, 5, 6, 7, 8, 10)

    Listlndex = 0 'начальная индексация массива

    MultiSelect=fmMultiSelectMulti

    End With

    ' Первоначальный выбор переключателя Сумма при инициализации диалогового окна и задание текста всплывающих подсказок у переключателей With OptionButton1.Value = True

    ControlTipText ="Сумма выбранных элементов"

    End With

    OptionButton2.ControlTipText ="Произведение выбранных элементов"

    OptionButton3.ControlTipText = «Среднее значение выбранных элементов»

    ' Поле Результат не доступно для пользователя

    TextBox1.Enabled = False

    ' Назначение клавише <Enter> функции кнопки Вычислить и задание текста всплывающей подсказки

    With CommandButton1

    Default = True

    ControlTipText = «Нахождение результата»

    End With

    ' Назначение клавише <Esc> функции кнопки Закрыть и задание текста всплывающей подсказки

    CommandButton2.Cancel = True

    ' Задание заголовка пользовательской формы

    UserForm1.Caption = «Операции над элементами списка»

    UserForm1.Show

    End Sub

    Примечание. Интересной особенностью приводимой процедуры инициализации UserForm_initialize является то, что заголовок диалогового окна вводится программно при помощи свойства Caption, а не вручную при помощи окна Properties.

    Пример 23. Разработать программу нахождения среднего балла студентов, выбранных из списка в диалоговом окне «Средний балл». Список содержит фамилию студента и его средний балл (двумерный массив) (рис. 41).


    Рис. 41. Разработанная форма примера 23 в рабочем состоянии


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

    При выполнении задания опирайтесь на приводимые ниже примечания.

    Примечание. Обратите внимание на то, что в отличие от примера 22 данный пример требует ввода двумерного списка: столбца фамилий и столбца оценок. Фактически разница заключается лишь в том, что в приведенном примере массив ListBoxl.List, отвечающий за список элементов, был одномерным, а в данном случае должен быть двумерным. Сделать это можно двумя способами:

    непосредственно заполнить двумерный массив ListBoxl.List;

    задать произвольный двумерный массив, а затем присвоить его значение для ListBoxl.List (см. п. 3.1 и 4.1).

    Соответственно, для расчета среднего балла следует воспользоваться только элементами второго столбца массива, т. е. вторая координата массива ListBoxl.List должна быть фиксирована на 1 (если индексация массива положена с нуля) или на 2 (если индексация массива положена с 1).

    4.3. Элементы управления MultiPage, ScrollBar, SpinButton[2]

    Коллекция Controls

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

    Пример 24. Создать форму, имеющую пять элементов: метка, текстовое поле, список, две кнопки. Ввести в текстовое поле и список по умолчанию текст «поле 1», «список 1» (свойство text соответственно у каждого элемента). Первая кнопка «Нажми» выполняет следующее действие: вызывается диалоговое окно, в котором запрашивается разрешение на удаление очередного элемента формы (их пять). Ответ «да» или «нет» выполняет соответствующее действие. Кнопка «Закрыть» закрывает диалоговое окно.

    Примечание. Используя коллекцию Controls, программно в цикле организовать скрытие (не удаление!) элементов управления диалогового окна MyForm (свойство Name формы).

    Технология выполнения

    1. Запустите приложение Word, сохраните новый документ.

    2. Создайте форму в режиме конструктора (рис. 42).


    Рис. 42. Форма примера 24


    3. Обработайте кнопки Нажми и Закрыть.

    Кнопка Нажми

    Private Sub CommandButton1_Click()

    For Each Ctrl In myForm.Controls 'цикл по всем элементам управления

    msgCode = vbYesNo + vbQuestion

    'Вопрос об очередном элементе управления:

    Answer = MsgBox(prompt:="Cкрыть элемент " & Ctrl.Name,

    Buttons:=msgCode, Title:="Bonpoc")

    If Answer = vbYes Then 'ответ «Да»

    Ctrl.Visible = False 'скрыть очередной элемент

    End If

    Next Ctrl

    End Sub

    Кнопка Закрыть

    Private Sub CommandButton2_Click()

    Unload Me

    End Sub

    4. Откомпилируйте приложение.

    5. Запустите на выполнение (рис. 43, 44, 45).

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


    Рис. 43. Первоначальный запуск формы и вызов процедуры кнопки Нажми

    Рис. 44. Выполнение скрытия элемента label1 и следующий запрос


    Рис. 45. Вид формы перед удалением последнего элемента управления


    В этом случае необходимо только щелкнуть по нужному элементу и прописать код, для каждого элемента свой:

    Private Sub Label1_Click()

    msgCode = vbYesNo + vbQuestion

    Answer = MsgBox(prompt:="Cкрыть элемент",

    Buttons:=msgCode, Title:="Вопрос")

    If Answer = vbYes Then

    Label1.Visible = False

    Else

    Label1.Visible = True

    End If

    End Sub

    В результате работа формы будет более рациональной (рис. 46).


    Рис. 46. Работа формы по щелчку скрываемого элемента

    Набор страниц MultiPage

    Элемент управления MultiPage объединяет несколько независимых диалоговых окон – страниц (вкладок). Заголовки страниц обычно видны на одной из сторон элемента на их закладках, а переход на страницу происходит после щелчка по ее закладке. Этот простой переход с одной страницы на другую и делает MultiPage удобным средством для представления разнородных данных, относящихся к одному объекту. Такие данные в «бумажных» офисах хранятся обычно в отдельных папках и образуют дела, досье и т. д. Каждая страница из Multipage – это объект типа Page, а все они включены в коллекцию Pages (страницы). При создании элемента MultiPage в него автоматически помещаются две страницы с именами Page1 и Раgе2. Имена можно изменять, присутствует возможность добавления и новых страниц. Рассмотрим основные свойства набора страниц.

    Свойство count определяет, какое количество страниц возвращается.

    Свойство value для элемента multipage определяет номер текущей активной страницы в коллекции pages.

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

    Свойство style определяет, в каком виде представляются заголовки страниц. По умолчанию оно равно fmtabstyletabs = 0 и задает представление заголовков в виде закладок в полосе заголовков. Каждая закладка с заголовком находится внутри границ своей страницы. Если значение fmtabstylebuttons = 1, то заголовок каждой страницы находится на отдельной кнопке, расположенной в полосе заголовков. Переход на страницу происходит после выбора кнопки с ее заголовком. Если же значение fmtabstylenone = 2, то полоса с заголовками страниц на экран не выводится.

    Свойство taborientation задает расположение полосы с заголовками страниц (табл. 13).


    Таблица 13

    Значения свойства TabOrientation

    Булево свойство multirow позволяет создать несколько полос с закладками (по умолчанию его значение равно false, что соответствует одной полосе закладок).

    Свойства tabfixedheight и tabfixedwidth устанавливают или возвращают высоту и ширину закладки (в точках). При значении 0 ширина закладок устанавливается автоматически, так чтобы в каждой закладке помещалось ее название и занимало всю ширину элемента. При значениях больше 0 у всех закладок одинаковые размеры, заданные свойством TabFixedWidth. Минимально возможный размер закладки – 4 точки.

    Для того чтобы редактировать свойства элемента MultiPage, необходимо выделить этот элемент так, чтобы рамка вокруг элемента выделилась точками (рис. 47). Для этого щелкните по самой рамке, если она выделена черной штриховкой.


    Рис. 47. Рамка элемента multipage


    Если необходимо установить свойства самих вкладок, необходимо щелкнуть по ним, после чего рамка станет выделяться черной штриховкой (рис. 48).


    Рис. 48. Рамка элемента page


    Если необходимо добавить еще одну вкладку в режиме конструктора, то необходимо щелкнуть правой кнопкой мыши по последней вкладке (странице) и выбрать команду New Page (рис. 49).


    Рис. 49. Добавление новой страницы


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


    Рис. 50. Установление свойств вкладки


    Пример 25. Создать форму, включающую в себя ряд вкладок (страниц), содержащих вопросы некоторого теста. На каждой странице находятся очередной вопрос и кнопка «Ответ», фиксирующая выбор правильного (неправильного) ответа. После перехода на следующую страницу (щелчок по корешку страницы с соответствующим именем) действия повторяются. Итоговая страница содержит кнопку «Результат», которая выводит правильность ответов и сумму набранных баллов (1 правильный ответ = 1 балл).


    Рис. 51. Свойства в действии


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

    Технология выполнения

    1. Запустите приложение Word и сохраните документ.

    2. Перейдите в редактор VBA и создайте форму, содержащую 4 страницы (рис. 52).


    Рис. 52. Первая страница теста


    3. Оформите первую страницу (рис. 52) и обработайте кнопку «Ответ».

    Dim a As Integer

    Private Sub CommandButton1_Click()

    If OptionButton3.Value = True Then

    a = a + 1

    Label11.Caption = «Ответ верен»

    Else

    Label11.Caption = «Oтвет неверен»

    End If

    End Sub

    4. Оформите вторую страницу теста (рис. 53) и обработайте кнопку «Ответ».

    Private Sub CommandButton2_Click()

    If OptionButton5.Value = True Then

    a = a + 1

    Label12.Caption = «Ответ верен»

    Else

    Label12.Caption = «Ответ неверен»

    End If

    End Sub

    Рис. 53. Вторая страница теста


    5. Оформите третью страницу теста (рис. 54) и обработайте кнопку «Ответ».


    Рис. 54. Третья страница теста

    Private Sub CommandButton3_Click()

    If OptionButton10.Value = True Then

    a = a + 1

    Label13.Caption = «Ответ верен»

    Else

    Label13.Caption = «Ответ неверен»

    End If

    End Sub

    6. Оформите четвертую страницу теста (рис. 55) и обработайте кнопку «Результат».

    Private Sub CommandButton4_Click()

    Label15.Caption = "вы набрали " & a & «балл(а)»

    End Sub

    Рис. 55. Итоговая страница теста


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

    7. Откомпилируйте программу и запустите на выполнение.

    Полоса прокрутки ScrollBar

    Элемент управления ScrollBar представляет собой вертикальную или горизонтальную полосу, по краям которой расположены кнопки прокрутки, а внутри перемещается бегунок. Значение Value, устанавливаемое в полосе прокрутки или возвращаемое ей, – число, определяемое положением бегунка и границами, определенными в свойствах Min и Мах. Рекомендуемые значения этих границ – от –32 767 до + 32 767 (по умолчанию установлен диапазон [0, 32 767]).

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

    Свойства полосы прокрутки следующие.

    Горизонтальная или вертикальная ориентация полосы прокрутки определяется свойством orientation. При его значении по умолчанию fmorientationauto = –1, ориентация полосы определяется автоматически в зависимости от ее размера по горизонтали и вертикали (больший размер задает ориентацию). Значение fmorientationvertical = 0 задает вертикальную ориентацию полосы, fmorientationhorizontal = 1 – горизонтальную.

    Свойства largechange и smallchange определяют, на сколько изменится значение value при одном щелчке поверхности полосы между кнопкой прокрутки и бегунком в первом случае и при щелчке кнопки прокрутки – во втором. Эти же свойства указывают, на сколько при этом смещается бегунок. По умолчанию оба свойства равны 1. Рекомендуемая область значений обоих свойств – от –32,767 до 32,767.

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

    Свойство proportionalthumb определяет размер бегунка: true – размер бегунка пропорционален размеру области прокрутки (это значение по умолчанию); false – система определяет фиксированный размер бегунка.

    Пример 26. Создать форму, содержащую два элемента scrollbar, два текстовых поля и кнопку, выводящую результат вычисления в метку на форме. Программно отражать значения в текстовых полях формы при движении бегунка. После нажатия на кнопке «Вычислить» программа считывает значения с текстовых полей, переводит эти значения в числовые и суммирует. Результат отражается в соответствующей метке на форме.

    Технология выполнения

    1. Активизируйте приложение Word и сохраните документ.

    2. Перейдите в редактор VBA и создайте форму (рис. 56).


    Рис. 56. Форма примера 26 в режиме конструктора и рабочем режиме


    3. Обработайте элементы ScrollBar и кнопку «Вычислить».

    Dim a, b, c As Integer

    Private Sub CommandButton1_Click()

    c = a + b

    Label4.Caption = «Сумма с=» & c

    End Sub

    Private Sub ScrollBar1_Change()

    TextBox1.Text = ScrollBar1.Value

    a = Val(TextBox1.Text)

    End Sub

    Private Sub ScrollBar2_Change()

    TextBox2.Text = ScrollBar2.Value

    b = Val(TextBox2.Text)

    End Sub

    4. Откомпилируйте программу и запустите форму на выполнение.

    Счетчик SpinButton

    SpinButton (счетчик, ворот) позволяет пользователю увеличивать и уменьшать числовой параметр до получения требуемого значения. Один щелчок кнопки прокрутки увеличивает или уменьшает значение свойства Value на величину, заданную свойством SmallChange. Как и для ScrollBar, интервал изменения числовой характеристики определяется значениями свойств Min и Мах, вертикальная или горизонтальная ориентация счетчика – свойством Orientation, а задержка между повторными событиями Change – свойством Delay.

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

    Пример 27. Создать форму, содержащую два элемента spinbutton, два текстовых поля и кнопку, выводящую результат вычисления в метку на форме. Программно отражать значения в текстовых полях формы при движении бегунка. После нажатия на кнопке «Вычислить» программа считывает значения с текстовых полей, переводит эти значения в числовые и перемножает. Результат вычисления отражается в соответствующей метке на форме.

    Технология выполнения

    1. Активизируйте приложение Word и сохраните документ.

    2. Перейдите в редактор VBA и создайте форму (рис. 57).


    Рис. 57. Форма примера 27 в режиме конструктора и в рабочем режиме


    3. Обработайте элементы SpinButton и кнопку «Вычислить».

    Dim a, b, c As Integer

    Private Sub CommandButton1_Click()

    c = a * b

    Label4.Caption = «Произведение с =» & c

    End Sub

    Private Sub SpinButton1_Change()

    TextBox1.Text = SpinButton1.Value

    a = Val(TextBox1.Text)

    End Sub

    Private Sub SpinButton2_Change()

    TextBox2.Text = SpinButton2.Value

    b = Val(TextBox2.Text)

    End Sub

    4. Откомпилируйте программу и запустите форму на выполнение.

    4.4. Объект DataObject[3]

    Описание объекта DataObject

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

    Поведение DataObject похоже на поведение буфера обмена. Однако DataObject существует только в момент работы приложения и исчезает после ее завершения, а данные в буфере обмена при этом не теряются, DataObject может хранить только текстовые данные, а буфер обмена – и графические. С другой стороны, DataObject – настоящий OLE-объект и поддерживает, в отличие от буфера обмена, операции перетаскивания текста.

    Текст заносится в DataObject методом SetText, а извлекается оттуда методом GetText:

    объект. SetText(StoreData [, format])

    и

    Строка = объект. GetText([format]),

    где объект – объект – владелец метода;

    StoreData – текст, который надо запомнить в объекте;

    format – это необязательный параметр, задающий «формат» данных (1 соответствует стандартному текстовому формату, а другие числа и строки соответствуют пользовательским форматам).


    Если параметр format в вызове SetText явно не указан, то запоминаемому тексту присваивается формат стандартного текста 1. Так как для каждого формата DataObject содержит лишь один текст с этим форматом, то фактически формат играет роль ключа, с помощью которого текст заносится и извлекается из DataObject. Метод GetFormat позволяет узнать, имеется ли в объекте DataObject текст определенного формата:

    BooleanVar = объект. GetFormat(format)

    Переменная BooleanVar получит значение True, если данные с указанным форматом входят в объект. Объект DataObject может обмениваться данными с буфером обмена посредством методов GetFromClipboard и PutInClipboard. Оператор

    String = объект. GetFromClipboard()

    помещает содержимое буфера обмена в DataObject, а вызов

    объект. PutInClipboard

    переносит данные из DataObject, имеющие текстовый формат 1, в буфер обмена.

    Пример 28. Форма содержит два текстовых поля, в одном из них программно отображается текст, который при помощи методов объекта dataobject необходимо перенести (перекопировать) во второе текстовое поле. Данное действие происходит после нажатия на кнопку «Копировать», причем все производимые действия программы отображаются в соответствующей метке на форме (рис. 58).


    Рис. 58. Форма примера 28 в режиме конструктора и в рабочем режиме


    Технология выполнения

    1. Активизируйте приложение Word и сохраните документ.

    2. Перейдите в редактор VBA и создайте форму (рис. 58).

    3. Пропишите при инициализации окна в поле TextBox1 текстовую информацию и проинициализируйте глобальные переменные:

    Public NewData As DataObject

    Public NumClick As Integer

    Private Sub UserForm_Initialize()

    Set NewData = New DataObject 'инициализация объекта

    NumClick = 0

    'число щелчков

    TextBox1.Text = "Пример переноса данных с помощью

    DataObject»

    End Sub

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

    Private Sub CommandButton1_Click()

    Select Case NumClick

    Case 0

    NewData.SetText TextBox1.Text

    Label1.Caption = «Из первого поля в DataObject»

    Case 1

    NewData.PutInClipboard

    Label1.Caption = «Из DataObject в буфер обмена»

    Case 2

    TextBox2.Paste

    Label1.Caption = «Из буфера обмена во второе поле»

    End Select

    NumClick = NumClick + 1

    If NumClick = 3 Then NumClick = 0

    End Sub

    5. Откомпилируйте программу и запустите форму на выполнение.

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

    Перемещение объектов. Реализация технологии DragAndDrop

    Для копирования данных из поля ввода в буфер обмена обычно вызывают метод Сору. Однако при организации интерфейса в диалоговых формах полезно предоставить пользователю возможность работы с техникой DragAndDrop (Переместить и Опустить). Некоторый объект захватывается мышью, перетаскивается к другому целевому объекту и отпускается, изменяя при этом свойства целевого объекта. Типичным примером является возможность перетаскивать элемент из одного списка в другой. Другой пример – перетаскивание писем и опускание их в почтовый ящик. Важным элементом этой техники является изменение внешнего вида курсора. Захват объекта происходит при подведении курсора к объекту и нажатии левой кнопки мыши. В этот момент курсор меняет внешнюю форму. Когда происходит перемещение мыши, то в тех областях, где расположен целевой объект, курсор снова меняет форму, показывая, что цель достигнута. Если в этот момент отпустить левую кнопку мыши, то операция перемещения заканчивается успешно. Если отпустить кнопку мыши в других областях, то это приведет к неудаче. Объект DataObject и его метод StartDrag являются частью этой технологии.

    Пример 29. Создать форму, имеющую два элемента управления: список и текстовое поле. При помощи мыши из списка перетаскивают в текстовое поле необходимый элемент, выделенный в списке (рис. 59, 60, 61).

    Программно заполняются элементы списка, который содержит наименования месяцев года. Программа, используя технологию DragAndDrop объекта DataObject, позволяет перетащить выбранный элемент из списка в текстовое поле выбора (рис. 60). При неправильном действии, т. е. перетаскивании не в текстовое поле, происходит вызов предупреждающего сообщения (рис. 61).


    Рис. 59. Форма примера 29 в режиме конструктора


    Рис. 60. Форма примера 29 в рабочем режиме


    Рис. 61. Окно предупреждения о неправильно выполненной операции


    Когда пользователь захватывает выбранный им элемент списка, то возникает некоторое событие. В нашем примере это событие MouseMove, обработчик которого и будет вызывать метод StartDrag объекта DataObject, который хранит значение перетаскиваемого элемента. Синтаксис метода:

    Function StartDrag([Effect As fmDropEffect]) As

    fmDropEffect

    Эта функция обычно вызывается в операторе присваивания вида:

    ResultEffect=объект. StartDrag([effect as fmDropEffect])

    Необязательный параметр Effect и результат выполнения функции принадлежат перечислению fmDropEffect. Константы, входящие в это перечисление, имеют следующие значения:

    fmDropEffectNone = 0 – не копировать и не передвигать опущенный исходный элемент на место назначения;

    fmDropEffectCopy =1 – копировать опущенный исходный элемент на место назначения;

    fmDropEffectMove = 2 – передвинуть опущенный исходный элемент на место назначения;

    fmDropEffectCopyOrMove = 3 – скопировать или передвинуть опущенный исходный элемент на место назначения.

    Параметр Effect задает цель операции и имеет по умолчанию значение 1 (fmDropEffectCopy). Обычно он опускается, поскольку значение по умолчанию задает наиболее вероятную цель операции. Значение, возвращаемое методом StartDrag, определяет результат выполнения операции. Его можно использовать для анализа того, что же произошло в результате перетаскивания на самом деле. Между запуском метода StartDrag в правой части оператора присваивания и присваиванием результата левой части переменной ResultEffect в процессе перемещения объекта происходит много событий. Работают обработчики этих событий, и результат говорит о том, как закончился этот процесс.

    Технология выполнения

    1. Активизируйте приложение Word и сохраните документ.

    2. Перейдите в редактор VBA и создайте форму (рис. 59).

    3. Создайте обработчик события Initialize для диалогового окна, обеспечивающего инициализацию начального состояния:

    Private Sub UserForm_Initialize()

    With Me.ListBox1

    AddItem «январь»

    AddItem «февраль»

    AddItem «март»

    AddItem «апрель»

    AddItem «май»

    AddItem «июнь»

    AddItem «июль»

    AddItem «август»

    AddItem «сентябрь»

    AddItem «октябрь»

    AddItem «ноябрь»

    AddItem «декабрь»

    End With

    End Sub

    4. В результате инициализируется список «Месяц года», имеющий имя ListBox1. Готовясь перетащить этот элемент в другое место, пользователь выбирает элемент этого списка. Затем он нажимает левую клавишу мыши, и у списка возникает событие MouseMove, обработчик которого имеет много параметров. Приведем текст этого обработчика:

    Private Sub ListBox1_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

    Dim MyDataObject As DataObject

    Dim Msg As String

    Msg = «Видимо, Вы уронили месяц при перетаскивании. Повторите операцию!»

    If Button = 1 Then

    Debug.Print «MouseMove»

    Set MyDataObject = New DataObject

    Dim Effect As Integer

    MyDataObject.SetText ListBox1.Value

    Effect = MyDataObject.StartDrag(fmDropEffectCopy)

    If Effect = 0 Then MsgBox (Msg)

    Debug.Print "Effect = ", Effect

    End If

    End Sub

    5. Откомпилируйте программу и запустите форму на выполнение.

    Дополнительные элементы управления

    В VBA, кроме перечисленных стандартных элементов управления, имеется ряд дополнительных. Дополнительные элементы управления являются самостоятельными объектами, обладающими как общими для всех элементов управления свойствами и методами, так и присущими только им свойствами и методами. Для добавления дополнительных элементов управления на панель элементов необходимо:

    1) выбрать команду Сервис + Дополнительные элементы (Tools + Additional Controls);

    2) в появившемся на экране окне Дополнительные элементы (Additional Controls) (рис. 62) в списке Доступные элементы (Available Controls) установить флажок напротив добавляемого элемента;

    3) нажать кнопку ОК.

    Удаление ненужного элемента управления из панели элементов происходит аналогично добавлению, только флажок снимают.



    Рис. 62. Окно добавления дополнительных элементов


    Среди дополнительных элементов управления очень полезным является элемент управления Calendar (календарь) (рис. 63). Этот объект представляет средство для организации удобного интерфейса по вводу дат. Элемент управления конструируется в форме с помощью кнопки Календарь (Calendar).



    Рис. 63. Элемент управления calendar, расположенный на форме


    Перечислим основные свойства элемента управления Calendar (табл. 14).


    Таблица 14

    Свойства Calendar

    Перечислим основные методы элемента управления Calendar (табл. 15).


    Таблица 15

    Методы Calendar

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

    Private Sub Calendar1_Click()

    Cells(1, 1).Value = Calendar1.Value

    End Sub









    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх