求助:用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个数的组合同理,限定数字递增顺序,避免重复计算,同时检查每个数的频率要求。
- 对于2个数的组合:找所有
- 最后把找到的所有符合条件的组合输出到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
相关产品推荐
相关产品推荐

