紧急求助!!EXCEL中怎么循环比较身份证?

时间:2022-01-16 20:31:40
各位朋友,我真是紧急求助,平常不太用EXCEL的函数、宏等功能。现在碰到一个棘手的问题。
是这样的:
一个EXCEL文件
sheet1:
编号 姓名 身份证     标记
1   张三  362301...
2   李四  362301...
....

sheet2:
编号 姓名 身份证
1  王五   362301...
2  刘大   362301...
....
两张表,想比对2张表中的身份证,如果身份证相同,则在Sheet1里的标记栏作个标记。因为有9000多号人,所以要循环,一一比对。可我不会写啊。。。。怎么办?求求各位大哥大侠了,真是急用!!!!

16 个解决方案

#1


怎么没有人啊,急死人了。

#2


使用VLOOKUP函数!

#3


使用VLookup函数虽然可以,但是我们知道,对于超过了15位长度的情况下,直接使用VLookup是不能得到正确结果的。

比如362330123456789123和362330123456789134会被认为是1个结果。

因此楼上的答案不是很合理。

========================================

这里我建议使用CountIf。

把身份证拆成2个部分,假设为18位长度:取左边的14位为1个条件,右边的14位为第二个条件。
(由于身份证是唯一的,所以按照上面的方法拆成2个部分后,组合起来还是唯一的)

然后进行多条件查询,如果CountIf的结果>0,那么代表找到了相同的身份证,否则就是没有找到。


假设身份证被分别拆到相应表的D、E两列,在标记列(加入为F列)输入公式:

=COUNT(IF((Sheet2!$D$2:$D$10000=$D2)*(Sheet2!$E$2:$E$10000=$E2),$A$2:$A$10000))

输入后,同时按下Shift、Ctrl、Enter这3个键以结束输入(千万不要只敲回车键)

完成后,在编辑栏看到的效果如下:

{=COUNT(IF((Sheet2!$D$2:$D$10000=$D2)*(Sheet2!$E$2:$E$10000=$E2),$A$2:$A$10000))}

把该公式复制到F列相应的其他单元格。

如果找到了,那么结果>0,没有找到,那么结果=0

对于得到的结果,既可以使用筛选得到需要的列表,也可以在条件格式中进一步设置,用颜色来更加显眼的标记出来。

#4


方法:

在SQLServer或Accesss中建两张表,分别对应sheet1 sheet2,假设表名为T1,T2

再将sheet1,sheet2的数据导入到T1,T2中(怎么倒入这里就不说了)

再在SQLServer或Access查询分析器中执行如下语句:

select T1.A,T1.B, T1.C T2.A from T1,T2
where T1.A = T2.A

以上语句自己理解意图:A就是你的身份证,其它。。。

结果就是你想要的了,再导出就可以了,
这个方法老用,又快又准。只是在倒出导入的时候不要发生错误就行了

#5


To:eNeter() 

如果采用您的方案,导入不是很好的选择,呵呵。因为数据要更新的,不能每次都重新导入。


如果采用您的方案:

如果使用Access,那么应该使用的是链接表

如果使用SQL Server,那么应该使用链接服务器,或者直接使用OPENROWSET查询。

===========================================================

其实既然Excel本身就可以很简单的实现,就没有必要导入到那里去了,事实上,多了一个步骤后,没有进一步简化步骤,呵呵。(虽然这种SQL语句是个非常简单的过程)

===========================================================

另外:您的SQL语句写的并不符合楼主的需求:您使用的是对等连接,这样只能显示出两边都有的项目,不能显示出Sheet1中的所有项目,所以应该使用的是左连接才对。

#6


TO:Yiqun_Zhao

        1。我自己是用SQLServer的,导入导出(包括数据变更情况)觉得很方便。

        2。如果用你的方法的话,数据更新也得做好几步操作。

        3。且在Excel上写公式求结果不是很妥当得做法,Excel不熟悉的话容易误操作,

           导致数据的混乱,建议不动数据所在的Sheet表。

        4。速度的问题:如果数据多达几万条,甚至十几万条

          (Excel的Sheet表大小受限制)效果就不一样了。

        5。这次要把身份证相同的筛选出来,如果要把不同的晒出来呢,或者更复杂的,

           用SQL语句能实现的很多,而公式的话显得复杂。

        6。至于楼主想要的是什么,可以从语句的变更来取得。


           我想我最主要想表达的是用SQL来筛选数据的方法

         
           以上是我的拙见,见笑了
         

        

