Excel·VBA单元格区域数据对比差异标记颜色

之前的一篇博客《Excel·VBA单元格重复值标记颜色》,是对重复的整行标记颜色

而本文是按行对比2个单元格区域的数据,并对有差异的区域(一个单元格区域有的,而另一个单元格区域没有的)标记颜色,且只要存在任意1个字符不同的,则标记颜色

单元格区域数据对比标色

代码写为自定义函数使用更为方便,并使用 Union 方法在每个单元格区域判断结束后统一标色

vbnet 复制代码
Function 单元格区域数据对比标色(ByVal rng1 As Range, ByVal rng2 As Range)
    '2个单元格区域数据按行对比,1个区域中有另1个区域中无则标色,每行中任意1个字符不同则标色
    Dim dict1 As Object, dict2 As Object, delimiter$, color_index&, i&, j&, temp$, k, color_rng As Range
    Set dict1 = CreateObject("scripting.dictionary"): delimiter = Chr(28)
    Set dict2 = CreateObject("scripting.dictionary"): color_index = 6  '标记黄色
    For i = 1 To rng1.Rows.Count  'rng1写入字典
        temp = ""
        For j = 1 To rng1.Columns.Count
            temp = temp & delimiter & rng1.Cells(i, j).Value
        Next
        If Not dict1.Exists(temp) Then
            Set dict1(temp) = rng1.Rows(i)
        Else
            Set dict1(temp) = Union(dict1(temp), rng1.Rows(i))
        End If
    Next
    For i = 1 To rng2.Rows.Count  'rng2写入字典
        temp = ""
        For j = 1 To rng2.Columns.Count
            temp = temp & delimiter & rng2.Cells(i, j).Value
        Next
        If Not dict2.Exists(temp) Then
            Set dict2(temp) = rng2.Rows(i)
        Else
            Set dict2(temp) = Union(dict2(temp), rng2.Rows(i))
        End If
    Next
    For Each k In dict1.keys  '遍历dict1,判断所有键在dict2中是否存在,不存在则写入标色区域color_rng
        If Not dict2.Exists(k) Then
            If color_rng Is Nothing Then
                Set color_rng = dict1(k)
            Else
                Set color_rng = Union(color_rng, dict1(k))
            End If
        End If
    Next
    'Union无法跨工作表使用,故先对color_rng标色1次
    If Not color_rng Is Nothing Then color_rng.Interior.ColorIndex = color_index: Set color_rng = Nothing
    For Each k In dict2.keys  '遍历dict2,判断所有键在dict1中是否存在
        If Not dict1.Exists(k) Then
            If color_rng Is Nothing Then
                Set color_rng = dict2(k)
            Else
                Set color_rng = Union(color_rng, dict2(k))
            End If
        End If
    Next
    If Not color_rng Is Nothing Then color_rng.Interior.ColorIndex = color_index: Set color_rng = Nothing
    Debug.Print "单元格区域数据对比标色,完成"
End Function

举例

vbnet 复制代码
Sub 测试()
    Dim rng1 As Range, rng2 As Range
    Set rng1 = Worksheets("表1").[a1].CurrentRegion
    Set rng2 = Worksheets("表2").[a1].CurrentRegion
    a = 单元格区域数据对比标色(rng1, rng2)
End Sub

对比差异并标记黄色

相关推荐
VBA63371 小时前
VBA代码加密解决方案目录及说明
vba
开开心心就好2 小时前
文件批量重命名工具简单好用支持规则改名
java·开发语言·b树·ocr·excel·音视频·kmeans
破z晓18 小时前
javascript 导出excel表
开发语言·javascript·excel
Am-Chestnuts1 天前
豆包多轮回答中的表格导出 Excel:编号、日期与长数字检查
excel
hPw0eKIqD2 天前
使用二次封装的Excel COM 组件操作Excel\WPS ET中的区域、行和列
excel·wps
冰心孤城2 天前
Excel: xls与xlsx格式转换排坑指南
java·前端·excel
金豆呀2 天前
WPS批量提取Word文档内容生成固定格式Excel表格
word·excel·wps
Access开发易登软件2 天前
Access 怎么做前后端分离?用 Web API 读写 SQL Server
前端·数据库·人工智能·microsoft·excel·access
红莲凪是3 天前
使用二次封装的Excel COM 组件操作Excel\WPS ET IExcelRange 高级应用
python·excel·wps
用户298698530143 天前
如何使用免费工具在线将 Excel 转换为 XML 格式
人工智能·后端·excel