VBA实战技巧36:比较两组数据并高亮显示不匹配的字母或单词

excelperfect

引言:本文学习整理自chandoo.org的文章《Compare 2 sets of databy letter or word & highlight mismatches [vba]》,供有兴趣的朋友学习参考。

假设你正在查看下图1所示的2列表,并且想知道每行中的两组数据哪里不同。

图1

可以使用一个简单的VBA程序来比较这2个列表并突出显示不匹配的字母或单词。演示如下图2所示。

图2

当开始创建这样的宏时,第一步是定义基本算法(简单的逻辑步骤)。要比较两组数据,需要执行以下操作:

1.对于列1中的每个项目

2.获取列2中的对应项

3.如果它们不匹配

4.对于单词匹配

(1)对于第一个文本中的每个单词

(2)在第二个文本中获取相应的单词

(3)相比较

(4)如果不匹配,以红色突出显示

(5)重复其他词

5.对于字母匹配

(1)找到第一个不匹配的字母

(2)在第二个文本中突出显示自该点的所有字母

6.重复列1 中的下一项

7.完毕

一旦你写下了这个逻辑,就只需继续并在VBA代码中实现它。完整的代码如下:

Sub highlightDiffs()

Dim cell1 As Range, cell2 As Range, i As Long

Dim j As Long, k As Long, length As Long, word1 As String, word2 As String

resetColors

i = 1

For Each cell1 In Range('list1')

Set cell2 = Range('list2').Cells(i)

If Not cell1.Value2 = cell2.Value2 Then

'两个单元格都不匹配.找到第一个不匹配的单词/字符

length = Len(cell1.Value2)

If Range('wordMatch') Then

'匹配单词

j = 1

k = 1

Do

word1 = nextWord(cell1.Value2, j)

word2 = nextWord(cell2.Value2, k)

If Not word1 = word2 Then

With cell2.Characters(k, Len(word2)).Font

.Color = -16776961

End With

End If

j = j + Len(word1) + 1

k = k + Len(word2) + 1

Loop While j <= length

If k <= Len(cell2.Value2) Then

With cell2.Characters(k, Len(cell2.Value2) - k + 1).Font

.Color = -16776961

End With

End If

Else

'匹配字母

For j = 1 To length

If Not cell1.Characters(j,1).Text = cell2.Characters(j, 1).Text _

Then Exit For

Next j

If j <= Len(cell2.Value2) Then

With cell2.Characters(j, Len(cell2.Value2) - j + 1).Font

.Color = -16776961

End With

End If

End If

End If

i = i+ 1

Next cell1

End Sub

Sub resetColors()

'重置颜色

With Range('list2').Font

.ColorIndex = xlAutomatic

.TintAndShade = 0

End With

End Sub

Function nextWord(fromThis As String, startHere As Long) As String

'返回从start Here开始以分隔符 ., ?!'';结束的下一个单词

Dim i As Long

Dim delim As String

delim =' .,?!'''

startHere= IIf(delim Like '*' & Mid(fromThis, startHere, 1) &'*', startHere + 1, startHere)

For i =startHere To Len(fromThis)

If delim Like '*' & Mid(fromThis, i, 1) & '*' Then Exit For

Next i

nextWord= Trim(Mid(fromThis, startHere, i - startHere))

End Function

欢迎在下面留言,完善本文内容,让更多的人学到更完美的知识。

欢迎到知识星球:完美Excel社群,进行技术交流和提问,获取更多电子资料,并通过社群加入专门的微信讨论群,更方便交流。

(0)

相关推荐

  • 一文讲解Python基础变量类型

    对于Python,变量不需要预先声明,而是在创建时直接分配它,变量的类型取决于赋给变量的值.值得一提的是,一旦要创建一个变量,您需要为该变量赋值. 有一种"平民"的说法是,变量好比 ...

  • ​LeetCode刷题实战288:单词的唯一缩写

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  • 统计文本中单字母、双字母、三字母的频率

    统计文本中单字母、双字母、三字母的频率

  • 【老徐两分钟英语】字母O

    美国幽默大师James Thurber(詹姆斯·瑟伯)写有一部非常经典的儿童文学作品,名字叫做<神奇的O>(The Wonderful O),说的是一群海盗,占领了一座岛屿,然后禁止岛上的 ...

  • VBA 变量基础教程

    使用变量主要有3个步骤: 声明变量 指定变量的数据类型 给变量赋值 一.声明变量 Dim [变量名] As [数据类型] 二.给变量赋值 [变量名] = [数据] 注:一个值得注意的点是,[数据]的形 ...

  • VBA实战技巧24:调整图表数据标签的位置

    excelperfect 有时候,在Excel中绘制的图表会出现数据标签重叠的情形,不便于查看,如下图1所示. 图1 此时,可以手工拖动数据标签来进行位置调整,也可以使用VBA代码来自动调整. 首先, ...

  • VBA实战技巧27:根据颜色汇总单元格数据

    excelperfect 本文给出了一种根据单元格背景色汇总单元格数据的方法:使用VBA创建一个自定义函数来实现该目的. 我们希望这个函数工作的方式是,填充了颜色的单元格来表示额外的信息,例如代表诸如 ...

  • VBA实战技巧29:从一个工作表复制数据到另一个工作表

    excelperfect 今天演示一个简单的例子,也是经常看到网友问的问题,将一个工作表中的数据复制到另一个工作表. 如下图1所示,有3个工作表,需要将工作表"新数据#1"和&qu ...

  • VBA实战技巧13: 同步多工作表指定区域的数据

    excelperfect 很多情形下,我们希望同时在几个工作表中输入同样的数据.我们知道,将工作表组合能够方便地实现数据的同时输入.然而,如果忘记解除工作表组合,则可能误输入不想在所有工作表中都输入的 ...

  • VBA实战技巧12: 仅显示组成SUMIFS函数的结果的数据

    excelperfect 下面的这段代码来自于TheSpreadsheetGuru.com,类似数据透视表中的双击功能,可只显示组成SUMIFS函数结果的数据.代码如下: Sub DetailForS ...

  • 两组数据告诉你,现在创业有多难?第一组是...

    第一组是2020年全国共注销企业1004.28万家,同比增长18.6%,是近十年注销数量最多的一年.企业注销意味着公司倒闭,有疫情的原因,但更多是创业环境和竞争带来的冲击,可以说,创业越来越难,用&q ...

  • 人口普查,我只关注这两组数据,关乎生态城及小镇的开发

    关乎生态城及小镇的开发 "大秦笔记"秦智勇 今日头条旅游领域创作者 中策院旅游分院副院长 中原茶旅小镇欢迎您 大数据是14.11亿人,主要集中在东部地区,其次是西部与中部,其实与大 ...

  • VBA实战技巧22:调整XY图表缩放比例以获取正确的宽高比

    excelperfect 目标:想要调整XY(散点图)图表,以使两个轴的单位坐标轴值具有相同的比例.也就是说,需要调整图1中的图表,以便成为如图2所示的正方形和圆形. 图1:开始时是椭圆形和长方形 图 ...

  • VBA实战技巧25:巧用文本框和列表框

    excelperfect 如下图1所示,在用户窗体界面上实际放置着一个文本框和一个列表框,当单击文本框右侧的下拉按钮时,会出现一个列表框,你可以从中选择数据项并将其输入到文本框中. 图1 也就是说,通 ...