Проверка времени с использованием Excel VBA без формата даты / времени - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь убедиться, что пользователь инструмента вставляет только допустимые значения времени.Этот ввод должен быть числовым, а не в формате datetime.Я понимаю, что условное форматирование из внешнего интерфейса будет намного проще, но действие копирования и вставки перезапишет условное форматирование.Поэтому я решил написать для него макрос со следующей логикой: 1) Ввод должен быть в числовом формате '0000' 2) Первые 2 цифры должны быть меньше 23 И 3) Последние 2 цифры должныбыть меньше, чем 59

Это код, который у меня есть, но он не дает ожидаемого результата.Где ошибка или есть более эффективный способ ее устранения?

Worksheets("SheetA").Range("A2:A" & lastRow).NumberFormat = "0000"

For count = 2 To (lastRow + 1)
If IsEmpty(Worksheets("SheetA").Range("A" & count).Value) = True Then
    Worksheets("SheetA").Range("A" & count).Interior.Color = RGB(255, 255, 204)
Else
    If (Left(Worksheets("SheetA").Range("A" & count).Text, 2)) > 23 Or (Right(Worksheets("SheetA").Range("A" & count).Text, 2)) > 59 Then
        Worksheets("SheetA").Range("A" & count).Interior.Color = RGB(255, 0, 0)
    End If
End If
Next count 

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

В обычном модуле создайте процедуру для форматирования вашего номера в виде текста и проверки его в требуемом диапазоне:

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.

0 голосов
/ 25 октября 2018

Функция LEFT (рабочий лист / VBA)

Функция Excel LEFT может использоваться как в качестве функции рабочего листа, так и в качестве функции VBA.Функция LEFT возвращает указанное количество символов в текстовой строке, начиная с первого или самого левого символа.Используйте эту функцию для извлечения подстроки из левой части текстовой строки.Синтаксис: LEFT (text_string, char_numbers).Необходимо упомянуть аргумент text_string, который является текстовой строкой, из которой вы хотите извлечь указанное количество символов.Аргумент char_numbers является необязательным (при использовании в качестве функции рабочего листа), который указывает количество символов, извлекаемых из текстовой строки.Значение char_numbers должно быть равно или больше нуля;если она больше длины текстовой строки, функция LEFT вернет текстовую строку полностью;если опущено, по умолчанию используется значение 1. При использовании в качестве функции VBA необходимо указать оба аргумента, и если text_string содержит значение Null, функция также возвращает значение Null.

Если вы хотите получить свою цель, яесть альтернатива для вас: ваш ввод должен быть строкой после того, как вы управляете, вы конвертируете строку в число, если это время, если нет разговора.

для преобразования строки в примере числа:

Dim finalNumber As Integer
    If IsNumeric(myVar) Then
        finalNumber = CInt(myVar)
    Else
        finalNumber = 0
    End If

и ограничить ввод с помощью этого шага https://www.extendoffice.com/documents/excel/952-excel-cell-character-limit.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...