ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 查找组合数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-2-26 15:02 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
如图,想查找出现最多次的数据组合,2、3、4、5个数的组合
Snipaste_2024-02-26_14-59-17.jpg

查找组合.zip

9.87 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2024-2-26 17:49 | 显示全部楼层
2个数的组合 查找组合.rar (26.87 KB, 下载次数: 9)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-2-26 19:41 | 显示全部楼层

谢谢你的回复,如果我要三个数组合、四个数组合和五个数组合又要怎么做呢?

TA的精华主题

TA的得分主题

发表于 2024-2-26 20:53 | 显示全部楼层
Option Explicit
Sub TEST7()
    Dim ar, br, cr, dr(), er(), vResult(), isFlag As Boolean
    Dim i&, j&, k&, r&, n&, iMax&, vKey, dic As Object, t#
   
    Application.ScreenUpdating = False
    Set dic = CreateObject("Scripting.Dictionary")
    t = Timer
   
    With [A1].CurrentRegion
        ar = .Value
        br = Intersect(.Offset(), .Offset(, 1))
        .Interior.Color = xlNone
        For i = 2 To UBound(ar)
            dr = Application.Index(br, i)
            ReDim er(1 To [L1].Value)
            ReDim vResult(1 To WorksheetFunction.Combin(UBound(dr), [L1].Value))
            combinArr dr, er, vResult, [L1].Value
            For j = 1 To UBound(vResult)
                dic(Join(vResult(j))) = dic(Join(vResult(j))) + 1
            Next j
        Next i
        iMax = Application.Max(dic.Items)
        ReDim br(1 To dic.Count, 1 To [L1].Value)
        For Each vKey In dic.Keys
            If dic(vKey) = iMax Then
                cr = Split(vKey)
                r = r + 1
                For j = 0 To UBound(cr)
                    br(r, j + 1) = cr(j)
                Next j
            End If
        Next
        
        [L2].CurrentRegion.Offset(1).Clear
        [L2].Resize(r, UBound(br, 2)) = br
        [N1].Value = iMax
        
        n = 2
        For i = 1 To r
            n = n + 1
            If n = 56 Then n = 3
            For k = 2 To UBound(ar)
                dic.RemoveAll
                For j = 2 To UBound(ar, 2)
                    dic(CStr(ar(k, j))) = j
                Next j
                isFlag = True
                For j = 1 To UBound(br, 2)
                    If Not dic.Exists(br(i, j)) Then isFlag = False
                Next j
                If isFlag Then
                    For j = 1 To UBound(br, 2)
                        .Cells(k, dic(br(i, j))).Interior.ColorIndex = n
                    Next j
                End If
            Next k
        Next i
    End With
   
    Set dic = Nothing
    Application.ScreenUpdating = True
    MsgBox "执行完毕!_用时:  " & Format(Timer - t, "0.00") & "  秒", 64
End Sub

Function combinArr(ByRef ar(), ByRef br(), ByRef cr(), ByVal n&, Optional ByRef iGroup&, Optional ByVal iStart&, Optional ByVal iNum& = 1)
    Dim i&, j&
    For i = iStart + 1 To UBound(ar) - n + iNum
        If iNum < n Then
           br(iNum) = ar(i)
           Call combinArr(ar, br, cr, n, iGroup, i, iNum + 1)
        Else
           br(iNum) = ar(i)
           iGroup = iGroup + 1
           cr(iGroup) = br
        End If
    Next
End Function


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-2-26 20:54 | 显示全部楼层
本帖最后由 gwjkkkkk 于 2024-2-27 21:41 编辑

请参考。。。

查找组合.rar

23.67 KB, 下载次数: 11

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-2-27 21:45 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2024-2-29 10:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
参与一下啊。
使用递归法,适应不同个数的组合,1-7个。填充颜色就随便填一下了

  1. Option Explicit
  2. Dim Arr, Trr(), Brr, d As Object
  3. Dim i&, j&, x&, y&
  4. Dim xStr As String
  5. Dim MaxN&, aN&, bN&, H&, k

  6. Sub ZuHe()

  7. With Range("a2:g" & Cells(Rows.Count, 1).End(xlUp).Row)
  8.     .Interior.Pattern = xlNone
  9.     Arr = .Value
  10. End With
  11. aN = 7: bN = [L1]
  12. ReDim Trr(1 To UBound(Arr), 1 To JCnum(aN) / (JCnum(bN) * JCnum(aN - bN)))
  13. Set d = CreateObject("scripting.dictionary")

  14. For x = 1 To UBound(Arr)
  15.     y = 0
  16.     DiGui aN, bN, ""
  17. Next x

  18. MaxN = WorksheetFunction.Large(d.Items, 1)
  19. [n1] = MaxN: H = 1
  20. Range("L2:Q9999").ClearContents
  21. For Each k In d.keys
  22.     If d(k) = MaxN Then
  23.         H = H + 1
  24.         Brr = Split(k, " ")
  25.         Range("L" & H).Resize(1, UBound(Brr) + 1) = Brr
  26.         
  27.         For x = 1 To UBound(Trr)
  28.         For y = 1 To UBound(Trr, 2)
  29.             If Trr(x, y) Like k Then
  30.                 For i = 0 To UBound(Brr)
  31.                 For j = 1 To UBound(Arr, 2)
  32.                     If Arr(x, j) Like Brr(i) Then Cells(x + 1, j).Interior.Color = RGB(0, 255, 255)
  33.                 Next j, i
  34.                 Exit For
  35.             End If
  36.         Next y, x
  37.         
  38.     End If
  39. Next k

  40. End Sub

  41. Sub DiGui(ByVal N As Long, R As Long, T As String)
  42.    
  43.     If R = 1 Then
  44.         For i = 1 To N
  45.             y = y + 1
  46.             Trr(x, y) = Arr(x, i) & " " & T
  47.             d(Trr(x, y)) = d(Trr(x, y)) + 1
  48.         Next i
  49.         Exit Sub
  50.     ElseIf N = R Then
  51.         y = y + 1
  52.         For i = 1 To N
  53.             Trr(x, y) = Trr(x, y) & Arr(x, i) & " "
  54.         Next i
  55.         Trr(x, y) = Trr(x, y) & T
  56.         d(Trr(x, y)) = d(Trr(x, y)) + 1
  57.         Exit Sub
  58.     End If
  59.     DiGui N - 1, R, T
  60.     DiGui N - 1, R - 1, Arr(x, N) & " " & T
  61.    
  62. End Sub

  63. Function JCnum(xNum As Long) As Long
  64.    
  65.     JCnum = xNum
  66.     If xNum = 1 Then JCnum = 1: Exit Function
  67.     JCnum = JCnum * JCnum(xNum - 1)

  68. End Function
复制代码

副本查找组合.zip

23.33 KB, 下载次数: 5

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

本版积分规则

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

GMT+8, 2024-9-30 02:24 , Processed in 0.033366 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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