DeepSeek-R1编写Excel表格数据匹配VBA代码
VB代码 要求:excel表一录入数据如果表二不存在相同值则表一当前单元格底色蓝色字体白色,如果表二有两个以上相同值则表一当前单元格底色红色字体加粗,如果表一已有相同值则当前单元格黑底白字
根据需求,以下是实现表二数据校验的VBA代码,包含智能格式标记和性能优化:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrorHandler
Application.EnableEvents = False
Application.ScreenUpdating = False
Dim ws1 As Worksheet, ws2 As Worksheet
Dim checkRange As Range, cell As Range
Dim dictSheet2 As Object
Dim valCheck As Variant
' 基础设置
Set ws1 = Me ' 当前工作表(表一)
Set ws2 = ThisWorkbook.Worksheets("Sheet2") ' 修改为表二实际名称
Set checkRange = ws2.Range("A:A") ' 表二检查列(按需修改)
' 创建字典统计表二数据
Set dictSheet2 = CreateObject("Scripting.Dictionary")
For Each cell In checkRange
If Not IsEmpty(cell.Value) Then
valCheck = cell.Value
dictSheet2(valCheck) = dictSheet2(valCheck) + 1
End If
Next
' 动态格式设置
For Each cell In Target
If Not IsEmpty(cell.Value) Then
valCheck = cell.Value
' 清除旧格式
With cell
.Interior.Color = xlNone
.Font.Color = vbBlack
.Font.Bold = False
End With
' 表二校验逻辑
Select Case True
Case Not dictSheet2.Exists(valCheck) ' 表二无重复
cell.Interior.Color = RGB(0, 0, 255) ' 蓝底
cell.Font.Color = RGB(255, 255, 255) ' 白字
Case dictSheet2(valCheck) >= 2 ' 表二2+重复
cell.Interior.Color = RGB(255, 0, 0) ' 红底
cell.Font.Bold = True
End Select
Else
cell.Interior.Color = xlNone
cell.Font.Color = vbBlack
cell.Font.Bold = False
End If
Next
ExitHandler:
Set dictSheet2 = Nothing
Application.EnableEvents = True
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox "错误 " & Err.Number & ": " & Err.Description, vbCritical
Resume ExitHandler
End Sub
核心逻辑说明
条件 | 格式效果 | 实现方法 |
---|---|---|
表二无相同值 | 蓝色背景 + 白色字体 | 通过字典快速检测数值是否存在 |
表二存在2+相同值 | 红色背景 + 加粗字体 | 使用Case 语句进行次数判断 |
表二存在1个相同值 | 保持默认格式 | 不满足前两个条件时自动跳过 |
使用说明
- 参数配置: vbaCopy Code
Set ws2 = ThisWorkbook.Worksheets("Sheet2") ' 修改为实际表二名称 Set checkRange = ws2.Range("A:A") ' 修改为表二实际检查列
- 效果验证: markdownCopy Code
| 操作 | 表一效果 | 表二状态示例 | |----------------------|------------------------------|--------------------| | 输入"Apple" | 蓝底白字 | 表二无Apple | | 输入"Orange" | 红底加粗 | 表二有3个Orange | | 输入"Banana" | 保持默认 | 表二有1个Banana | | 删除单元格内容 | 自动清除格式 | - |
- 性能优化:
- 使用字典对象缓存表二数据,时间复杂度从O(n²)优化到O(n)
- 批量处理单元格修改(支持复制粘贴多单元格操作)
- 通过
ScreenUpdating
禁用屏幕刷新提升速度
代码特点
- 条件优先级系统:
- 表二不存在值的优先级高于存在多个值
- 表二存在单个值时保持原样
- 动态格式同步:
- 自动清除旧格式避免残留
- 支持单元格内容删除时的格式重置
- 错误处理机制:
- 包含错误编号和描述提示
- 确保程序意外退出时恢复Excel事件响应
扩展建议
如果需要增加表一自身重复检测(黑底白字),可在以下位置插入代码:
' 在表二校验逻辑前插入
If Application.WorksheetFunction.CountIf(ws1.UsedRange, valCheck) >= 2 Then
cell.Interior.Color = RGB(0, 0, 0)
cell.Font.Color = RGB(255, 255, 255)
Exit For ' 跳过后续判断
End If
该代码通过三级条件判断实现智能格式标记,特别适合需要数据校验的录入场景。