ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 2382|回复: 12

[分享] 4万行数据一秒!通过文字汇总数字!高效解决方案!超实用!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-5-14 06:15 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

4万行数据一秒处理完成,结果去重+可视化!

Snipaste_2021-05-14_06-09-31.png

文字汇总数字.rar

467.35 KB, 下载次数: 222

TA的精华主题

TA的得分主题

发表于 2021-7-16 15:25 | 显示全部楼层
谢谢分享 可以的

TA的精华主题

TA的得分主题

发表于 2021-7-26 17:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
先收藏了再说,谢谢!

TA的精华主题

TA的得分主题

发表于 2022-6-3 18:12 | 显示全部楼层
这个里边是不是有dll文件呢,感觉加的格式不合理啊,颜色这个不知怎么整出来的

TA的精华主题

TA的得分主题

发表于 2022-6-3 18:18 | 显示全部楼层
InStr(summary, keyWord) 从 源的字符中,找出keyword ,也就是统计的这个。这个INSTR函数,是模糊函数,但也会产生雷同: 比如: '许安四川信封装订机,哪我们找: 装订机,或者找信封,都会重复取值。

所以: INstr 起到了把字段比对出来的功能,但是,不是完全精确的。用这个方法的朋友要注意奥。另外,怎么整出单元格颜色,没发现怎么来的,有哪位老师知道奥

TA的精华主题

TA的得分主题

发表于 2022-6-3 18:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
所以,这个方法,貌似统计了数据,但是正式的运用,可能正确性会受到很大的质疑。往往有错误。

TA的精华主题

TA的得分主题

发表于 2022-6-3 18:23 | 显示全部楼层
另外就是当:语料库  字段存在 空单元格,不连续的时候,计算结果也不正确的

TA的精华主题

TA的得分主题

发表于 2022-6-3 18:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
yzxfelix 发表于 2022-6-3 18:23
另外就是当:语料库  字段存在 空单元格,不连续的时候,计算结果也不正确的

存在空的单元格,黄色的区域,统计会中断
1654252032(1).png

TA的精华主题

TA的得分主题

发表于 2022-6-3 18:33 | 显示全部楼层
yzxfelix 发表于 2022-6-3 18:18
InStr(summary, keyWord) 从 源的字符中,找出keyword ,也就是统计的这个。这个INSTR函数,是模糊函数,但 ...

比如:黑龙江是个字段, 里边在还有 一个 字段 “龙” , 统计结果重复了,明显不一致哈。
1654252305(1).png

TA的精华主题

TA的得分主题

发表于 2022-6-3 18:37 | 显示全部楼层
Option Explicit
Private shWords As Worksheet
Private shDataSource As Worksheet


Public Sub wordTotal()
   
   ' Total by keywords
   
    Dim dict As Dictionary
    Dim rng As Range
    Dim arr As Variant
    Dim clearsettings As New clsExcelSettings
   
   
    Dim t
    t = Timer
   
    clearsettings.TurnOff
   
    ' Create keywords dictionary
    Set dict = createLangauageDict
   
    ' Read data source
    Set rng = createDataSourceArr
    arr = rng
   
    ' If match then total results
    Set dict = createTotalDict(dict, arr)
   
   
    'Wirte results
    Call writeResults(dict)
   
    clearsettings.Restore
   
    MsgBox ("程序运行了" & Format(Timer - t, "0.00" & "秒"))
   
   

End Sub


    ' Create keywords dictionary
   
Private Function createLangauageDict() As Dictionary

    Dim dict As New Dictionary
    Dim rg As Range
    Dim keyWord As String
    Dim i As Long
   
    Dim cCode As clsCode
   
    Set shWords = shTotal
    Set rg = shWords.Range("A1").CurrentRegion
   
    For i = 2 To rg.Rows.Count
        keyWord = Cells(i, 1)
        
        If dict.Exists(keyWord) = True Then
            Set cCode = dict(keyWord)
        Else
            Set cCode = New clsCode
            dict.Add keyWord, cCode
        End If
        
        cCode.amount = 0
        cCode.Count = 0
            
    Next i
   
    ' Return
    Set createLangauageDict = dict
   
End Function


    ' Read data source
   
Private Function createDataSourceArr() As Range
    Dim rng As Range
   
    Set shDataSource = shData
   
    Set rng = shDataSource.Range("A1").CurrentRegion
    ' Return
    Set createDataSourceArr = rng
   
End Function
   
    ' If match then total results
   
Private Function createTotalDict(dict, arr) As Dictionary
    Dim keyWord As Variant
    Dim i As Long
    Dim amount As Double
    Dim summary As String
    Dim cCode As clsCode

   
    'Match
    For Each keyWord In dict.Keys
   
        Set cCode = dict(keyWord)
        
        For i = LBound(arr, 1) + 1 To UBound(arr, 1)
            amount = Val(arr(i, 2))
            summary = arr(i, 1)
            ' Conditions
            If InStr(summary, keyWord) <> 0 And amount <> 0 Then
                cCode.amount = cCode.amount + amount
                cCode.Count = cCode.Count + 1
            End If
        Next i
    Next
   
'    ' If item equals zero then delete
    Dim key As Variant
    For Each key In dict.Keys
        Set cCode = dict(key)
        If cCode.amount = 0 Then dict.Remove (key)
    Next
   
    ' Return
    Set createTotalDict = dict
End Function
   
    ' Wirte results
Private Sub writeResults(dict)                'dict代表字典对象
    Dim key As Variant
    Dim i As Long
    Dim cCode As clsCode
   
    shWords.Range("C1").CurrentRegion.Offset(1).ClearContents
   
    ' Write
    i = 2
    For Each key In dict.Keys
        Set cCode = dict(key)
        shWords.Cells(i, "C") = key
        shWords.Cells(i, "D") = cCode.amount
        shWords.Cells(i, "E") = cCode.Count
        i = i + 1
    Next
   
    'Sort
    Dim rg As Range
    Set rg = shWords.Range("C1:E" & 65536)
    rg.Sort Key1:=shWords.Range("D1"), Order1:=xlDescending, Header:=xlYes
   
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-7 07:01 , Processed in 0.026461 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表