Excel VBA自定义搜索:Evaluate(MAX(IF))触发类型不匹配错误
解决VBA宏获取项目最新通信日期的问题
我来帮你搞定这个获取最新日期的问题!你的宏逻辑思路是对的,但在匹配范围判断和最新日期获取的公式构造上出了问题,导致类型不匹配错误。咱们一步步来修正:
问题分析
- 你用
Cells.Find只找到了第一个匹配关键词的单元格ProjName,但后续的Evaluate公式错误地用这个单个单元格作为判断条件,而不是检查整个F列里所有包含关键词的记录。 Evaluate("MAX(IF(" & ProjName & "<>"",B3:B1000))")的逻辑完全不对——这个公式是找B3:B1000中对应ProjName单元格非空的最大值,和你要找的「含关键词的记录的最新日期」不沾边。- 就算公式逻辑对,直接把
Evaluate返回的结果赋值给Double类型变量也可能出错,因为数组公式返回的是数组,需要处理。
修正方案
方案1:用WorksheetFunction.MaxIfs(Excel 2019及以后版本支持)
这是最简单的方法,MaxIfs可以直接根据多条件找最大值,完美适配你的需求:
Sub Proj_Find() Dim UserInput As String Dim LatestDate As Variant Dim MatchRange As Range Dim ResultCell As Range 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 MatchRange = Columns("F:F").Find(what:=UserInput, LookIn:=xlValues, lookAt:=xlPart) If MatchRange Is Nothing Then MsgBox "Project not found " & vbCrLf & "Projet non trouvé" Exit Sub End If ' 获取含关键词的记录中的最新日期 On Error Resume Next ' 防止没有匹配结果时出错 LatestDate = WorksheetFunction.MaxIfs(Columns("B:B"), Columns("F:F"), "*" & UserInput & "*") On Error GoTo 0 If IsEmpty(LatestDate) Then MsgBox "No valid dates found for this project" & vbCrLf & "Aucune date valide trouvée pour ce projet" Exit Sub End If ' 找到对应最新日期的通信标题(如果有多个同日期,取第一个) Set ResultCell = Columns("B:B").Find(what:=LatestDate, LookIn:=xlValues, lookAt:=xlWhole).Offset(0, 4) ' 展示结果,格式化日期更易读 MsgBox "The last communication is '" & ResultCell.Value & "' - dating " & Format(LatestDate, "yyyy-mm-dd") End Sub
方案2:兼容旧版本Excel(用数组公式+Evaluate)
如果你的Excel版本不支持MaxIfs,就用正确构造的数组公式来获取最大值:
Sub Proj_Find_OldExcel() Dim UserInput As String Dim LatestDate As Variant Dim MatchRange As Range Dim ResultCell As Range UserInput = InputBox(Prompt:="Give the keyword for the searched project" & vbCrLf & "Entrez un mot clé pour le projet recherché", _ Title:="Latest Date Search", Default:="") Set MatchRange = Columns("F:F").Find(what:=UserInput, LookIn:=xlValues, lookAt:=xlPart) If MatchRange Is Nothing Then MsgBox "Project not found " & vbCrLf & "Projet non trouvé" Exit Sub End If ' 构造数组公式:找到F列包含UserInput的所有行,取对应B列的最大值 LatestDate = Evaluate("MAX(IF(ISNUMBER(SEARCH(""" & UserInput & """,F:F)),B:F,""""))") If LatestDate = "" Then MsgBox "No valid dates found for this project" & vbCrLf & "Aucune date valide trouvée pour ce projet" Exit Sub End If Set ResultCell = Columns("B:B").Find(what:=LatestDate, LookIn:=xlValues, lookAt:=xlWhole).Offset(0, 4) MsgBox "The last communication is '" & ResultCell.Value & "' - dating " & Format(LatestDate, "yyyy-mm-dd") End Sub
关键修正点说明
- 用
*" & UserInput & "*"或者ISNUMBER(SEARCH(...))来实现「包含关键词」的匹配逻辑,和你原本用xlPart的需求一致。 - 获取到最新日期后,再反向查找对应的通信标题——因为第一个匹配的记录不一定是最新的,这也是原代码的核心问题之一。
- 增加了错误处理,避免没有有效日期结果时宏直接报错。
内容的提问来源于stack exchange,提问作者Draygo
相关产品推荐
相关产品推荐

