Форма для ввода времени в формате «чч:мм» показана на рисунке 1. Открывается форма автоматически при активации на листе любой ячейки с форматом «чч:мм». Время вводится в форму нажатием четырех цифровых клавиш. После нажатия клавиши Enter время из формы копируется в активную ячейку, а сама форма скрывается. Для ввода удобнее использовать дополнительную клавиатуру. Форма ввода не открывается при активации ячеек с установленным в них форматом времени «13:30».
Пользовательская форма
Пользовательской форме (UserForm) присвоено имя UF_time_input. На форме размещены два текстовых поля (TextBox1 и TextBox2), надпись (Label1) и две кнопки (CommandButton1 и CommandButton2). Свойства (Properites) пользовательской формы и элементов (Controls) показаны на рисунках 2 и 3.
Подпрограмма инициализации, выполняемая после вызова пользовательской формы UF_time_input до ее появления на листе Excel:
Private Sub UserForm_Initialize()
Dim h As Integer 'часы
Dim m As Integer 'минуты
If Not IsEmpty(Selection) Then 'если в ячейке уже записано время
h = Hour(ActiveCell.Value) 'значение часов из активной ячейки в переменную
m = Minute(ActiveCell.Value) 'значение минут из активной ячейки в переменную
Else 'если ячейка пустая
h = 0 'в значение часов 0
m = 0 'в значение минут 0
End If
'Запись в текстовые поля часов и минут по две цифры
If h = 0 Then TextBox1.Text = "00"
If h > 0 And h < 10 Then TextBox1.Text = "0" & h 'если значение однозначное, то в текстовом окне слева к нему добавляется 0
If h > 9 Then TextBox1.Text = h 'если число двузначное
If m = 0 Then TextBox2.Text = "00"
If m > 0 And m < 10 Then TextBox2.Text = "0" & m 'если значение однозначное, то в текстовом окне слева к нему добавляется 0
If m > 9 Then TextBox2.Text = m 'если число двузначное
TextBox1.SetFocus 'активация текстового поля с часами
End Sub
TextBox1
Подпрограмма обработки нажатия клавиш, позволяющая вводить в TextBox1 только цифры:
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 'ввод в текстбокс только цифр
End Sub
Подпрограмма обработки изменения значения в TextBox1:
Private Sub TextBox1_Change()
If TextBox1.Text = "" Then Exit Sub 'предотвращает ошибку преобразования текста в число функцией CInt(TextBox1.Text)
If Len(TextBox1.Text) > 2 Then TextBox1.Text = Right(TextBox1.Text, 1) 'если введено число >23 и вводится третья цифра, то первые две удаляются
If Len(TextBox1.Text) = 2 And CInt(TextBox1.Text) < 24 Then ' если введено от 00 до 23
TextBox2.SetFocus ' активация текстового поля с минутами
End If
End Sub
TextBox2
Подпрограмма обработки нажатия клавиш, позволяющая вводить в TextBox1 только цифры:
Private Sub TextBox2_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii < 48 Or KeyAscii > 57 Then KeyAscii = 0 'ввод в текстбокс только
цифр
End Sub
Подпрограмма обработки изменения значения в TextBox1:
Private Sub TextBox2_Change()
If TextBox2.Text = "" Then Exit Sub 'предотвращает ошибку преобразования текста в число функциейCInt(TextBox1.Text)
If Len(TextBox2.Text) = 3 Then TextBox2.Text = Right(TextBox2.Text, 1) 'если введено число >59 и вводится третья цифра, то первые две удаляются
If Len(TextBox2.Text) = 2 And CInt(TextBox2.Text) < 60 Then ' если введено от 00 до 59
CommandButton1.SetFocus ' активация кнопки «Ввод»
End If
End Sub
Label1
Надпись (Label1) содержит символ «:», подпрограмм не имеет.
CommandButton1
Подпрограмма обработки нажатия кнопки «Ввод» (CommandButton1):
Private Sub CommandButton1_Click() 'обработка нажатия кнопки "Ввод"
If TextBox1.Text = "" Then TextBox1.SetFocus: Exit Sub 'если в TextBox1 пусто, то активируется TextBox1 и осуществляется выход из этой подпрограммы
If Len(TextBox1.Text) = 1 Then TextBox1.SetFocus: Exit Sub 'если в TextBox1 длина строки составляет 1 символ, то активируется TextBox1 и осуществляется выход из этой подпрограммы
If CInt(TextBox1.Text) > 23 Then TextBox1.SetFocus: Exit Sub 'если в TextBox1 выставлено значение больше 23, то активируется TextBox1 и осуществляется выход из этой подпрограммы
If TextBox2.Text = "" Then TextBox2.SetFocus: Exit Sub 'если в TextBox2 пусто, то активируется TextBox2 и осуществляется выход из этой подпрограммы
If Len(TextBox2.Text) = 1 Then TextBox2.SetFocus: Exit Sub 'если в TextBox2 длина строки составляет 1 символ, то активируется TextBox2 и осуществляется выход из этой подпрограммы
If CInt(TextBox2.Text) > 59 Then TextBox2.SetFocus: Exit Sub 'если в TextBox2 выставлено значение больше 59, то активируется TextBox2 и осуществляется выход из этой подпрограммы
Selection.Value = TimeSerial(CInt(TextBox1.Text), CInt(TextBox2.Text), 0) 'преобразует значения из текстбоксов во время
Unload Me 'скрыть форму ввода
End Sub
CommandButton2
Подпрограмма обработки нажатия кнопки «Ввод» (CommandButton2):
Private Sub CommandButton2_Click() 'нажатие кнопки "Отмена"
Unload Me 'скрыть форму ввода
End Sub
Для закрытия формы нажатием клавиши Esc в свойствах этой кнопки свойству Cancel присвоено значение TRUE.
Вызов формы ввода времени
Открывается форма автоматически при активации на листе любой ячейки с форматом «чч:мм»:
Форма ввода не открывается в ячейках с установленным форматом времени «13:30»:
Подпрограмма обработки события изменения выделения на листе находится в модуле листа:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Selection.Cells.Count > 1 Then Exit Sub 'если выделено больше одной ячейки, то выход
If Not Selection.NumberFormat = "hh:mm" Then Exit Sub 'если формат выделенной ячейки не время в формате «чч:мм»
UF_time_input.Show 'показ формы ввода времени
End Sub
Это все, о чем я хотел рассказать в этой статье. Книга с примером выложена на Яндекс.Диск.
Если статья вам понравилась, то лайки и подписка – лучшая благодарность. Если у вас есть замечания и дополнения, расскажите, пожалуйста, о них в комментариях. Отвечу на все заданные в комментариях вопросы.
КС: excel, таблица, время, макрос, vba, userform.