ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 如何统计同行中出现次数最多的三个数字

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-3-10 19:22 | 显示全部楼层 |阅读模式
这是一个大佬给的 统计同行出现次数最多的两个数。  我是小白 不知道统计同行出现3个数的咋弄 求助大佬

Sub 按钮1_Click()
    Dim sht As Worksheet
    Dim vData
    Dim dicA As New Dictionary
    Dim dicB As New Dictionary

    Set sht = Worksheets(1)
    vData = sht.Range("A1").CurrentRegion

    A = IIf(UBound(vData) - 50 < 0, 1, UBound(vData) - 49)

    For U = A To UBound(vData)
        For V = 1 To UBound(vData, 2) - 1
            For W = V + 1 To UBound(vData, 2)
                dicA(vData(U, V) & "," & vData(U, W)) = dicA(vData(U, V) & "," & vData(U, W)) + 1
            Next
        Next
    Next

    While dicA.Count
        dicB(dicA.Items(0)) = dicB(dicA.Items(0)) & dicA.Keys(0) & " "
        dicA.Remove dicA.Keys(0)
    Wend

    sht.Range("V1").CurrentRegion.ClearContents
    For A = 1 To 3
        V = WorksheetFunction.Max(dicB.Keys())
        sht.Range("V1").Offset(A - 1) = V
        sht.Range("W1").Offset(A - 1).Resize(1, UBound(Split(dicB(V))) + 1) = Split(dicB(V))
        dicB.Remove V
    Next
End Sub

样表.zip

13.3 KB, 下载次数: 22

TA的精华主题

TA的得分主题

发表于 2024-3-11 11:23 | 显示全部楼层
请看附件。

a样表.zip

30.44 KB, 下载次数: 3

TA的精华主题

TA的得分主题

发表于 2024-3-11 14:39 | 显示全部楼层
举一个具体的例子,否则看不懂需求

TA的精华主题

TA的得分主题

发表于 2024-4-1 11:19 | 显示全部楼层
  1. Sub 按钮1_Click()
  2.     Dim sht As Worksheet
  3.     Dim vData
  4.     Set dicA = CreateObject("scripting.dictionary")
  5.     Set dicB = CreateObject("scripting.dictionary")

  6.     Set sht = Worksheets(1)
  7.     vData = sht.Range("A1").CurrentRegion

  8.     A = IIf(UBound(vData) - 50 < 0, 1, UBound(vData) - 49)
  9.     For U = A To UBound(vData)
  10.         For v = 1 To UBound(vData, 2) - 2
  11.             If Len(vData(U, v)) = 0 Then Exit For
  12.             For w = v + 1 To UBound(vData, 2) - 1
  13.                 If Len(vData(U, w)) = 0 Then Exit For
  14.                 For x = w + 1 To UBound(vData, 2)
  15.                     If Len(vData(U, x)) = 0 Then Exit For
  16.                     s = vData(U, v) & "," & vData(U, w) & "," & vData(U, x)
  17.                     dicA(s) = dicA(s) + 1
  18.                 Next
  19.             Next
  20.         Next
  21.     Next

  22.     For Each x In dicA.keys
  23.         dicB(dicA(x)) = dicB(dicA(x)) & x & "/"
  24.     Next

  25.     sht.Range("V1").CurrentRegion.ClearContents
  26.     For A = 1 To 3
  27.         v = WorksheetFunction.Max(dicB.keys())
  28.         sht.Range("V1").Offset(A - 1) = v
  29.         xrr = Split(dicB(v), "/")
  30.         sht.Range("W1").Offset(A - 1).Resize(1, UBound(xrr)) = xrr
  31.         dicB.Remove v
  32.     Next
  33. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-4-1 13:34 | 显示全部楼层
2楼的代码有点小问题。如果最多、次多、第三多次数不连续的话(比如最多、次多、第三多为6次,4次,2次)的话,得不出正确结果。

TA的精华主题

TA的得分主题

发表于 2024-4-1 13:53 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
2楼代码修改如下:
  1. Sub 统计数()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     Set d1 = CreateObject("scripting.dictionary")
  4.     arr = Sheet1.Range("A1").CurrentRegion
  5.     a = IIf(UBound(arr) - 50 < 0, 1, UBound(arr) - 49)
  6.     For i = a To UBound(arr)
  7.         For j = 1 To UBound(arr, 2) - 2
  8.             For j2 = j + 1 To UBound(arr, 2) - 1
  9.                 For j3 = j2 + 1 To UBound(arr, 2)
  10.                 ss = arr(i, j) & "," & arr(i, j2) & "," & arr(i, j3)
  11.                 If arr(i, j) <> "" And arr(i, j2) <> "" And arr(i, j3) <> "" Then
  12.                     d(ss) = d(ss) + 1
  13.                 End If
  14.                 Next
  15.             Next
  16.         Next
  17.     Next
  18.     k = d.keys
  19.     t = d.items
  20.     For Each n In t: d1(n) = 1: Next   '次数去重
  21.     x = Application.Max(t)   '最多
  22.     y = Application.WorksheetFunction.Large(d1.keys, 2)  '次多
  23.     Z = Application.WorksheetFunction.Large(d1.keys, 3)  '三多
  24.    
  25.     ReDim brr(1 To d.Count, 1 To 3)
  26.     n1 = 1: n2 = 1: n3 = 1
  27.     For i = 0 To UBound(t)
  28.         If t(i) = x Then
  29.             n1 = n1 + 1
  30.             brr(n1, 1) = k(i)
  31.         End If
  32.         If t(i) = y Then
  33.             n2 = n2 + 1
  34.             brr(n2, 2) = k(i)
  35.         End If
  36.         If t(i) = Z Then
  37.             n3 = n3 + 1
  38.             brr(n3, 3) = k(i)
  39.         End If
  40.     Next
  41.     brr(1, 1) = "出现" & x & "次,共" & n1 - 1 & "组": brr(1, 2) = "出现" & x - 1 & "次,共" & n2 - 1 & "组": brr(1, 3) = "出现" & x - 2 & "次,共" & n3 - 1 & "组"
  42.     Columns("X:Z").ClearContents
  43.     [x1].Resize(n3, 3) = brr
  44. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2024-4-1 14:57 | 显示全部楼层
用wps做了一个,稍微简洁点。
360截图20240401145650859.jpg

TA的精华主题

TA的得分主题

发表于 2024-4-1 15:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 Again123456 于 2024-4-1 15:23 编辑

看不懂什么叫“一对”,还有“50行数据中在同一行出现次数最多的三个数” 是COUNTIF($A$11:$T$60,A11)?。只会写一行代码,let arr =Range("a1").CurrentRegion.Value2.slice(-50)

TA的精华主题

TA的得分主题

发表于 2024-4-1 17:12 | 显示全部楼层
不知理解的对不对,不过可以试一下金山文档的py脚本
批注 2024-04-01 171037.jpg

TA的精华主题

TA的得分主题

发表于 2024-4-9 17:09 | 显示全部楼层
试着写一个,看看能用吗

样表.zip

23.83 KB, 下载次数: 0

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-25 15:21 , Processed in 0.047689 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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