
本文于2023年9月1日首发于本人同名公众号:Excel活学活用,更多文章案例请搜索关注!
内容提要
查找相同数字
大家好,我是冷水泡茶,前几天在论坛上看到一个网友的求助贴:
[求助]请教老师,用VBA或其他公式,查找全部相同数,谢谢!
他的数据是这样的:

他的要求是,查找B列数字是否全部存在于A列:

当时觉得没有什么难度,加之要做其他东西,就放在一边了。今天翻文件的时候又看到它,就打开处理了一下,我们一起来看一下过程:
基本思路
1、要检查B列的数字中每一个数字是否包含在A列中,我们可以把B列每个单元格的值进行分列,用Split函数把数字存到一个数组里。然后通过循环,逐一检查B列的数字是否存在于A列,这里有两种方法,一种是把A列也分列成数组,再通过循环查找;另一种是直接用InStr函数,查找B列每一个数字在A列字符串中的位置,如果位置大于0,则表示存在相同数字,否则表示不存在。
2、在循环过程中,如果没找到相同数字,那么就把这个数字存到字符串str中。
3、一行循环结束,把结果存到C列相应单元格里。
VBA代码
模块1,Check过程,检查相同数字。
Sub Check() Dim ws As Worksheet Dim data As Range Dim arr() As String Dim str As String Set ws = ThisWorkbook.Sheets("Sheet1") Set data = ws.Range("A1").Resize(ws.UsedRange.Rows.Count, 3) For i = 1 To data.Rows.Count str = "" If data.Cells(i, 1) <> "" Then arr = Split(data.Cells(i, 2), ",") data.Cells(i, 3) = "" For j = 0 To UBound(arr) If InStr("," & data.Cells(i, 1) & ",", "," & arr(j) & ",") = 0 Then str = str & arr(j) & "," End If Next If Len(str) > 0 Then str = Left(str, Len(str) - 1) data.Cells(i, 3) = str Else data.Cells(i, 3) = "有" End If End If Next MsgBox "Done"End Sub
代码解析:
(1)定义一些变量,工作表对象ws,Range对象,数组等。
(2)line7,设置数据区域为data这个Range对象,这里也可以是装入数组,我们今天就换一种方式,直接操作单元格区域。
(3)line8,开始循环区域data。
(4)line9,初始化str为空。
(5)line10,If语句判断第一列是否为空,避免空数据使程序出错。
(6)line11,把data区域第i行第2列数据分列后存到数组arr
(7)line12,先把第3列结果单元格清空,防止有前期数据。
(8)line13~17,循环数组arr,判断其元素是否存在于第一列单元格中。这里要注意一下,要给每个数字前后加上限定符,比如/1/,/11/这样的,如果不加限定符,数字1既存于1中,也存在是11中,结果就不对啦。如果没找到,就把数字连接到str字符串中。找到的话,就按兵不动。
(9)line18~23,判断一下str是否为空,这里我们用Len函数检查其长度。如果不为空,说明有遗漏数字,我们把str的值写入第三列单元格;如果为空,就把第三列单元格写为“有”。
(10)line26,Msgbox提示信息,加这一句主要原因是程序运行时间太短,都感觉不到,也不知它有没有运行,加上这句,可以知道程序是否运行了。
~~~~~~End~~~~~~
喜欢就点个赞、点在看、留个言、分享一下呗!感谢!