- •Глава 1. Взгляд на Excel 2007 и vba
- •Окно программы Microsoft Excel 2007
- •Режим конструктора и элементы ActiveX
- •Свойства элемента управления “Кнопка”
- •Элементы управления “Поле” и “Надпись”
- •Сохранение рабочих книг Microsoft Excel
- •Уровень безопасности
- •Процедура, выполняемая при открытии книги
- •Поле со списком и список
- •Изображение
- •Динамическое изменение цвета кнопки
- •Пример вывода информации о текущем времени
- •Полоса прокрутки
- •Динамическое перемещение кнопки
- •Разработка игры
- •Переключатели
- •Основные сведения по vba
- •Заключение по первой главе
Пример вывода информации о текущем времени
Перейдем теперь к следующей — уже более сложной разработке. Итак, на рабочем листе необходимо создать интерфейс, показанный на рис. 1.37.
Здесь обозначения Часы, Минуты и Секунды представляют элементы управления ”Надпись” и являются просто поясняющими подписями рядом с соответствующими текстовыми окнами, в которые выводится информация о времени. Этот вывод инициирует щелчок по кнопке Отобразить время. Фактически, таким образом, мы реализуем на рабочем листе вариант электронных часов.
Фрагмент Секундомер (это слово набрано просто в ячейке на листе) позволяет в тех же окнах реализовать функции секундомера. Работа секундомера запускается по кнопке Старт. В этом случае текстовое окно для отображения текущего часа очищается, а информация в окнах, отводимых для минут и секунд, начинает обновляться.
Если пользователю требуется остановить отсчет, то он должен щелкнуть по кнопке Стоп, после чего обновление времени останавливается.
В табл. 1.1 указаны имена и типы объектов, расположенных на рис. 1.37.
В качестве первого шага введем переменную Flag, которая нам понадобится для остановки обновления времени. Эта переменная должна быть известна как процедуре обработки щелчка по кнопке Старт, так и процедуре обработки щелчка по кнопке Стоп.
В редакторе VBA существует общая область, где можно описывать переменные (рис. 1.38), которые должны быть известны внутри нескольких процедур.
Строка программы в окне, представленном на рис. 1.38 означает следующее:
Dim — определить (это ключевое слово Visual Basic);
Flag — имя переменной;
As Integer — определение данной переменной как целой (значениями переменной могут быть только целые числа).
Рис. 1.37. Реализация часов и секундомера
Рис. 1.38. Определение переменной в общей области
Таким образом, мы определили переменную, которая должна быть известна всем процедурам на данном рабочем листе Excel. И если одна из процедур поменяет значение переменной Flag, то в другой процедуре это изменение можно увидеть. В дальнейшем мы этим воспользуемся для остановки обновления времени по щелчку по кнопке.
Таблица 1.1. Имена объектов на рис.1.37
Свойство Name |
Тип объекта |
Комментарий |
Th |
Текстовое окно |
Для вывода текущего часа |
Tm |
Текстовое окно |
Для вывода минут |
Ts |
Текстовое окно |
Для вывода секунд |
Vrema |
Кнопка |
Caption — Отобразить время |
Start |
Кнопка |
Caption — Старт |
StopSec |
Кнопка |
Caption — Стоп |
После такого вступительного комментария можно привести процедуру обработки щелчка по кнопке Отобразить время (листинг 1.18).
Листинг 1.18. Процедура, выполняемая по щелчку по кнопке Отобразить время
Private Sub Vrema_Click()
Flag = 0
While Flag = 0
Th.Text = Format(Now(), "hh")
Tm.Text = Format(Now(), "nn")
Ts.Text = Format(Now(), "ss")
DoEvents
Wend
End Sub
Теперь разберем строки этой процедуры.
Во–первых, здесь используется оператор цикла, который начинается со строки While Flag = 0 и заканчивается строкой Wend. После ключевого слова While располагается условие, и если оно выполняется, то выполняются все строки программы вплоть до Wend. Затем управление опять передается на строку While, и если условие вновь выполняется, то все повторяется. Если же условие не выполняется, то управление передается на первую строку после Wend.
В строке
Th.Text = Format(Now(), "hh")
используются несколько внутренних функций Visual Basic. Так функция Now() не требует входных параметров и просто выдает текущую дату и время. В свою очередь другая внутренняя функция Format позволяет задать определенный формат для выводимой информации. Если нам необходимо выделить только текущий час, то в качестве второго аргумента функции Format мы должны задать "hh". Соответственно в следующих двух строках из текущего времени выделяются минуты и секунды.
Далее по тексту располагается внутренняя процедура Visual Basic — DoEvents, которая позволяет переключаться из выполняемого программного кода на обработку других событий. В данном случае нам необходимо по щелчку по кнопке Стоп установить значение переменной Flag в 1, что реализуется в процедуре, приведенной на листинге 1.19.
Листинг 1.19. Процедура обработки щелчка по кнопке Стоп
Private Sub StopSec_Click()
Flag = 1
End Sub
Таким образом, мы обеспечили вывод текущего времени и его остановку. Что касается остановки, то она скорее требуется для секундомера. И теперь наша задача заключается в реализации его функциональности. На листинге 1.20 приведена процедура, которая выполняется по щелчку по кнопке Старт, что позволяет включить секундомер.
Листинг 1.20. Обработка щелчка по кнопке Старт
Private Sub Start_Click()
Th.Text = ""
Tm.Text = 0
Ts.Text = 0
Flag = 0
‘ Получение значения секунд
Sec = Format(Now(), "ss")
‘ В переменной Shet организуем счетчик
Shet = 0
While Flag = 0
Sec2 = Format(Now(), "ss")
If Sec <> Sec2 Then
‘ При изменении значения секунд
Shet = Shet + 1
Sec = Sec2
‘ Получение минут
ChetMins = Shet \ 60
‘ Выделение секунд
ChetSecs = Shet - ChetMins * 60
Tm.Text = ChetMins
Ts.Text = ChetSecs
End If
DoEvents
Wend
End Sub
Здесь мы использовали операцию целочисленного деления (\) для получения числа прошедших минут. Программа для работы секундомера готова и на рис. 1.39 показан результат ее работы.
Рис. 1.39. Пример работы секундомера
Познакомимся на практике в рамках данного примера со свойством, которое определяет доступ к элементам управления. Как мы уже знаем, у элементов управления имеется свойство Enabled . Когда для этого свойства установлено значение True, то доступ к данному элементу разрешен, а в противном случае (при значении False) доступ запрещен.
Изменим предыдущую разработку следующим образом.
В окне свойств для кнопок Старт и Отобразить время значение свойства Enabled установим True, а для кнопки Стоп в качестве значения этого свойство выберем False. В результате в начале работы для действий пользователя доступна кнопка, позволяющая отобразить время и кнопка секундомера, а кнопка Стоп недоступна. Теперь при щелчке по кнопке Старт доступ к кнопке Стоп должен разрешаться, кнопка Старт должна стать недоступной. На листинге 1.21 показана модифицированная процедура обработки щелчка по кнопке Стоп, которая затрагивает свойства двух кнопок, относящихся к секундомеру.
Листинг 1.21. Модифицированная процедура, выполняемая по щелчку по кнопке Стоп
Private Sub StopSec_Click()
Flag = 1
StopSec.Enabled = False
Start.Enabled = True
End Sub
Также требуются небольшие изменения в процедуре обработки щелчка по кнопке Старт. Ее текст представлен на листинге 1.22.
Листинг 1.22. Измененная процедура, выполняемая по щелчку по кнопке Старт
Private Sub Start_Click()
Th.Text = ""
Tm.Text = 0
Ts.Text = 0
Flag = 0
Sec = Format(Now(), "ss")
Shet = 0
StopSec.Enabled = True
Start.Enabled = False
While Flag = 0
Sec2 = Format(Now(), "ss")
If Sec <> Sec2 Then
Shet = Shet + 1
Sec = Sec2
ChetMins = Shet \ 60
ChetSecs = Shet - ChetMins * 60
Tm.Text = ChetMins
Ts.Text = ChetSecs
End If
DoEvents
Wend
End Sub
После выполненных изменений доступ к кнопкам в программе реализуется попеременно. Заметим, что по мере рассмотрения дальнейших разработок в книге, наблюдается общая тенденция на усложнение, поэтому рекомендуется каждый рассматриваемый пример прорабатывать детально.
Необходимые сведения по VBA будут приводиться здесь и в последующих главах в процессе рассмотрения разработок, поэтому явной необходимости в использовании дополнительной справочной информации нет. С другой стороны, было бы очень хорошо, если бы читатель познакомился с известными книгами по рассматриваемой теме [3–4].