Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VBA. Практическое программирование

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
666 Кб
Скачать

 

О «быстром» программировании

 

 

 

 

End If

Закрываются конструкции If EndIf

End If

 

End If

 

End Sub

 

 

 

Сделаем пояснения к некоторым строчкам кода.

If x Mod 4 = 1 Then — нас интересуют 1, 5, 9 и т. д. строки. Номера этих строк делятся на 4 с остатком 1. Для определения цело- численного остатка используем встроенную функция mod.

otvet = MsgBox(a$, 1) — Используя функцию MsgBox, выводим на экран номер строки (в строковой переменной a$), и если пользователь отвечает «ОК», то переменная otvet становится равной 1. Подробности по этой функции смотрите в справочной системе.

Кнопка «Сброс», находящаяся на форме, по щелчку запускает процедуру, которая закрывает форму через метод Hide: UserForm1.Hide.

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

Однорукий бандит

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

Сначала о логике игры. С помощью встроенной функции в трех ячейках создаются случайные числа в диапазоне от 1 до 9. С помощью функции «Если...» происходит попарно сравнение этих чисел, и при совпадение одной любой пары в соответствующей ячейке устанавливается выражение «Истина». За это отвечает блок F3:H3. В ячейке I3 значение «Истина» будет, если совпадет хоть одна пара, а в I4 — если все пары. В соседнем столбце J будут изменяться число набранных баллов. Для ложного результата — это —10, а для истинного или 15, или 30. Для добавления к общему числу баллов берется максимальное значение, полученное за очередной ход.

71

2. «Быстрое» программирование

Dim Ball As Integer, xod As

В блоке General объявляем две

Integer

переменные

 

 

Private Sub

Процедура для кнопки «Новая игра»

CommandButton1_Click()

 

xod = 0

Задаем начальное значение для числа

 

ходов

Ball = 300

И количества баллов

Label1.Caption = Ball

Выводим эти значения в соответствующие

Label2.Caption = xod

окошки

 

CommandButton1.Enabled =

Теперь эта кнопка не нужна и она

False

неактивна.

End Sub

 

 

 

Private Sub

Процедура для кнопки «Ваш ход»

CommandButton2_Click()

 

If Ball > 0 Then

Процедура работает, если у Вас есть очки

Calculate

Пересчет рабочего листа, появление

 

новых чисел

xod = xod + 1

Число ходов увеличено на 1

Ball = Ball + Cells(5, 10)

А число баллов изменилось в зависимости

 

от выпавших чисел

Label1.Caption = Ball

Результат отображается в

Label2.Caption = xod

соответствующих окошках

 

Else

Если Вы «обанкротились»

CommandButton1.Enabled =

То можно начать «Новую игру»

True

 

End If

 

End Sub

 

 

 

Для игры сначала нажмите «Новая игра», а затем многократно нажимайте «Ваш ход», пока не проиграете.

Победит тот, кто продержится больше ходов. Успеха Вам. Этот пример иллюстрируется файлом «Однорукий бандит.xls».

Секундомер

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

72

О «быстром» программировании

Рис. 2.2. Игра «Однорукий бандит»

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

Идея программы заключалась в создании секундомера. В каче- стве «источника» времени используются часы компьютера. В VBA есть встроенная функция Timer, которая позволяет определить время в данный момент. На этот раз в отдельном блоке мы запишем три процедуры

Dim sstart As Single

В блоке General объявляем две переменные,

 

одна из которых — логическая.

Dim flag As Boolean

 

 

 

Public Sub start()

Процедура по имени start

sstart = Timer

В переменной sstart запоминается значение

 

текущего времени в тот момент, когда

 

запущена процедура.

flag = True

Значение логической переменной — Истина

 

 

End Sub

 

 

 

 

 

Public Function ttimer()

Имя функции — ttimer

If flag Then ttimer =

Åñëè flag «разрешает», то есть имеет значение

Timer – sstart

«Истина», то функция ttimer вычислит разницу

 

между текущим временем и временем старта

 

секундомера

 

 

73

2. «Быстрое» программирование

End Function

 

 

 

 

 

Public Sub sstop()

Процедура остановки секундомера.

 

 

flag = False

Переменная flag получила значение Ложь и

 

функция ttimer не «сработает»

 

 

sstart = 0

Произошел сброс секундомера.

 

 

End Sub

 

 

 

 

 

Работу секундомера будем наблюдать на отдельном листе. При- чем, если пользователь щелкнет по ячейке со словом «start», то секундомер запустится, если по любой пустой ячейке, то на элементе управления Label появится время, прошедшее с момента старта. И для остановки секундомера достаточно выделить ячейку «Stop». Посмотрите, какими инструкциями это обеспечивается.

Private Sub

Процедура под стандартное собыие

Worksheet_SelectionChange

SelectionChange

(ByVal Target As Range)

 

 

 

If Target.Count = 1 Then

