vba筛选出满足条件的数据_PQ实战 | 快速找出差异数据,数据变动及时更新

d746d53bed7af8aafc73a6b6be5f30f4.gif 本次案例根据实际情场景改编,一定程度上体现了PQ的高效数据清洗和核对能力!也算是一个真正实际应用过程中的M函数书写展示! 业务场景 业务场景:分公司A和分公司B距离较近,经常发生交叉签单的情况,发生这种情况,需要在实际签单公司登记,最后合并到一起计算!在合并数据时,为了确保准确性,使用姓名和身份证号码作为条件!避免重名或者同人身份照号码录入不一致导致的错误!但是这种情况下,一般遇到姓名或者身份证号码录入错误就无法准确合并,所以我们要找出同名但身份证号码不同的数据进行核实是否同一人,以及身份照号相同姓名不同的数据! 模拟数据如下:一人可能有多条数据 4ef75e3745b31d2cf7bc020b72f380b0.png 找出姓名同身份照号不同的数据 加载进入PQ等基础,这里就不再介绍,不懂的同学,可以看一下 PQ入门第一期: PQ 第一期 | Power Query是什么?怎么学? 先说一下处理思路: 按照姓名分组,因为一个人可能有多条件记录,所以分组后,我们需要对身份号去重,对于不重复值,我们还要看是哪一个分公司的,后续沟通处理,所以我们需要对去重的身份证号和公司名称拼接一下,放在一个单元格中! 具体操作如下:

01 |  按照姓名分组处理

= Table.Group(源,"姓名",{"res",each _})
a8b72e40216948b8331dcb18495a5fc3.gif 姓名相同的数据会聚合到一起形成Table,后续我们对这个table进行处理!

02 | 去重找异常

f1c24ac203ed8b1088f5472dbf498172.png 看上去是不是有点有点多有点复杂,其实这就是我一般在实际使用过程中的基本常态!所以不用担心,只要我们思路清晰,非常简单! 格式化一下方便我们解读: f967759814519f1fc3221c997da8eb19.png 代码思路解读: 1、相同姓名在不同分公司或者相同分公司都有可能有多条数据,所以我们第一步考虑把身份证号和分公司(名称)这两列提取出来,然后去重,Table.SelectColumns 名字够直接了,就是选取列!多列使用list即可!不要告诉我你不知道什么是list(查看入门第二期),去重Table.Distinct,也够直接,不用多讲,这里使用Record包裹,是因为我们后面还需要使用到【提取两列】这个过度表,这样就不用重复写,直接使用!未来也可以使用let …… in 结构! 2、上一步去重后,可以排除掉重复的数据,但是一个人只要在两个公式都出现就有会两条记录,所以我们还要对身份证号去重,正常情况下一个人一个身份证号码,结果肯定是一条,所以我们最后要的结果就是 去重身份证号码个数大于1 且 身份证号和分公司去重 行数 大于1 3、找出这些满足条件的数据,结果是两列,我们希望先号码和分公司合并,然后再 每一行合并,放在一个单元格,这里的#(lf)表示换行符,PQ中特殊符号或者系统自带的一般都使用#开头 比如#shared,#table构建比较等。 Text.Combine大家比较熟悉了,使用分隔符合并两个文本!

03 | 排除空值,得到结果

26821f2c10117a2a6916ef4cf5369cd5.png 最后筛选 不等于空的结果!其实这一步也可以直接合并到上面一步搞定!

04 | 修改数据,刷新动态更新

088c8ceaa33588ff39dedf75ed4a0e15.gif 全部源码:(左右滑动查看或者复制到PQ编辑器)
let
    源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
    自定义1 = Table.Group(
        源,"姓名",
            {"res",each
                [提取两列 = Table.SelectColumns(_,{"身份证号码","分公司"}),
                号码去重 = List.Count(List.Distinct([身份证号码])),
                两列去重 = Table.Distinct(提取两列),
                结果= if Table.RowCount(两列去重)>1 and  号码去重 >1 then 
                        Text.Combine(
                            List.Transform(Table.ToRows(两列去重),(x)=>Text.Combine(x,":"))
                                ,"#(lf)"
                            ) else ""
                ][结果]
            }
        ),
    筛选的行 = Table.SelectRows(自定义1, each ([res] <> ""))in
    筛选的行
为了大家理解方便,我们代码中大部分变量都使用的中文,实际情况,大家可以根据习惯来,个人开发,可读性也可以适当往前靠靠,方便维护! 身份证相同姓名不同 原理基本差不多,我们就直接来写: fff713745292aedd58d89e371201e619.png 可以看到两个异常一个是末尾添加的了空格,一个是许褚写成了徐诸,不筛选出来我们是很难看出的! 在PQ编辑中,我们使用双斜杠来注释,这算是一个新的知识! 本次我们稍微换一下思路,更清晰,先判断新名是否唯一,不唯一再两列去重合并,本次使用合并两列的Table.CombineColumns函数,这些函数都比较简单,基本大家学完前两期基础,这些看一下是完全没有问题的了! let …… in 结果会在我们以后的基础教程中继续讲解!

小结一下

1、对于很多PQ新手一看M函数代码这么长就放弃了,其实M函数和Excel函数嵌套一样,掌握参数和每个函数的结果类型,思路清晰非常简单! 2、使用PQ的好处是,本次写好后,以后再有类型的情况,我们只要更新数据源,右击刷新即可,不用每次都去处理一边。同时相对于VBA要简单很多! 本文由“壹伴编辑器”提供技术支持

9251331be32de2ff8741f35294e526fe.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值