返回类型为Excel的自定义Excel VBA函数

问题描述:

我有一个包含多个工作表的工作簿。除汇总表外,其他所有工作表都有一个连续单元格(列内)的动态范围,用于存储某些日期格式的值。我需要动态选择该范围并选择最大日期值。该函数应该返回该值。返回类型为Excel的自定义Excel VBA函数

这是我试图:

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 =”语句。

要进行调试,请将您的值分配给变量变量,然后在赋值后输出该变量的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

调试的输出在哪里?.....编辑:对不起,我的即时窗口隐藏在后面。所以这些值是0和双倍 – user1931485 2013-03-08 19:09:59

+0

如果我打印GetMSDate作为声明代替v作为Variant,它将打印12:00:00 AM和Date。我在想这意味着Max()函数没有按照我预期的那样进行评估。 – user1931485 2013-03-08 19:55:33

+0

我建议分解你的工作表函数,例如确保.address返回你想要的范围。你也可以在这些上使用debug.print。最终你会看到发生了什么。 – 2013-03-09 04:46:00