#7


楼上的小哥:您是不是只看了一部分就发表了这么多评论?麻烦您看全上面的内容。

当然,以下内容如果要看,也请看完整。

==================================================================

楼上的小哥,Excel2003和之前的版本一个Sheet里面十几万记录吗???您应该知道行数是多少吧。(Excel2007达到了100多万行,且和SQL Server2005一道提供了商业智能)

不是不可以使用您说的SQL Server、Access不好,我自己也经常用。

==================================================================

您知道吗?SQL Server直接就可以查询Excel表格,Access使用链接表就可以了。
[导入过程牵涉到字段的,如果楼主根本就不会Access,那么容易因为字段问题出状况]
所以这种情况下,链接表比导入要合适。SQL Server也是同样的道理。

==================================================================

在上面的回复中,我说不导入原因,而且还对比了链接表和导入的差异,不知道您为什么执著的认为导入比使用链接表更好呢?这种情况下,应该是使用链接表的。

导入的只是当前数据,修改了数据,还要重新导入。

链接表只要一次链接即可,相信您这点是肯定知道的。您也应该知道导入和链接表在Access里面都在一个菜单里面,这点您应该是知道的。

在SQL Server里面使用链接服务器或者直接使用OPENROWSET来做查询的原因,也是如此。

==================================================================

楼主遇到过如下症状吗?
Excel某个字段既有数字又有文本,那么您导入到SQL Server中后,您会发现什么状况,如果您清楚地话,那么您肯定知道。
所以我从来不对那些不熟悉SQL Server的人建议使用SQL Server来导入Excel数据。明白了吧。
Access这里也是同样的道理

==================================================================

我从来就不否认数据库的好处,事实上,很多地方使用数据库都可以带来很多好处,我本人的习惯就是偏向数据库的。只是对于很多Excel既存数据的处理,我们要对数据规范之后才可以导入到SQL Server中,这点对于只是习惯了Excel应用的人来说,不是一件容易的事情,虽然对于您和众多对于关系型数据库理念很清晰的人来说根本就不可能是问题的问题。

==================================================================

SQL语句,如果楼主对SQL语句很熟悉的话,在Excel里面就可以直接使用SQL语句作查询,恐怕这点,楼上的小哥还不知道吧。

==================================================================

任何处理方法都要符合实际需求的。

#8


//SQL语句,如果楼主对SQL语句很熟悉的话,在Excel里面就可以直接使用SQL语句作查询,
//恐怕这点,楼上的小哥还不知道吧。

楼下的小弟也不知道,能否指点一二?

#9


其实,用条件格式也可以

将sheet2的内容复制到sheet1 C列和D列,现在sheet1 B列和D列为身份证号码。

选中B列,单击格式,条件格式-=or(exact(b2,d:d))=true, 选择单元格底纹颜色就可以了。

#10


我试了Yiqun_Zhao(蓝帆·雨轩 MS MVP)关于VLOOKUP不能比对超过15位的说法,好像不对啊
结果显示EXCEL可以正确比对啊, 楼上ifspecter的方法我觉得可行

#11


To:kgbkiller(初来乍到)
========================================
好像不对,就是您不确信咯。
========================================

您输入一个18位的身份证,您自己尝试一下。

注意:后3位您不一样,但是前15位一样,您看看结果是怎样的?

要实践了才知道哦。

#12


补充:
如果我的说法有误的话,那么您可以前16位一样,后2位不一样.按照这个做法,您一定能够发现问题.

#13


To: ljc007
==============================================
举个示例吧:

假如Sheet1有如下数据:
型号          单价          金额
A01101         10          -100
B00215         20          200
A01012         30          300
A02424         40          400
B24523         50          500
D02457         60          600
G01102         70          700
F01103         80          800
X01104         90          900
A0101          91          910
A0102          92          920


我们希望在Sheet2中得到以A开头的数据,可以有如下:

在Sheet2中加入一个命令按钮,使用VBA写如下代码.

Sub GetFilterA()
   
    Range("A2:C100").ClearContents

    Set conn = CreateObject("adodb.connection")
    conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data    

    source=" & ThisWorkbook.FullName

    Sq1 = "select * from [Sheet1$] WHERE 型号 Like 'A%'"
[a600].End(xlUp).Offset(1, 0).CopyFromRecordset 

    conn.Execute(Sq1)

    conn.Close

    Set conn = Nothing

End Sub

