Worksheet_SelectionChange多选单元格触发Type Mismatch错误求助
错误根因
- 当选中多个单元格触发
Worksheet_SelectionChange事件时,参数Target代表的是多单元格组成的区域对象,此时直接读取Target.Value会返回一个二维数组,将数组与字符串"T"做等值比较必然触发类型不匹配错误。 - 多单元格场景下直接读取
Target.Row仅会返回区域首行的行号,会导致后续定位AJ列单元格的逻辑出错。 - 原代码未做事件防递归处理,后续执行
Range("AJ" & ThisRow).Select时会再次触发SelectionChange事件,轻则重复执行宏,重则触发栈溢出报错。
修复后代码
以下代码兼容选中多单元格的场景,同时添加了事件防递归、无关区域过滤逻辑:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim processRange As Range, cell As Range ' 仅处理选中区域与第36列的交集,跳过无关列 Set processRange = Intersect(Target, Me.Columns(36)) If Not processRange Is Nothing Then ' 临时关闭事件,防止后续选中单元格操作递归触发本事件 Application.EnableEvents = False For Each cell In processRange ' 逐个判断单元格值,避免多单元格Value为数组的类型错误 If VBA.Trim(cell.Value) = "T" Then ' 选中对应行AJ列单元格 Me.Range("AJ" & cell.Row).Select ' 调用邮件宏 Call mail_outlook ' 若仅需处理第一个匹配值即可终止,保留Exit For;需处理所有匹配值则删除该行 Exit For End If Next ' 恢复事件开关 Application.EnableEvents = True End If End Sub
提示:如果你的实际需求是「第36列单元格被修改为"T"时触发逻辑」,而非选中单元格时触发,建议将事件替换为
Worksheet_Change,上述代码逻辑可直接复用,能避免误点已存"T"的单元格就重复调用发件宏的问题。
内容的提问来源于stack exchange,提问作者WWL
相关产品推荐
相关产品推荐

