#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: Большое спасибо! Это была проблема с проверкой даты на деле. Я смог точно определить проблемный код и исправить его с помощью предложенного вами пошагового процесса. Теперь все в порядке.