将宏GetFilterA指定到命令按钮,单击该命令按钮,我们就可以在Sheet2中得到以A开头的结果了.

说白了,就是使用了ADO,呵呵.

#14


学习下

#15


將資料導到ACCESS中再用SQL語句去查.

#16


上面的辩论好精彩 
请加盟office专区群34543000
谢谢了

#1


怎么没有人啊,急死人了。

#2


使用VLOOKUP函数!

#3


使用VLookup函数虽然可以,但是我们知道,对于超过了15位长度的情况下,直接使用VLookup是不能得到正确结果的。

比如362330123456789123和362330123456789134会被认为是1个结果。

因此楼上的答案不是很合理。

========================================

这里我建议使用CountIf。

把身份证拆成2个部分,假设为18位长度:取左边的14位为1个条件,右边的14位为第二个条件。
(由于身份证是唯一的,所以按照上面的方法拆成2个部分后,组合起来还是唯一的)

然后进行多条件查询,如果CountIf的结果>0,那么代表找到了相同的身份证,否则就是没有找到。


假设身份证被分别拆到相应表的D、E两列,在标记列(加入为F列)输入公式:

=COUNT(IF((Sheet2!$D$2:$D$10000=$D2)*(Sheet2!$E$2:$E$10000=$E2),$A$2:$A$10000))

输入后,同时按下Shift、Ctrl、Enter这3个键以结束输入(千万不要只敲回车键)

完成后,在编辑栏看到的效果如下:

{=COUNT(IF((Sheet2!$D$2:$D$10000=$D2)*(Sheet2!$E$2:$E$10000=$E2),$A$2:$A$10000))}

把该公式复制到F列相应的其他单元格。

如果找到了,那么结果>0,没有找到,那么结果=0

对于得到的结果,既可以使用筛选得到需要的列表,也可以在条件格式中进一步设置,用颜色来更加显眼的标记出来。

#4


方法:

在SQLServer或Accesss中建两张表,分别对应sheet1 sheet2,假设表名为T1,T2

再将sheet1,sheet2的数据导入到T1,T2中(怎么倒入这里就不说了)

再在SQLServer或Access查询分析器中执行如下语句:

select T1.A,T1.B, T1.C T2.A from T1,T2
where T1.A = T2.A

以上语句自己理解意图:A就是你的身份证,其它。。。

结果就是你想要的了,再导出就可以了,
这个方法老用,又快又准。只是在倒出导入的时候不要发生错误就行了

#5


To:eNeter() 

如果采用您的方案,导入不是很好的选择,呵呵。因为数据要更新的,不能每次都重新导入。


如果采用您的方案:

如果使用Access,那么应该使用的是链接表

如果使用SQL Server,那么应该使用链接服务器,或者直接使用OPENROWSET查询。

===========================================================

其实既然Excel本身就可以很简单的实现,就没有必要导入到那里去了,事实上,多了一个步骤后,没有进一步简化步骤,呵呵。(虽然这种SQL语句是个非常简单的过程)

===========================================================

另外:您的SQL语句写的并不符合楼主的需求:您使用的是对等连接,这样只能显示出两边都有的项目,不能显示出Sheet1中的所有项目,所以应该使用的是左连接才对。

#6


TO:Yiqun_Zhao

        1。我自己是用SQLServer的,导入导出(包括数据变更情况)觉得很方便。

        2。如果用你的方法的话,数据更新也得做好几步操作。

        3。且在Excel上写公式求结果不是很妥当得做法,Excel不熟悉的话容易误操作,

           导致数据的混乱,建议不动数据所在的Sheet表。

        4。速度的问题:如果数据多达几万条,甚至十几万条

          (Excel的Sheet表大小受限制)效果就不一样了。

        5。这次要把身份证相同的筛选出来,如果要把不同的晒出来呢,或者更复杂的,

           用SQL语句能实现的很多,而公式的话显得复杂。

        6。至于楼主想要的是什么,可以从语句的变更来取得。


           我想我最主要想表达的是用SQL来筛选数据的方法

         
           以上是我的拙见,见笑了
         

        

#7


楼上的小哥:您是不是只看了一部分就发表了这么多评论?麻烦您看全上面的内容。

当然,以下内容如果要看,也请看完整。

==================================================================

楼上的小哥,Excel2003和之前的版本一个Sheet里面十几万记录吗???您应该知道行数是多少吧。(Excel2007达到了100多万行,且和SQL Server2005一道提供了商业智能)

