使用VBA为表格数组不同重复值标色时出现Error 91如何解决
Error 91报错原因及替代实现方案
报错原因
Find参数继承问题:VBA的Find函数不会自动重置查找参数,会继承上一次调用(含手动在Excel界面使用查找功能)的LookIn、LookAt等参数设置。如果原代码未显式指定完整参数,比如默认查找范围是公式而非单元格值,就会匹配失败返回Nothing。- 公式返回错误值:如果单元格的公式输出为
#N/A、#DIV/0!等错误值,Find查找有效值时无法匹配到对应内容,也会返回Nothing。 - 匹配规则不匹配:比如公式返回的内容存在不可见特殊字符、数据类型不匹配(数值/字符串格式不一致),会导致
Find无法命中对应值。
原代码修复方案
在调用Find时显式指定所有查找参数,同时增加返回值非空判断,避免直接操作Nothing对象触发报错:
Set 查找结果 = 目标范围.Find(What:=查找值, _ LookIn:=xlValues, _ LookAt:=xlWhole, _ SearchOrder:=xlByRows, _ SearchDirection:=xlNext, _ MatchCase:=False, _ MatchByte:=False) If Not 查找结果 Is Nothing Then ' 原有后续操作逻辑 End If
替代实现方案(更稳定,适配公式生成值场景)
可以使用字典记录不同值对应的颜色,遍历范围直接标注,完全规避Find函数的不稳定问题,代码如下:
Sub 不同重复值标注不同颜色() Dim 处理范围 As Range, 单元格 As Range Dim 颜色字典 As Object Dim 当前值 As Variant Dim 颜色序号 As Integer ' 请修改为实际需要处理的工作表和单元格范围 Set 处理范围 = ThisWorkbook.Sheets("替换为你的工作表名").Range("A1:A100") Set 颜色字典 = CreateObject("Scripting.Dictionary") 颜色序号 = 3 ' 从颜色索引3开始,跳过黑白两色 Application.ScreenUpdating = False ' 关闭屏幕更新提升运行速度 For Each 单元格 In 处理范围 ' 自动跳过空单元格和公式返回错误值的单元格 If Not IsEmpty(单元格.Value) And Not IsError(单元格.Value) Then 当前值 = 单元格.Value ' 新出现的值分配新颜色 If Not 颜色字典.Exists(当前值) Then If 颜色序号 > 56 Then 颜色序号 = 3 ' 颜色索引超过上限就循环 颜色字典.Add 当前值, 颜色序号 颜色序号 = 颜色序号 + 1 End If ' 标注单元格背景色 单元格.Interior.ColorIndex = 颜色字典(当前值) End If Next 单元格 Application.ScreenUpdating = True Set 颜色字典 = Nothing Set 处理范围 = Nothing End Sub
内容的提问来源于stack exchange,提问作者Ratiasu
相关产品推荐
相关产品推荐

