分享

活用数组 字典的组合,轻松实现Excel自身没有的功能

 weimiao 2019-06-15

前景提要

昨天我们分享了在进行数据合并的过程中,如何进行去重的操作,这对于小伙伴们日常的操作是有很大的帮助的,毕竟Excel自带的重复项高亮功能也只能针对一列,并且没有办法跨工作表,我们可能需要进行多个次去重才能够得到一个最终的结果,然后就有小伙伴不淡定了,因为我们的参照列是一列,只有姓名列,如果想要两列或者多列同时去重呢?

场景简介

还是上节的案例,多列去重,我们假设我们需要满足的条件是,姓名+班级这两列数据完全相同,才算是同一个数据源,只要有一个不同就不算是相同数据,比方说A15,姓名和班级都是相同的, 我们保留一个就可以了。

第三个表中,虽然C22有两个,但是班级不同,是不同班级的相同姓名的童鞋,这样的话,我们是当成不同的两个人

那么在这样的情况如何实现呢?

代码区

Sub TEST()Dim sth As Worksheet, rng As Range, zd As Object, a As Range, arr, arr1()Set rng = Application.InputBox('请选择参照列', '参照列的选择', , , , , , 8)Set zd = CreateObject('scripting.dictionary')colnum = rng.Columncolnums = rng.Columns.Countk = 0For Each sth In Worksheets sth.Activate rl = sth.Cells(Rows.Count, 1).End(xlUp).Row cl = sth.Cells(1, Columns.Count).End(xlToLeft).Column arr = sth.Range(Cells(1, colnum), Cells(rl, cl)) For i = 1 To UBound(arr) s = arr(i, 1) & '-' & arr(i, 2)'想要多列的话,就改这里 If Not zd.Exists(s) Then k = k + 1 zd(s) = k ReDim Preserve arr1(1 To cl, 1 To k) For i1 = 1 To cl arr1(i1, k) = arr(i, i1) Next i1 End If Next iNext sthWorksheets.AddActiveSheet.Name = '去重版名单'ActiveSheet.Cells(1, 1).Resize(k, UBound(arr1)) = WorksheetFunction.Transpose(arr1)End Sub

好像代码并没有太大的变化,来看看效果

首先依然是选择参照列,这里的参照列我们是选择两列

然后就可以去喝口茶了。

看结果

出来了,我们来验证下上面几个人员的情况

A15 只保留了一个,符合我们的要求,因为他的姓名和班级是相同的

C22保留了两个数据,因为虽然姓名相同,但是班级不同,在本案例中是不同的人

完美

代码分析

虽然今天的代码看起来比较的简单,和上节的情况似乎差不多,其实思路也是一样的,利用字典的唯一性,但是逻辑上要稍微费点脑细胞理解下

我们从进入每个工作表的循环开始说起

rl = sth.Cells(Rows.Count, 1).End(xlUp).Rowcl = sth.Cells(1, Columns.Count).End(xlToLeft).Columnarr = sth.Range(Cells(1, colnum), Cells(rl, cl))

现货区当前工作表的区域,然后将它赋值给数组arr,这里我们为什么不直接用usedrange呢?因为我们后面会使用到rl,cl这两个变量、

然后进入今天的重点(划重点了)

既然我们这里要进行多列去重,那么就等于将多列作为一个整体,将这多列数据当成一列,因为我们这里是两列,我们就将这两列的内容合起来复制给一个变量s

s = arr(i, 1) & '-' & arr(i, 2)

我们运行下看看是什么效果

看图大家应该能够看出来了,就是讲第一列和第二列通过连接符“-”联系在一起,作为一个整体,我们通过判断这个整体在字段中是否存在作为参考标准。

如果存在跳过,如果不存在,就利用数组将所有的数据装进数组中

本案例我们将所有的数据都汇总起来,这里就是利用动态数据的方式来进行了。 因为已经确定了列数,cl,所以动态数组就很好处理了。

ReDim Preserve arr1(1 To cl, 1 To k)

因为数据比较多,我们不可能和之前一样一个个去赋值,这样不科学,也不规范,这里我们再利用循环的方式将数组赋值

For i1 = 1 To cl arr1(i1, k) = arr(i, i1) Next i1

看看效果图

其实就是通过循环的方式将每个数据放到数组中了,避免了之前一个一个写的烦恼

看看重复数据,A15,这里我们已经来到第二个表了,A15这个位置,这时候的S=“A15-高三1班”,字典中也存在这个值了,所以是直接跳过的

而C22,因为班级不同,所以s并不同,故依然还是会进行如数组的循环,不断的装数据

怎么样,这样分步讲解,大家是否能够理解呢?

VBA中两大得力助手,字典和数组都在本节出现了,快来一起学习吧


好了~明晚19:00,准时再见。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多