UDF не вызывается для строкового аргумента с числовым значением

#excel #vba

#excel #vba

Вопрос:

У меня есть UDF для проверки даты, введенной пользователем, и для возврата объекта коллекции, состоящего из логического поля, указывающего действительную дату или нет, и поля даты. UDF принимает строку, содержащую дату, введенную пользователем в качестве аргумента. UDF отлично работает, если пользователь вводит дату, содержащую некоторый текст, например, «01 января 2020 года»; «15-19 января» и т.д. Проблема возникает в тот момент, когда пользователь вводит дату во всех числовых, например, «01/01/2020»; «15-01-2019» и т.д. С помощью некоторого кода debug.print в блоке UDF я заметил, что UDF вообще не вызывается для числового значения даты, хотя он работает отлично и возвращает желаемую переменную коллекции для ввода даты с некоторым текстом в ней. Код довольно длинный, поэтому я предоставил только соответствующий раздел ниже.

 dim strDateInput as String
Dim colValidDate As Collection
Dim validDate As Boolean
...
Private Sub Worksheet_Change(ByVal Target As Range)
...
ElseIf Not Intersect(Target, Range("C:C")) Is Nothing And Target.Row > 3 Then 
    Selection.NumberFormat = "General"
    strDateInput = Target.Cells.Text
...
                validDate = False
                Set colValidDate = DateValidation(strDateInput)
                validDate = colValidDate.Item(1)
                If validDate = True Then
                    If colValidDate.Item(2) > Date Then   'User entered a future date
                        Cells(Target.Row, "C").ClearContents
                        Cells(Target.Row, "C").Select
                        Cells(Target.Row, "C").NumberFormat = "General"
                        MsgBox "Date can't be a future date.", vbCritical, "Warning"
                    Else 'User entered a valid date
                        Cells(Target.Row, "C").Value2 = colValidDate.Item(2)
                        Cells(Target.Row, "C").NumberFormat = "[$-F800]dddd, mmmm dd, yyyy"
                        With Range("D" amp; CStr(Target.Row)).Validation
                            .Delete
                            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
                                Formula1:="Purchase,SIP,Sale,Switch Out,Switch In,Div. Reinv."
                        End With
                        Cells(Target.Row, "D").Select
                    End If
                Else 'User entered an invalid date
                    Cells(Target.Row, "C").ClearContents
                    Cells(Target.Row, "C").Select
                    Cells(Target.Row, "C").NumberFormat = "General"
                    MsgBox "Invalid date. Enter a valid date in DD/MM/YYYY format.", vbCritical, "Warning"
                End If
   End Sub

...
*****UDF Block*****

Function DateValidation(ByVal strDateRecd As String) As Collection  

<Code validating strDateRecd and return Collection varibale> 
...
...
...
    End Function
 

При вводе числовой даты выдается сообщение «Ошибка времени выполнения ‘5’: недопустимый вызов процедуры или аргумент», а при нажатии кнопки «Отладка» выделяется надпись ниже, поскольку UDF не вызывался, следовательно, переменная коллекции не содержит никакого значения.

 validDate = colValidDate.Item(1)
 

в режиме отладки при наведении курсора на переменную «strDateInput» отображается числовая дата в кавычках, например «01/01/2020». Это ясно говорит о том, что переменная содержит текст, а не числовое значение. Таким образом, это не может быть случай несоответствия типа переменной при передаче аргумента. Я совершенно невежественен. Любая помощь будет высоко оценена.

Комментарии:

1. Попробуйте пройти через все, чтобы увидеть, где это на самом деле ошибка. Кнопка отладки покажет вам, что вызывает ошибку в текущей процедуре, но фактическая проблема возникает где-то в DateValidation

2. Обработка дат в виде строк всегда сопряжена с трудностями. Используйте базовый серийный номер даты и Date тип данных.

3. @Warcupine: Большое спасибо! Это была проблема с проверкой даты на деле. Я смог точно определить проблемный код и исправить его с помощью предложенного вами пошагового процесса. Теперь все в порядке.