ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 感谢版主liulang0808、EH侠圣zpy2、EH铁杆gwjkkkkk、EH能手鄂龙蒙等,问题圆满解决!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-4 17:22 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 xx18 于 2022-12-4 21:10 编辑

各位大侠,小女子求教“频次排名”的函数或VBA问题,请各位大侠帮助!
问题如下:
  工厂有成千上万的工人,每天都有工作积极的员工,虽然每月有30天左右,每年有365天,为方便说明问题,我们暂且模拟一个工厂8天的工作记录,工厂每天三班倒上班,工人每一天都可以选择工作一班、两班、甚至三班,每班都按照工作积极的积极成果都会被记录在案,在基本工资之外,月底按照记录次数给予绩效奖励,虽然我们模拟的是8天,其实每月都会统计30天左右,每年统计360天左右,年排前几名会得到年终奖。
  所以,如果一个工人一天上2个班,且2个班工作都积极,则会在一天内被记录2次,甚至一天被记录3次,每个人姓名之间有不固定数量的空格或字符隔开。
  如上所示是这个工厂8天的工作记录,请运用函数公式或VBA把8天记录中的人员名单按照各自被记录的总次数排序,存放到“排名”工作表中(模拟效果)。
  “绩效记录”工作表是原始数据,其中A列为日期,B列为人员名单
  “排名”工作表是统计结果,其中A列是被记录的工人名单,B列中是该工人被记录的总次数。
  谢谢!
附件:频次排名
频次排名.rar (9.85 KB, 下载次数: 13)
附图:频次排名原始数据
频次排名原始数据.jpg
附图:频次排名模拟结果
频次排名模拟结果.jpg

TA的精华主题

TA的得分主题

发表于 2022-12-4 17:51 | 显示全部楼层
Sub 按钮1_Click()
    Set d = CreateObject("scripting.dictionary")
    arr = Sheets(1).UsedRange
    With CreateObject("vbscript.regexp")
        .Pattern = "[一-龥]+"
        .Global = True
        For j = 2 To UBound(arr)
            For Each m In .Execute(arr(j, 2))
                d(m.Value) = d(m.Value) + 1
            Next m
        Next j
    End With
    Sheets(1).[c1:d1].Value = Array("姓名", "次数")
    Sheets(1).[c2].Resize(d.Count) = WorksheetFunction.Transpose(d.keys)
    Sheets(1).[d2].Resize(d.Count) = WorksheetFunction.Transpose(d.items)
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-4 17:52 | 显示全部楼层
顺序楼主可以自己排,模拟了一个提取,供参考

频次排名.zip

19.43 KB, 下载次数: 9

TA的精华主题

TA的得分主题

发表于 2022-12-4 18:04 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-4 18:12 | 显示全部楼层
Sub TEST()
    Dim arr, brr, i&, j&, dic As Object
    Set dic = CreateObject("Scripting.Dictionary")
    arr = [A1].CurrentRegion
    For i = 2 To UBound(arr)
      brr = strExMatch(arr(i, 2))
      If Join(brr) <> "" Then
        For j = 1 To UBound(brr)
           dic(brr(j)) = dic(brr(j)) + 1
        Next j
      End If
    Next i
    arr = Application.Transpose(Array(dic.keys, dic.items))
    bsort arr, 1, UBound(arr), 1, UBound(arr, 2), 2, False
    With Sheets(2)
       .[A1].CurrentRegion.Offset(1).Clear
       .[A2].Resize(UBound(arr), 2) = arr
       .Activate
    End With
    Beep
End Sub
Function strExMatch(ByVal strTxt As String) As Variant
    Dim regEx As Object, ar(), R&, aMatch, Matches
    Set regEx = CreateObject("Vbscript.RegExp")
      With regEx
        .Global = True
        .Pattern = "[\u4e00-\u9fa5]{2,4}"
      End With
      Set Matches = regEx.Execute(strTxt)
      For Each aMatch In Matches
        R = R + 1
        ReDim Preserve ar(1 To R)
        ar(R) = aMatch
      Next
      strExMatch = ar
End Function
Function bsort(arr, first, last, left, right, key, order)
  Dim i, j, k, t
  For i = first To last - 1
    For j = first To last + first - 1 - i
      If arr(j, key) <> arr(j + 1, key) Then
        If arr(j, key) < arr(j + 1, key) Xor order Then
          For k = left To right
            t = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = t
          Next
        End If
      End If
  Next j, i
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-4 18:15 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
参与一下。。。

频次排名.rar

22.79 KB, 下载次数: 6

TA的精华主题

TA的得分主题

发表于 2022-12-4 19:07 | 显示全部楼层
频次排名.rar (25.92 KB, 下载次数: 9)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-4 19:16 来自手机 | 显示全部楼层
select * from 正则表达式拆分行之绩效记录按频次排名 limit 3;
cli_split_data~正则表达式拆分行之绩效记录按频次排名~[^\p{Han}]+~绩效记录;
create temp table aa as
select 绩效记录 姓名,count(*) 次数 from 正则表达式拆分行之绩效记录按频次排名split group by 绩效记录;
select * from aa order by 次数 desc;
Screenshot_2022-12-04-19-14-52-859_cn.uujian.browser.jpg

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-4 20:48 | 显示全部楼层
liulang0808 发表于 2022-12-4 17:51
Sub 按钮1_Click()
    Set d = CreateObject("scripting.dictionary")
    arr = Sheets(1).UsedRange

小女子感谢版主liulang0808大人的指教!多谢了!

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-4 20:54 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
gwjkkkkk 发表于 2022-12-4 18:12
Sub TEST()
    Dim arr, brr, i&, j&, dic As Object
    Set dic = CreateObject("Scripting.Dictionar ...

小女子感谢gwjkkkkk大人的悉心教导!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 14:36 , Processed in 0.039839 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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