Excel巧设公式(字典+数字)

有个网友提了这样的一个需求:A中有包含重复值的数据,现在需要将重复值所在单元格的值改为公式引用。例如:A6单元格值为3,第一个出现3的单元格为A5,所以将A6公式设置为=$A$5,其他单元格依次类推。

方法1示例代码如下:

Sub Demo1()
    Dim Dic As Object, dKey
    Dim c As Range
    Dim sKey As String
    Set c = [a1].CurrentRegion
    arr = c.Value
    res = arr
    Set Dic = CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(arr)
        sKey = arr(i, 1)
        If Dic.exists(sKey) Then
           res(i, 1) = "=" & Dic(sKey)
        Else
            Dic(sKey) = Cells(i, 1).Address
        End If
    Next
    c.Formula = res
    Set Dic = Nothing
End Sub

【代码解析】
第5行代码获取A列数据区域。
第6行代码即将单元格内容加载到数组中。
第7行代码复制一个数组用于保存结果。
第8行代码创建字典对象。
第9~17行循环处理每个数据。
第10行代码读取数组中的值。
如果字典中已经存在相同的键值,那么第12行代码更新结果数组,设置公式,否则第14行代码将新值添加到字典对象中。
第17行代码一次性更新数据区域的公式,注意此处使用的是Formula属性,而不是通常大家经常用的Value属性。


方法2示例代码如下:

Sub Demo2()
    Dim Dic As Object, dKey
    Dim c As Range
    Dim sKey As String
    Set Dic = CreateObject("Scripting.Dictionary")
    For Each c In [a1].CurrentRegion
        sKey = CStr(c.Value)
        If Dic.exists(sKey) Then
            Dic(sKey) = Array(Dic(sKey)(0), Dic(sKey)(1) & "," & c.Address(0, 0))
        Else
            Dic(sKey) = Array(c.Address, "")
        End If
    Next
    If Dic.Count > 0 Then
        For Each dKey In Dic.keys
            If Len(Dic(dKey)(1)) > 0 Then _
            Range(Mid(Dic(dKey)(1), 2)).Formula = "=" & Dic(dKey)(0)
        Next
    End If
    Set Dic = Nothing
End Sub

【代码解析】
与上面示例相同的地方此处不赘述。
这个实现方法与上一个不同之处在于字典的使用方法,和更新公式的方法。
如果字典中已经存在相同的键值,那么第9行代码更新字典中保存的数组,该数组包含两个元素,第一个元素为键值首次出现的单元格地址,第二元素相同内容单元格的地址,有多个相同单元格是,地址之间以逗号分隔。
例如:对于键值“AA”,数组中保存的两个元素为("$A$1",",$A$11,$A$14"),第1个元素为首次出现的单元格地址,第二个为相同内容单元格的全部地址。
如果字典中不存在该键值,第11行代码将新值添加到字典对象中。
第15~18行代码循环遍历字典对象的键值。
如果字典对象中保存的数组的第二个元素(Dic(dKey)(1))为空,说明数据中该键值只出现一次,无需更新公式,例如A9单元格。
如果第二个元素Dic(dKey)(1)是非空,那么第17行代码将设置重复值所在单元格的公式,数组中第二个元素保存的是单元格的引用地址,注意第一个逗号字符是多余的,需要使用Mid处理一下,第一个元素为首次出现单元格的地址,所以公式为"=" & Dic(dKey)(0)


(0)

相关推荐

  • Excel VBA 字典的常用方式

    运用字典的时候,对比数组.主要是运用字典的去重效果. 最常用的两种应用: 一:统计相同人名的销售额 二:统计系统人名出现的次数(唱票) 统计销售额的示例: 先看一下运行代码: 运行的结果与H.I列数据 ...

  • 数据对比!从所有名单中提取出未经核酸检测的名单

    你好,我是刘卓.欢迎来到我的公号,excel函数解析.今天来分享一个数据对比(查找)的案例.现在有两份名单,一份是所有人的名单,另一份是已经核酸检测过的名单.要求是对比这两份名单,提取出未经核酸检测的 ...

  • Excel VBA 7.46字典+数字+窗体控件,跨工作表实现COUNTIF的功能

    一起学习,一起进步~~ 之前我们分享过一篇文章,就是通过字典+数组的方式来实现跨工作表求和的,在那一节的学习中,我们实现了count函数的跨工作表的一个求和的效果,后面有小伙伴表示,他碰到的场景不仅仅 ...

  • 5个函数公式加一个Excel技巧,完美提取数字,一键提取更牛

    [温馨提示]亲爱的朋友,阅读之前请您点击[关注],您的支持将是我最大的动力! 日常工作中,我们经常会收到一些这样的Excel文件:文本其中包含了中文.字母.数字,而且都堆积到一个单元格内.但是,我们想 ...

  • Excel 多条件查找公式(数字类)

    在实际工作中,根据多个条件查找是很常见的.其中,查找值是数字的情形最为常见.例如,根据三个条件,查找学生分数: 分析问题 由于查找值是数字,又因为查找值是唯一,因此可以使用求和来代替查找.转换成求和问 ...

  • EXCEL之--巧用公式+筛选去除重复数据

    原理(能看懂就看,看不懂可忽略):首先对关键字进行排序,然后用match函数对当前行关键字对整列数据进行匹配,返回当前数据匹配到的行标. 当数据重复的时候 每个关键字就会匹配到第一个,所以当前辅助列公 ...

  • 巧设文眼 成就美文 |《家门口的夏夜》李晨歌

    <天天读写>2021.4      学生佳作 家门口的夏夜 陕西蒲城县桥山中学七年级(5)班 李晨歌 对我来说,最美的景当属家门口的夏夜. [总说,点题--"最美的景" ...

  • 弃马诱惑,巧设陷阱,非常实用的 招法,值得一看

    弃马诱惑,巧设陷阱,非常实用的 招法,值得一看

  • 明朝奇案:妻子与商人私通,丈夫巧设毒计,下手太狠

    明朝万历皇帝统治时期,原是陕西某县县令的张英升了官,任知府一职.赴任之前,张英特意赶回老家江西,要将妻子莫氏一同接过去. 张英和莫氏聚少离多,以后就能陪在对方身边了.按理说,两人都应高兴才是.但莫氏却 ...

  • Excel如何进行公式的填充?

    在Excel中处理数据的时候肯定离不开公式的操作,如果我们通过公式算出一个数值来可以通过 公式的填充将某一行或一列的数据同时进行计算,下面来看看吧! 1.我们进行公式填充的话,首先要输入公式. 2.输 ...

  • Excel如何将一串数字四个数字一空格的设置?

    将数字进行批量的处理,比如将数据进行四个一空格的形式排列,如何快速操作赶紧来看看吧! 1.准备一些长数据,将其四个一空格的形式排列. 2.在紧贴的空白列输入一行需要的格式. 3.鼠标双击右下角的按钮进 ...