【问题标题】:Custom Excel VBA Function with return type as Date返回类型为日期的自定义 Excel VBA 函数
【发布时间】:2015-03-31 00:57:55
【问题描述】:

我有一个包含多张工作表的工作簿。除摘要表外,所有其他表都有一个动态范围的连续单元格(在一列内),这些单元格存储了一些日期格式的值。我需要动态选择该范围并选择最大日期值。函数应该返回该值。

这是我正在尝试的:

Function GetMSDate(Counter As Integer, DesignCtrs() As String, NumOfVendors() As Long, 
          MSDesc() As String, PlanOrActual As String) As Date
    GetMSDate = Application.Max(ThisWorkbook.Worksheets(Counter + 1).Range("A:A")
            .Find(PlanOrActual, SearchOrder:=xlByColumns, searchDirection:=xlNext)
            .EntireRow
            .Find(MSDesc(1), SearchOrder:=xlByColumns, searchDirection:=xlNext)
            .Offset(1, 0).Address & ":" & _
            ThisWorkbook.Worksheets(Counter + 1).Range("A:A")
            .Find(PlanOrActual, SearchOrder:=xlByColumns, searchDirection:=xlNext)
            .EntireRow
            .Find(MSDesc(1), SearchOrder:=xlByColumns, searchDirection:=xlNext)
            .Offset(NumOfVendors(Counter) + 1, 0).Address)
    MsgBox GetMSDate
End Function

我的意图是为Application.Max() 参数定义动态构造的范围。这样做时,找到范围锚,我选择了正确的工作表(Counter+1 允许正确);然后在第一列中找到一个特定的“预定义”字符串;选择找到的单元格的整行并在该范围内找到另一个预定义的字符串;然后将范围定义为从该锚单元下方的单元到由以下定义的偏移量:NumOfVendors(Counter)+1

在上面运行时,它给了我:

“GetMSDate =”语句中的类型不匹配错误。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    要进行调试,请将您的值分配给一个变体变量,然后在分配后输出该变量的 typename()。它应该告诉你为什么它不接受日期。

    Function GetMSDate(Counter As Integer, DesignCtrs() As String, NumOfVendors() As Long, MSDesc() As String, PlanOrActual As String) As Date
        Dim v as Variant
    
        v = Application.Max(ThisWorkbook.Worksheets(Counter +
            1).Range("A:A").Find(PlanOrActual, SearchOrder:=xlByColumns,
            searchDirection:=xlNext).EntireRow.Find(MSDesc(1), SearchOrder:=xlByColumns,
            searchDirection:=xlNext).Offset(1, 0).Address & ":" & _
        ThisWorkbook.Worksheets(Counter + 1).Range("A:A").Find(PlanOrActual,
            SearchOrder:=xlByColumns, searchDirection:=xlNext).EntireRow.Find(MSDesc(1),
            SearchOrder:=xlByColumns, searchDirection:=xlNext).Offset(NumOfVendors(Counter)
            + 1, 0).Address)
        debug.print v
        debug.print TypeName(v)
        stop
        MsgBox GetMSDate
    End Function
    

    【讨论】:

    • 调试的输出去哪里了?..... 编辑:对不起,我的即时窗口隐藏在后面。所以值是 0 和 double
    • 如果我打印 GetMSDate 作为声明代替 v 作为 Variant,它会打印 12:00:00 AM 和日期。我在想这意味着 Max() 函数没有像我期望的那样进行评估。
    • 我建议拆分您的工作表函数,例如确保 .address 返回您想要的范围。您也可以在这些上使用 debug.print。最终你会看到发生了什么。
    猜你喜欢
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-06
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多