Важно, чтобы была выделена только одна

 

ячейка. Свойство Count— количество

 

ячеек. В этом случае выполняются коды

 

внутри блока If

 

 

If Target = "start" Then

Затем, смотрим какая ячейка выделена.

 

Åñëè ýòî «Start», òî

 

 

Label1 = 0

Показываем в надписи 0,

 

 

start

Запускаем процедуру start

 

 

End If

И выходим из этого блока

 

 

If Target = "stop" Then sstop

Если выделена «Stop», то вызываем

 

процедуру остановки секундомера

 

 

If Target = "" Then Label1 =

Если выделена любая пустая ячейка,

ttimer

в надписи отображается время,

 

вычисленное функцией ttimer.

 

 

End If

Выход из внешнего блока If EndIf.

 

 

End Sub

 

 

 

 

 

Этот пример иллюстрирован файлом «Секундомер.xls»

74

О «быстром» программировании

Живая диаграмма

Наступила пора рассказать еще об одной замечательной возможности VBA — о «живых» диаграммах. Большинство пользователей знают, что в электронной таблице можно построить самые разные диаграммы. Оказывается, можно сделать так, что диаграммы и графики оживут. Давайте создадим простейшую модель вращения Луны вокруг Земли.

Упражнение 8

1.Откройте чистую рабочую книгу. Убедитесь, что Вы находитесь на Листе1.

2.Занесите в ячейки таблицы данные в соответствии с таблицей, в которой указаны только необходимые элементы

Адрес ячейки

Содержимое

 

A2

0

Параметр

 

 

 

B2

=5*cos(A2)

Х — координата Луны

C2

=5*sin(A2)

Y — координата Луны

D2

1

Размер Луны

 

 

 

E2

4

Число оборотов

B3

0

Х координата Земли

C3

0

Y — координата Земли

 

 

 

D3

5

Размер Земли

E3

=ÏÈ()

Число Пи

E4

=2*E3*E2

Максимальное значение

 

 

параметра

 

 

 

3. Сравните, что получилось у Вас, с тем, что изображено на рисунке. Надписи в ячейках используются для пояснений.

Рис. 2.3. Фрагмент оформленной таблицы

75

2.«Быстрое» программирование

4.Выделите блок B2:D5 и с помощью Мастера Диаграмм постройте пузырьковую диаграмму. Для первого ряда используются данные B2:D2, а для второго ряда — B3:D3.

5.Используя приемы работы с диаграммой, откройте окно «Формат оси» для оси Y и установите максимальное и минимальное значение оси соответственно 6 и –6. Уберите галочки «Авто» для этих опций. То же самое проделайте для оси Х.

6.Если Вы сейчас будете менять значение параметра в ячейке А2, то будут меняться координаты Луны и соответственно ее положение на диаграмме. Осталось автоматизировать этот процесс. Составим процедуру, в которой параметр t будем менять от 0 до максимального значения.

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

Private Sub CommandButton1_Click()

For t = 0 To Cells(4, 5) Step 0.1

Cells(2, 1) = t

DoEvents

Next

End Sub

8. Запустите программу, и убедитесь в ее работоспособности. Число оборотов можно менять через ячейку Е2.

Данное упражнение сопровождается файлом «Земля-Луна.xls»

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

Âтом же файле, на Листе2 Вы можете посмотреть как достаточно просто можно создать (схематическое) изображение секундомера.

Создание собственного меню

Вполне возможно, что при создании проекта появится желание создать вместо стандартного меню Excel или Word свое собственное. Сейчас мы расскажем как это делается.

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

76

Создание собственного меню

Для работы с элементами меню используются объекты CommandBar и CommandBarControl. Первый объект — это хорошо знакомая Вам панель инструментов (полоска с кнопками вверху или внизу экрана) или панель меню (там где написано «Файл», «Правка» и т. д.) а второй объект — это те самые кнопки на которых находятся рисунки или надписи. Эти объекты объединяются в коллекции соответственно CommandBars и CommandBarControls. Сама по себе панель меню или инструментов CommandBar является только носителем кнопок и не выполняет никаких дополнительных функций, поэтому становится понятным, что когда Вы захотите создать свое меню с подписями или картинками на кнопках, необходимо начать с создания панели меню, а потом уже на нее добавлять различные элементы. Кроме того, необходимо учи- тывать тот фактор, что любое приложение (Word или Excel) содержит набор стандартных панелей инструментов и это входит в коллекцию CommandBars приложения.

Основные свойства коллекции представлены в таблице 13.

Таблица 13

Свойства коллекции CommandBars — панели инструментов

ActiveMenuBar

Возвращает текущую панель инструментов

 

 

DisplayTooltips

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

 

элемента управления, помещенного на панель

 

инструментов.

 

 

Count

Число объектов в коллекции

 

 

 

 

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

Private Sub CommandButton1_Click()

a = MsgBox(CommandBars.ActiveMenuBar.Name)

