
本文于2023年8月28日首发于本人同名其他平台,更多文章案例请搜索关注!
内容提要
InputBox选择区域
两个区域大小比较
两个区域单元格比较、标色
大家好,我是冷水泡茶,今天有位粉丝朋友留言咨询:怎么核对两组数据的不同?

他的数据表是这样的,分为三块,要求以第一块为基准,分别与下面两块数据进行比较,标出不同的单元格,在这个数据区域下面的区域中,对应填写相同或异常,并把异常数据标上黄底红字:

核对数据,对我们来说,那是经常有的事,但基本就是把两个区域比较一下:
1、如果是数字,我们可以用减法,在另一块空白区域,或者另一个工作表中相同位置,把两个区域的单元格相减,检查比较结果不等于0的,就是有差异。
2、如果是文本,我们可以用“=”的方法,得到“True”或者“False”的值,如果这样看得不是很清楚,我们可以再用一个IF函数,把TRUE变成0,False变成1,我们选中结果区域,如果状态栏汇总结果为0,则表明没有不同的单元格。
然而,有些人就是觉得VBA好,我一想,也行啊,我们可以选择两个区域,执行一段比较代码,把不同的单元格标上颜色,这样比较干净利落,不用多余的比较区域。代码不复杂,我们一起来看一下:

基本思路
1、通过InputBox,由用户自己选择两个区域,进行比较,要求这两个区域行列数据一致。
2、循环行、列,把两个区域对应行、列的单元格的值进行比较,如果不相等,则给其标色。
3、当然,也许有人希望一键比较,但由于数据放在一张表上,不太方便界定比较区域(不是不可以,就是有点烦,而且没有通用性),就设计成用户自行选择比较区域。
程序代码
1、模块1,CompareRanges过程,比较区域:
Sub CompareRanges() Dim range1 As Range Dim range2 As Range Dim range3 As Range Dim lastRow As Integer Dim lastCol As Integer On Error Resume Next Set range1 = Application.InputBox("选择第一个比较区域:", Type:=8) If range1 Is Nothing Then MsgBox "没有正确选择第一个比较区域!" Exit Sub End If lastRow = range1.Rows.Count lastCol = range1.Columns.Count Set range2 = Application.InputBox("选择第二个比较区域,可以选择左上第一个单元格:", Type:=8) If range2 Is Nothing Then MsgBox "没有正确选择第二个比较区域!" Exit Sub ElseIf range2.Rows.Count = 1 And range2.Columns.Count = 1 Then Set range2 = range2.Resize(lastRow, lastCol) ElseIf range1.Rows.Count <> range2.Rows.Count Or range1.Columns.Count <> range2.Columns.Count Then MsgBox "两个区域大小不同,不能比较!" Exit Sub End If Set range3 = Application.InputBox("选择结果区域,可以选择左上第一个单元格:", Type:=8) If range3 Is Nothing Then MsgBox "没有选择结果保存区域!" ElseIf range3.Rows.Count = 1 And range3.Columns.Count = 1 Then Set range3 = range3.Resize(lastRow, lastCol) range3.Clear range3.Font.Size = 9 ElseIf range1.Rows.Count <> range3.Rows.Count Or range1.Columns.Count <> range3.Columns.Count Then MsgBox "结果区域大小不同,不能比较!" Exit Sub Else range3.Clear range3.Font.Size = 9 End If range1.Interior.Color = xlNone range1.Font.Color = vbBlack range2.Interior.Color = xlNone range2.Font.Color = vbBlack For i = 1 To lastRow For j = 1 To lastCol Value1 = CStr(Format(range1.Cells(i, j).Value, "Standard")) Value2 = CStr(Format(range2.Cells(i, j).Value, "Standard")) If range3 Is Nothing Then If Value1 <> Value2 Then range1.Cells(i, j).Interior.Color = RGB(255, 250, 205) range2.Cells(i, j).Interior.Color = RGB(255, 255, 0) range2.Cells(i, j).Font.Color = vbRed End If Else If Value1 <> Value2 Then range1.Cells(i, j).Interior.Color = RGB(255, 250, 205) range2.Cells(i, j).Interior.Color = RGB(255, 250, 205) With range3 .Cells(i, j).Value = "异常" .Cells(i, j).Interior.Color = RGB(255, 255, 0) .Cells(i, j).Font.Color = vbRed End With Else range3.Cells(i, j).Value = "相同" End If End If Next NextEnd Sub
代码解析:
(1)定义3个Range对象。
(2)line8~12,选择输入第一个比较区域,使用Application.InputBox 方法,参数Type:=8,表示Range 对象形式的单元格引用。如果点取消则退出过程。
(3)line13~14,取得range1的行列数。
(4)line15~24,选择输入第二个比较区域,可以选择完整大小的区域,也可以点选区域左上一个单元格,比较区域根据range1的行列扩展。
(5)line25~38,选择输入结果保存区域,这步要谨慎,防止误操作把有用的数据给覆盖掉。
(6)line39~42,恢复range1,range2的字体与背景色。
(7)line43~67,循环整个区域,把对应两个区域的单元格值进行比较,这里把所有值都转成string。如果选择了结果保存区域,则把结果保存,如果没有选,则把两个比较区域对应的值不同的单元格标色。
2、其他过程:CmdCompareRanges,区域比较命令按钮:
Private Sub CmdCompareRanges_Click() Call CompareRangesEnd Sub
Tips
1、InputBox接收用户输入的方法。
2、区域扩展方法,resize。
3、单元格格式设置,背景色、字体等。
......
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留个言呗!分享一下更给力!感谢!