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

342865bec8a7b755ada29da66993a283.png

5f2fabeb4f5c8960c3e48e5b2354d337.png

本次案例根据实际情场景改编,一定程度上体现了PQ的高效数据清洗和核对能力!也算是一个真正实际应用过程中的M函数书写展示!业务场景业务场景:分公司A和分公司B距离较近,经常发生交叉签单的情况,发生这种情况,需要在实际签单公司登记,最后合并到一起计算!在合并数据时,为了确保准确性,使用姓名和身份证号码作为条件!避免重名或者同人身份照号码录入不一致导致的错误!但是这种情况下,一般遇到姓名或者身份证号码录入错误就无法准确合并,所以我们要找出同名但身份证号码不同的数据进行核实是否同一人,以及身份照号相同姓名不同的数据!模拟数据如下:一人可能有多条数据

be0347903a12d8b6226f8fbb400e6a8f.png

找出姓名同身份照号不同的数据加载进入PQ等基础,这里就不再介绍,不懂的同学,可以看一下PQ入门第一期:PQ 第一期 | Power Query是什么?怎么学?先说一下处理思路:按照姓名分组,因为一个人可能有多条件记录,所以分组后,我们需要对身份号去重,对于不重复值,我们还要看是哪一个分公司的,后续沟通处理,所以我们需要对去重的身份证号和公司名称拼接一下,放在一个单元格中!具体操作如下:

01 | 按照姓名分组处理

= Table.Group(源,"姓名",{"res",each _})

027e69dcff71ee4006447529b0f7c69b.png

姓名相同的数据会聚合到一起形成Table,后续我们对这个table进行处理!

02 | 去重找异常

1f7604323a11e1186656db03c7b3b72a.png

看上去是不是有点有点多有点复杂,其实这就是我一般在实际使用过程中的基本常态!所以不用担心,只要我们思路清晰,非常简单!格式化一下方便我们解读:

d547ec4946231b523764a939769b2ce9.png

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

03 | 排除空值,得到结果

de4b91293c2b505b426f5f64e21299d9.png

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

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

4ac8cf3ef4734c4d0455474d426162ae.png

全部源码:(左右滑动查看或者复制到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    筛选的行

为了大家理解方便,我们代码中大部分变量都使用的中文,实际情况,大家可以根据习惯来,个人开发,可读性也可以适当往前靠靠,方便维护!身份证相同姓名不同原理基本差不多,我们就直接来写:

c23ab353b912435e361d0d273e84bcb8.png

可以看到两个异常一个是末尾添加的了空格,一个是许褚写成了徐诸,不筛选出来我们是很难看出的!在PQ编辑中,我们使用双斜杠来注释,这算是一个新的知识!本次我们稍微换一下思路,更清晰,先判断新名是否唯一,不唯一再两列去重合并,本次使用合并两列的Table.CombineColumns函数,这些函数都比较简单,基本大家学完前两期基础,这些看一下是完全没有问题的了!let …… in 结果会在我们以后的基础教程中继续讲解!

小结一下

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值