Microsoft Excel

трюкиприёмырешения

Как в VBA сделать секундомер и вывести информацию о текущем времени

Перейдем теперь к следующей, уже более сложной разработке. Итак, на рабочем листе необходимо создать интерфейс, показанный на рис. 1.37. Здесь обозначения Часы, Минуты и Секунды представляют элементы управления «Надпись» и являются просто поясняющими надписями рядом с соответствующими текстовыми окнами, в которые выводится информация о времени. Вывод этих сведений инициирует щелчок на кнопке Отобразить время. Фактически таким образом мы реализуем на рабочем листе вариант электронных часов. Фрагмент Секундомер (это слово набрано просто в ячейке на листе) позволяет в тех же окнах реализовать функции секундомера. Работа секундомера запускается по нажатию кнопки Старт. В этом случае текстовое окно для отображения текущего часа очищается, а информация в окнах, отводимых для минут и секунд, начинает обновляться.

Если пользователю требуется остановить отсчет времени, то он должен щелкнуть на кнопке Стоп, после чего обновление времени останавливается. В табл. 1.1 указаны имена и тины объектов, расположенных на рис. 1.37.

Таблица 1.1. Имена объектов на рис.1.37

Свойство Name Тип объекта Комментарий
Th Текстовое окно Для вывода текущего часа
Tm Текстовое окно Для вывода минут
Ts Текстовое окно Для вывода секунд
Vrema Кнопка Caption — Отобразить время
Start Кнопка Caption — Старт
StopSec Кнопка Caption — Стоп

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

Рис. 1.37. Реализация часов и секундомера

Рис. 1.37. Реализация часов и секундомера

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

  • Dim определить (это ключевое слово Visual Basic);
  • Flag имя переменной;
  • As Integer определение данной переменной как целого числа (значениями переменной могут быть только целые числа).

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

Рис. 1.38. Определение переменной в общей области

Рис. 1.38. Определение переменной в общей области

После такого вступительного комментария можно привести процедуру обработки щелчка на кнопке Отобразить время (листинг 1.18).

1
2
3
4
5
6
7
8
9
10
' Листинг 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
2
3
4
' Листинг 1.19. Процедура обработки щелчка на кнопке Стоп
Private Sub StopSec_Click()
Flag = 1
End Sub

Таким образом, мы обеспечили вывод текущего времени и его остановку. Что касается остановки, то она скорее требуется для секундомера. И теперь наша задача заключается в реализации его функциональности. В листинге 1.20 приведена процедура, которая выполняется по щелчку на кнопке Старт, что позволяет включить секундомер.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
' Листинг 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. Пример работы секундомера

Рис. 1.39. Пример работы секундомера

Познакомимся на практике в рамках данного примера со свойством, которое определяет доступ к элементам управления. Как мы уже знаем, у элементов управления имеется свойство Enabled. Когда для этого свойства установлено значение True, доступ к данному элементу разрешен, а в противном случае (при значении False) доступ запрещен.

Изменим предыдущую разработку следующим образом. В окне свойств для кнопок Старт и Отобразить время значение свойства Enabled установим True, а для кнопки Стоп в качестве значения этого свойства выберем False. В результате в начале работы для действий пользователя доступна кнопка, позволяющая отобразить время, и кнопка секундомера, а кнопка Стоп недоступна. Теперь при щелчке на кнопке Старт доступ к кнопке Стоп должен разрешаться, кнопка Старт должна стать недоступной. В листинге 1.21 показана модифицированная процедура обработки щелчка па кнопке Стоп, которая затрагивает свойства двух кнопок, относящихся к секундомеру.

1
2
3
4
5
6
7
' Листинг 1.21. Модифицированная процедура, 
' выполняемая по щелчку на кнопке Стоп
Private Sub StopSec_Click()
Flag = 1
StopSec.Enabled = False
Start.Enabled = True
End Sub

Также требуются небольшие изменения в процедуре обработки щелчка на кнопке Старт. Ее текст представлен в листинге 1.22.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' Листинг 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 будут приводиться здесь и в последующих статьях в процессе рассмотрения разработок, поэтому явной необходимости в использовании дополнительной справочной информации нет. С другой стороны, было бы очень хорошо, если бы читатель познакомился с известными книгами по рассматриваемой теме.

Top