В обычном модуле создайте процедуру для форматирования вашего номера в виде текста и проверки его в требуемом диапазоне:
Public Sub TestNumber(Target As Range)
Dim FormattedNumber As String
'Return formatted "text" version of value.
FormattedNumber = Format(Target, "0000")
'Assume the value is correct and set the cell to "valid" colour.
Target.Interior.Color = RGB(255, 255, 204)
'Validate the value - check it's length, that it's a number
'and falls with the specified ranges.
If Len(FormattedNumber) = 4 And IsNumeric(Val(FormattedNumber)) Then
If Val(Left(FormattedNumber, 2)) < 0 Or Val(Left(FormattedNumber, 2)) > 23 Or _
Val(Right(FormattedNumber, 2)) < 0 Or Val(Right(FormattedNumber, 2)) > 59 Then
Target.Interior.Color = RGB(255, 0, 0)
Else
'Remove if you don't want to reformat the number.
Target.Value = Format(FormattedNumber, "00:00")
End If
Else
Target.Interior.Color = RGB(255, 0, 0)
End If
End Sub
На каждом листе, который вы хотите проверить числа в столбце 1, добавьте этот код:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rCell As Range
If Not Intersect(Target, Columns(1)) Is Nothing Then
Application.EnableEvents = False
For Each rCell In Target
TestNumber rCell
Next rCell
Application.EnableEvents = True
End If
End Sub
Строки Application.EnableEvents
требуются только в том случае, если вы переформатируете введенный номер в конце процедуры TestNumber
.Если не добавить команду, событие Change
запускается во второй раз с переформатированным числом - что даст неверные результаты, прежде чем снова выстрелить и в конечном итоге вернуть 00:00
.
Редактировать:
Обновили событие Change
, чтобы оно работало, если было изменено более одной ячейки (если вставлен диапазон чисел) и изменилось AND
на OR
в процедуре TestNumber
(ранее принималось 6000 ).
Отредактируйте еще раз:
Если вы хотите проверитьпри вводе числа удалите переменную FormattedNumber
, замените ее на Target
и отформатируйте столбец как текст, чтобы не потерять начальный 0.