b = MsgBox(CommandBars.Count)

For i = 1 To 80

Cells(i, 2) = CommandBars(i).Name

Next

End Sub

77

2. «Быстрое» программирование

Для добавления собственной полоски меню с целью размещения там кнопок, необходимо использовать метод Add. Синтаксис метода

Add (Name, Position, MenuBar, Temporary).

Вместо Name нужно указать имя этой полоски. В дальнейшем это имя используется для указания требуемой строки меню в программе VBA

После слова Position необходимо указать, в какой части окна будет располагаться эта полоска. Укажем 4 основные постоянные MsoBarLeft, MsoBarRight, MsoBarTop, MsoBarBotton для левого, правого, верхнего и нижнего расположения.

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

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

Познакомьтесь с примером использования синтаксиса.

Set cMain = CommandBars.Add(«Psyh», Position:=msoBarTop,

MenuBar:=True, Temporary:=True)

Отмечаем, что назначенное имя для меню — Psyh, но одновременно произошло объявление нового «нестандартного» объекта для программы. Поэтому в коде появились элементы — Set cMain. Программное имя объекта cMain

Для каждой конкретной стандартной или вновь созданной панели инструментов или меню (объект CommandBar). существуют основные свойства: Controls — которое возвращает коллекцию элементов управления размещенных на данной панели, Visible — определяет видимость объектов, Enabled —определяет возможность доступа к строкам меню. Из методов приводим один — Delete —удаление объекта и исключение его из состава коллекции.

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

78

 

Создание собственного меню

 

 

 

Òàáë 5.8.

 

 

Count

Число объектов в составе коллекции

 

 

TooltipText

Текст всплывающей подсказки, связанный с элементом

 

 

Enable

Разрешение реагировать на действия пользователя

 

 

 

 

Для добавления элемента управления (проще говоря — кнопки) в панельную строку используется метод Add. Полный синтаксис данного метода выглядит следующим образом:

CommandBarControlObject = CommandBarControlsObject.Add

(Type, Id, Parameter, Before, Temporary).

Мы отметим самые важные элементы. С левой стороны от знака = должно с обязательным словом Set должно стоять программное имя кнопки. Вместо CommandBarControlsObject нужно указать имя панели, где будет располагаться кнопка. Обратите внимание на то, что каждый из этих параметров является необязательным, поэтому требуется при задании аргумента в программе указывать его имя. Посмотрите на упрощенный пример, в котором кнопка с именем But1 будет располагаться в панели с именем cMain.

Set But1 = cMain.Controls.Add(Type:=msoControlButton)

Значение параметра Туре задает создание либо объекта CommandBarButton, ëèáî CommandBarPopup.. Если элемент управления строки меню выполняет действие в ответ на щелчок по нему, то используется объект CommandBarButton. Если же элемент управления при щелчке должен раскрыть вложенное меню, то применяют объект CommandBarPopup.Ниже перечислены соответствующие этим объетам значения параметра Туре.

CoramandBarButton — msoControlButton

CommandBarPopup — msoContro1Popup

Следующий шаг после создания кнопки на панели — это ее программирование. При этом необходимо определить значения следующие свойств и CommandBarButton

Style — Внешний вид кнопки

Enabled — Разрешить доступ к кнопке

OnAction — Задать выполняемые в ответ на щелчок действия

79

2. «Быстрое» программирование

Для внешнего вида кнопки являются:

Константа msoButtonAutomatic. Кнопка не содержит текста и рисунка.

Константа msoButtonlcon. На кнопке выводится рисунок. В этом случае необходимо также задать значение свойства Icon.

Константа msoButtonCaption. На кнопке выводится текст. В этом случае необходимо также задать значение свойства Caption.

Константа msoButtonlconandCaption. На кнопке выводится текст и рисунок. В этом случае необходимо также задать значения свойств Icon и Caption.

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

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

Посмотрите, как надо составить код, если на кнопке с программным именем But1 необходимо создать надпись «Итоги(1)» и при нажатии на эту кнопку должна запускаться процедура с именем itog1.

But31.Style = msoButtonCaption

But31.Caption = ''Итоги(1)''

But31.OnAction = ''itog1''

Предлагаем Вашему вниманию пример (файл «Работа с меню.xls»), в котором показано создание меню.

Но прежде, чем Вы будете использовать этот файл, необходимо учитывать следующее — коды VBA могут содержать команды изменения меню в самой электронной таблице, и если проект вызывается из приложения, то может возникнуть конфликт, связанный с проблемой перестройки меню. Чтобы избежать этого конфликта, проект (или файл) необходимо открывать не через приложение, а напрямую (двойной щелчок по имени файла). Кроме того, несмотря на то, что в проекте есть команды, восстанавливающие стандартное меню, Вы можете обнаружить, что при открытии приложения Excel после работы с проектом исчезли некоторые элементы окна. Эта

80