不是不可以使用您说的SQL Server、Access不好,我自己也经常用。

==================================================================

您知道吗?SQL Server直接就可以查询Excel表格,Access使用链接表就可以了。
[导入过程牵涉到字段的,如果楼主根本就不会Access,那么容易因为字段问题出状况]
所以这种情况下,链接表比导入要合适。SQL Server也是同样的道理。

==================================================================

在上面的回复中,我说不导入原因,而且还对比了链接表和导入的差异,不知道您为什么执著的认为导入比使用链接表更好呢?这种情况下,应该是使用链接表的。

导入的只是当前数据,修改了数据,还要重新导入。

链接表只要一次链接即可,相信您这点是肯定知道的。您也应该知道导入和链接表在Access里面都在一个菜单里面,这点您应该是知道的。

在SQL Server里面使用链接服务器或者直接使用OPENROWSET来做查询的原因,也是如此。

==================================================================

楼主遇到过如下症状吗?
Excel某个字段既有数字又有文本,那么您导入到SQL Server中后,您会发现什么状况,如果您清楚地话,那么您肯定知道。
所以我从来不对那些不熟悉SQL Server的人建议使用SQL Server来导入Excel数据。明白了吧。
Access这里也是同样的道理

==================================================================

我从来就不否认数据库的好处,事实上,很多地方使用数据库都可以带来很多好处,我本人的习惯就是偏向数据库的。只是对于很多Excel既存数据的处理,我们要对数据规范之后才可以导入到SQL Server中,这点对于只是习惯了Excel应用的人来说,不是一件容易的事情,虽然对于您和众多对于关系型数据库理念很清晰的人来说根本就不可能是问题的问题。

==================================================================

SQL语句,如果楼主对SQL语句很熟悉的话,在Excel里面就可以直接使用SQL语句作查询,恐怕这点,楼上的小哥还不知道吧。

==================================================================

任何处理方法都要符合实际需求的。

#8


//SQL语句,如果楼主对SQL语句很熟悉的话,在Excel里面就可以直接使用SQL语句作查询,
//恐怕这点,楼上的小哥还不知道吧。

楼下的小弟也不知道,能否指点一二?

#9


其实,用条件格式也可以

将sheet2的内容复制到sheet1 C列和D列,现在sheet1 B列和D列为身份证号码。

选中B列,单击格式,条件格式-=or(exact(b2,d:d))=true, 选择单元格底纹颜色就可以了。

#10


我试了Yiqun_Zhao(蓝帆·雨轩 MS MVP)关于VLOOKUP不能比对超过15位的说法,好像不对啊
结果显示EXCEL可以正确比对啊, 楼上ifspecter的方法我觉得可行

#11


To:kgbkiller(初来乍到)
========================================
好像不对,就是您不确信咯。
========================================

您输入一个18位的身份证,您自己尝试一下。

注意:后3位您不一样,但是前15位一样,您看看结果是怎样的?

要实践了才知道哦。

#12


补充:
如果我的说法有误的话,那么您可以前16位一样,后2位不一样.按照这个做法,您一定能够发现问题.

#13


To: ljc007
==============================================
举个示例吧:

假如Sheet1有如下数据:
型号          单价          金额
A01101         10          -100
B00215         20          200
A01012         30          300
A02424         40          400
B24523         50          500
D02457         60          600
G01102         70          700
F01103         80          800
X01104         90          900
A0101          91          910
A0102          92          920


我们希望在Sheet2中得到以A开头的数据,可以有如下:

在Sheet2中加入一个命令按钮,使用VBA写如下代码.

Sub GetFilterA()
   
    Range("A2:C100").ClearContents

    Set conn = CreateObject("adodb.connection")
    conn.Open "provider=microsoft.jet.oledb.4.0;extended properties=excel 8.0;data    

    source=" & ThisWorkbook.FullName

    Sq1 = "select * from [Sheet1$] WHERE 型号 Like 'A%'"
[a600].End(xlUp).Offset(1, 0).CopyFromRecordset 

    conn.Execute(Sq1)

    conn.Close

    Set conn = Nothing

End Sub

将宏GetFilterA指定到命令按钮,单击该命令按钮,我们就可以在Sheet2中得到以A开头的结果了.

说白了,就是使用了ADO,呵呵.

#14


学习下

#15


將資料導到ACCESS中再用SQL語句去查.

#16


上面的辩论好精彩 
请加盟office专区群34543000
谢谢了