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. Для добавления к общему числу баллов берется максимальное значение, полученное за очередной ход.
Dim Ball As Integer, xod As Integer | В блоке General объявляем две переменные |
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, не прибегая к событиям, связанным со стандартными элементами управления.
Идея программы заключалась в создании секундомера. В качестве «источника» времени используются часы компьютера. В 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 = Timer - sstart | Если flag «разрешает», то есть имеет значение «Истина», то функция ttimer вычислит разницу между текущим временем и временем старта секундомера |
End Function | |
Public Sub sstop() | Процедура остановки секундомера. |
flag = False | Переменная flag получила значение Ложь и функция ttimer не «сработает» |
sstart = 0 | Произошел сброс секундомера. |
End Sub |
Работу секундомера будем наблюдать на отдельном листе. Причем, если пользователь щелкнет по ячейке со словом «start», то секундомер запустится, если по любой пустой ячейке, то на элементе управления Label появится время, прошедшее с момента старта. И для остановки секундомера достаточно выделить ячейку “Stop”. Посмотрите, какими инструкциями это обеспечивается.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) | Процойедура под стандартное собыие SelectionChange |
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”
Живая диаграмма
Наступила пора рассказать еще об одной замечательной возможности VBA – о «живых» диаграммах. Большинство пользователей знают, что в электронной таблице можно построить самые разные диаграммы. Оказывается, можно сделать так, что диаграммы и графики оживут. Давайте создадим простейшую модель вращения Луны вокруг Земли.
Упражнение 8
Откройте чистую рабочую книгу. Убедитесь, что Вы находитесь на Листе1. Занесите в ячейки таблицы данные в соответствии с таблицей, в которой указаны только необходимые элементыАдрес ячейки | Содержимое | |
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 | Максимальное значение параметра |
![]() |
Сравните, что получилось у Вас, с тем, что изображено на рисунке. Надписи в ячейках используются для пояснений. Выделите блок B2:D5 и с помощью Мастера Диаграмм постройте пузырьковую диаграмму. Для первого ряда используются данные B2:D2, а для второго ряда – B3:D3. Используя приемы работы с диаграммой, откройте окно «Формат оси» для оси Y и установите максимальное и минимальное значение оси соответственно 6 и -6. Уберите галочки «Авто» для этих опций. То же самое проделайте для оси Х. Если Вы сейчас будете менять значение параметра в ячейке А2, то будут меняться координаты Луны и соответственно ее положение на диаграмме. Осталось автоматизировать этот процесс. Составим процедуру, в которой параметр t будем менять от 0 до максимального значения. Создайте командную кнопку и в окне кодов VBA под событие Click для этой кнопки наберите код
Private Sub CommandButton1_Click()
For t = 0 To Cells(4, 5) Step 0.1
Cells(2, 1) = t
DoEvents
Next
End Sub Запустите программу, и убедитесь в ее работоспособности. Число оборотов можно менять через ячейку Е2.
Данное упражнение сопровождается файлом «Земля-Луна. xls»
В последнем примере в кодах появилась строчка DoEvents. Смысл этой инструкции в том, чтобы дать возможность приложению показать на диаграмме новое положение Луны.
В том же файле, на Листе2 Вы можете посмотреть как достаточно просто можно создать (схематическое) изображение секундомера.
А теперь задание - В этом же письме расположен файл dom1.xls в котором показано как точка, начав движение внутри площадки, ограниченной красной рамки прекращает свое движение в тот момент, когда она попадает в домик, обозначенный голубым прямоугольником. Коды этой программы раскрыты.
В файле dompar2.xls это движение выглядит несколько по другому. Но коды закрыты. Ваша задача – написать коды для этой программы. Сроки – до начала весенних каникул.
последний срок – 24 марта 23 час 59 мин
[1] Из-за технических причин строка кода в таблице может быть разбита на несколько. В программном коде это недопустимо, или используют специальные приемы.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |



