You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:用Excel VBA实现1-59数字指定和组合查询(含频率限制)

当然可以用VBA搞定这个问题!我会给你梳理清楚思路,再附上能直接运行的代码,帮你找出所有符合条件的组合。

核心思路
  • 第一步先把你的数字和对应频率存到字典里,这样要查某个数字还能用多少次的时候,一秒就能拿到结果,效率很高。
  • 针对你要的4类组合(2、3、4、5个数之和为60),我们分别写遍历逻辑:
    • 对于2个数的组合:找所有a + b = 60的配对,而且a < b(避免重复,比如1+59和59+1只算一次),同时a和b的频率都至少是1。
    • 对于3个数的组合:遍历a < b < c,满足a + b + c = 60,且每个数的频率≥1。
    • 4个数和5个数的组合同理,限定数字递增顺序,避免重复计算,同时检查每个数的频率要求。
  • 最后把找到的所有符合条件的组合输出到Excel工作表里,方便你查看。
VBA代码实现

你可以把数字放在Excel的A列(从A2开始,A1写“数字”),对应频率放在B列(B1写“频率”),然后打开VBA编辑器(按Alt+F11),插入一个模块,把下面的代码粘进去:

Sub FindSum60Combinations()
    Dim numFreq As Object
    Set numFreq = CreateObject("Scripting.Dictionary")
    
    ' 读取A、B列的数字和频率数据
    Dim lastRow As Long
    lastRow = ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, "A").End(xlUp).Row
    Dim i As Long
    For i = 2 To lastRow
        Dim num As Integer
        num = ThisWorkbook.Sheets("Sheet1").Cells(i, "A").Value
        Dim freq As Integer
        freq = ThisWorkbook.Sheets("Sheet1").Cells(i, "B").Value
        If num >= 1 And num <= 59 Then
            numFreq(num) = freq
        End If
    Next i
    
    ' 准备输出工作表,先清空旧内容
    Dim outputSheet As Worksheet
    Set outputSheet = ThisWorkbook.Sheets("Sheet1")
    outputSheet.Range("D1:Z1000").ClearContents
    outputSheet.Cells(1, "D").Value = "组合类型"
    outputSheet.Cells(1, "E").Value = "组合"
    outputSheet.Cells(1, "F").Value = "各数频率是否满足"
    
    Dim outputRow As Long
    outputRow = 2
    
    ' --- 1. 找2个数之和为60的组合 ---
    Dim a As Integer, b As Integer
    For a = 1 To 29
        b = 60 - a
        If numFreq.Exists(a) And numFreq.Exists(b) Then
            If numFreq(a) >= 1 And numFreq(b) >= 1 Then
                outputSheet.Cells(outputRow, "D").Value = "2个数组合"
                outputSheet.Cells(outputRow, "E").Value = a & " + " & b
                outputSheet.Cells(outputRow, "F").Value = "是"
                outputRow = outputRow + 1
            End If
        End If
    Next a
    
    ' --- 2. 找3个数之和为60的组合 ---
    Dim c As Integer
    For a = 1 To 19
        For b = a + 1 To (60 - a) \ 2
            c = 60 - a - b
            If c > b And numFreq.Exists(a) And numFreq.Exists(b) And numFreq.Exists(c) Then
                If numFreq(a) >= 1 And numFreq(b) >= 1 And numFreq(c) >= 1 Then
                    outputSheet.Cells(outputRow, "D").Value = "3个数组合"
                    outputSheet.Cells(outputRow, "E").Value = a & " + " & b & " + " & c
                    outputSheet.Cells(outputRow, "F").Value = "是"
                    outputRow = outputRow + 1
                End If
            End If
        Next b
    Next a
    
    ' --- 3. 找4个数之和为60的组合 ---
    Dim d As Integer
    For a = 1 To 14
        For b = a + 1 To (60 - a) \ 3
            For c = b + 1 To (60 - a - b) \ 2
                d = 60 - a - b - c
                If d > c And numFreq.Exists(a) And numFreq.Exists(b) And numFreq.Exists(c) And numFreq.Exists(d) Then
                    If numFreq(a) >= 1 And numFreq(b) >= 1 And numFreq(c) >= 1 And numFreq(d) >= 1 Then
                        outputSheet.Cells(outputRow, "D").Value = "4个数组合"
                        outputSheet.Cells(outputRow, "E").Value = a & " + " & b & " + " & c & " + " & d
                        outputSheet.Cells(outputRow, "F").Value = "是"
                        outputRow = outputRow + 1
                    End If
                End If
            Next c
        Next b
    Next a
    
    ' --- 4. 找5个数之和为60的组合 ---
    Dim e As Integer
    For a = 1 To 10
        For b = a + 1 To (60 - a) \ 4
            For c = b + 1 To (60 - a - b) \ 3
                For d = c + 1 To (60 - a - b - c) \ 2
                    e = 60 - a - b - c - d
                    If e > d And numFreq.Exists(a) And numFreq.Exists(b) And numFreq.Exists(c) And numFreq.Exists(d) And numFreq.Exists(e) Then
                        If numFreq(a) >= 1 And numFreq(b) >= 1 And numFreq(c) >= 1 And numFreq(d) >= 1 And numFreq(e) >= 1 Then
                            outputSheet.Cells(outputRow, "D").Value = "5个数组合"
                            outputSheet.Cells(outputRow, "E").Value = a & " + " & b & " + " & c & " + " & d & " + " & e
                            outputSheet.Cells(outputRow, "F").Value = "是"
                            outputRow = outputRow + 1
                        End If
                    End If
                Next d
            Next c
        Next b
    Next a
    
    MsgBox "所有符合条件的组合已找到,结果输出在D:F列!", vbInformation
End Sub
代码说明
  • 字典numFreq用来存储每个数字的可用频率,读取数据的时候自动过滤掉1-59以外的数字(如果有的话)。
  • 每种组合的循环都限定了数字的递增顺序(比如a < b < c...),这样就不会出现重复的组合,大大减少了计算量。
  • 每个组合都会检查对应的数字是否存在于字典中,以及频率是否≥1,确保符合你的要求。
  • 结果会输出到当前工作表的D:F列,清晰标注组合类型、具体组合和是否满足频率要求。

内容的提问来源于stack exchange,提问作者haoran zhang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:12:57