我正在编写“自定义”搜索宏,以便用户可以在工作表中快速找到对应项目的最新日期,该工作表中包含不同项目的通讯标题(电子邮件,信件,便笺等)。
该工作表有几列,感兴趣的列是列出日期的B:B
和列出通信的F:F
。
想法是用户通过InputBox输入关键字,宏检查F:F
与该关键字的通信,并检查B:B
该通信是否具有该特定关键字的最新日期。搜索继续进行,直到找到一个为止。输出为带有标题和相应日期的MsgBox
。
除了找到最新日期的条件外,其他所有东西都起作用,(Evaluate("MAX(IF)"))
给我一个不匹配错误。
我也尝试过WorksheetFunction.Max
和WorksheetFunction.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))")
ProjName
是Range
对象;因此,& 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]
用双引号引起来,并对其进行正确的转义(即,将它们加倍)。