You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA自定义搜索:Evaluate(MAX(IF))触发类型不匹配错误

解决VBA宏获取项目最新通信日期的问题

我来帮你搞定这个获取最新日期的问题!你的宏逻辑思路是对的,但在匹配范围判断和最新日期获取的公式构造上出了问题,导致类型不匹配错误。咱们一步步来修正:

问题分析

  1. 你用Cells.Find只找到了第一个匹配关键词的单元格ProjName,但后续的Evaluate公式错误地用这个单个单元格作为判断条件,而不是检查整个F列里所有包含关键词的记录。
  2. Evaluate("MAX(IF(" & ProjName & "<>"",B3:B1000))")的逻辑完全不对——这个公式是找B3:B1000中对应ProjName单元格非空的最大值,和你要找的「含关键词的记录的最新日期」不沾边。
  3. 就算公式逻辑对,直接把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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:58:27