我正在编写“自定义”搜索宏,以便用户可以在工作表中快速找到对应项目的最新日期,该工作表中包含不同项目的通讯标题(电子邮件,信件,便笺等)。

该工作表有几列,感兴趣的列是列出日期的B:B和列出通信的F:F

想法是用户通过InputBox输入关键字,宏检查F:F与该关键字的通信,并检查B:B该通信是否具有该特定关键字的最新日期。搜索继续进行,直到找到一个为止。输出为带有标题和相应日期的MsgBox

除了找到最新日期的条件外,其他所有东西都起作用,(Evaluate("MAX(IF)"))给我一个不匹配错误。

我也尝试过WorksheetFunction.MaxWorksheetFunction.Subtotal,但是它们没有提供最新日期。

编辑:非常感谢您的编辑建议

Sub Proj_Find()

    Dim ProjName As Range
    Dim UserInput As String
    Dim LatestDate As Double

    UserInput = InputBox(Prompt:="Give the keyword for the searched project" & vbCrLf & "Entrez un mot clé pour le projet recherché", Title:="Latest Date Search", Default:=DefaultInputString)
    Set ProjName = Cells.Find(what:=UserInput, LookIn:=xlValues, lookAt:=xlPart)

    If Not ProjName Is Nothing Then
        LatestDate = Evaluate("MAX(IF(" & ProjName & " <>"",B3:B1000))")
        MsgBox "The last communication is '" & ProjName.Value & "' - dating " & ProjName.Offset(0, -4)
    Else
        MsgBox "Project not found         " & vbCrLf & "Projet non trouvé"
    End If

End Sub

最佳答案

LatestDate = Evaluate("MAX(IF(" & ProjName & " <>"",B3:B1000))")



ProjNameRange对象;因此,& ProjName &串联是隐式地Let将对象强制为String。明确说明:

LatestDate = Evaluate("MAX(IF(" & ProjName.Value & " <>"",B3:B1000))")


该公式会产生Error 2029,即#NAME!工作表错误-由于返回的Variant/Error不能被强制转换为Double,您会遇到类型不匹配的情况:

Dim LatestDate As Double
LatestDate = CVErr(xlErrName) ' type mismatch


#NAME!错误是因为ProjName.Value没有用引号引起来,因此Excel calc引擎将其视为命名范围,但找不到它。

=MAX(IF(SomeName<>"",B3:B1000))
        ^^^^^^^^ needs quotes!


解决方案是as Slai suggests,将ProjName[.Value]用双引号引起来,并对其进行正确的转义(即,将它们加倍)。

10-06 06:00