分享

用自定义函数提取非重复值

 hercules028 2019-03-27

在实际工作中,如果使用工作表函数提取非重复值,常见的是使用INDEX+SMALL+IF+ROW的函数组合。当数据量较大时,运算速度明显会减慢。

而在VBA中,使用应用字典方法的自定义函数,可以快速、方便的提取非重复值。

示例:提取非重复值:

在【模块】的【代码窗口】输入以下代码:

Function NotRepeat(ParamArray rn() As Variant)

    Dim arr,cell

    Set dic= CreateObject('scripting.dictionary')

        arr= Application.Transpose(rn(0))

        ForEach cell In arr

           If IsEmpty(cell) Then

               cell = ''

           End If

           dic(cell) = ''

        Next

       NotRepeat = dic.keys

End Function

在D2单元格输入以下公式,向下复制到D5单元格,提取不重复部门名称,如图所示:

=INDEX(NotRepeat($B$2:$B$10),ROW(1:1))

提取非重复值

自定义函数NotRepeat得到的是一个非重复的内存数组{'蜀国','魏国','吴国','群雄'},使用INDEX函数将此数组中的每一个元素提取到单元格当中。

在F2和G2分别输入以下两个公式,按<Ctrl+Shift+Enter>组合键,并分别向下复制到F8和G8单元格,提取姓名、员工部门两个条件同时都不重复的姓名与员工部门:

{=TRIM(LEFT(INDEX(NotRepeat($A$2:$A$10&REPT('',10)&$B$2:$B$10),ROW(1:1)),10))}

{=TRIM(RIGHT(INDEX(NotRepeat($A$2:$A$10&REPT('',10)&$B$2:$B$10),ROW(1:1)),10))}

$A$2:$A$10&REPT(' ',10)&$B$2:$B$10部分,将姓名与员工部门两部分连接起来,方便判断每一组值是否重复。中间用10个空格分隔,以方便最后将连接起来的字符串再分别提取到相应的单元格中。

通过INDEX和NotRepeat函数得到不重复的姓名与员工部门连接起来的字符串,之后分别使用LEFT和RIGHT函数提取左侧10个字符和右侧10个字符。最后通过TRIM函数将多余的空格清除掉,得到最终结果。

本文节选自北京大学出版社、ExcelHome团队出版的《Excel 2016函数与公式应用大全》,本书全面系统地介绍了Excel 2016函数与公式的技术特点和应用方法,深入揭示背后的原理概念,并配合大量典型实用的应用案例,帮助读者全面掌握Excel的函数与公式。全书分为4篇共32章,内容包括公式与函数基础、常用函数、函数综合应用,以及其他功能中的函数应用。附录中还提供了Excel 2016规范与限制、Excel 2016常用快捷键、Excel 2016常用函数及功能说明等内容,方便读者查阅。

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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多