Excel 未为具有数值的字符串参数调用UDF

Excel 未为具有数值的字符串参数调用UDF,excel,vba,Excel,Vba,我有一个自定义项来验证用户输入的日期,并返回一个集合对象,该集合对象由一个指示有效日期与否的布尔字段和一个日期字段组成。UDF将包含用户输入的日期的字符串作为参数。如果用户输入包含一些文本的日期,例如“2020年1月1日”,则UDF工作正常;“19年1月15日”等。当用户在所有数字中输入日期时,如“01/01/2020”;“15-01-2019”等。在UDF块中的一些debug.print代码的帮助下,我观察到UDF根本没有被调用为数字日期值,但它工作得非常好,并返回所需的集合变量,用于日期输入

我有一个自定义项来验证用户输入的日期,并返回一个集合对象,该集合对象由一个指示有效日期与否的布尔字段和一个日期字段组成。UDF将包含用户输入的日期的字符串作为参数。如果用户输入包含一些文本的日期,例如“2020年1月1日”,则UDF工作正常;“19年1月15日”等。当用户在所有数字中输入日期时,如“01/01/2020”;“15-01-2019”等。在UDF块中的一些debug.print代码的帮助下,我观察到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" & 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

在调试模式下,将光标放在“strDateInput”变量上时,它会在引号内显示数字日期,如“01/01/2020”。这清楚地表明变量包含文本而不是数字。因此,传递参数时不能出现变量类型不匹配的情况。我完全不懂。任何帮助都将不胜感激。

试着一步一步地检查一下,看看到底哪里出错了。“调试”按钮将显示当前过程中的错误,但实际问题发生在
DateValidation
处理日期时的某个地方,因为字符串总是充满了问题。使用基础日期序列号和数据类型。@Warcupine:非常感谢!这实际上是一个日期验证的问题。我已经能够找出问题代码,并通过您建议的逐步过程进行修正。一切都好了。
validDate = colValidDate.Item(1)