|
本帖最后由 香川群子 于 2014-9-8 12:16 编辑
彩民最喜欢组合什么的了,但自己又不会搞……呵呵。
附件功能为:
A列区域内多列写入待组合的数字,然后每个列中只取一个数进行组合。
要求生成的组合内数字不重复,并排序。- Dim sj, jl(), jg&(), dic, m&, n&, k&
- Sub kagawa() '香川多列不重复组合
- tms = Timer
-
- sj = [a1].CurrentRegion '数据读入数组sj
- ReDim jl(1 To WorksheetFunction.Max(sj)) '找到最大值并定义记录组内不重复的数组jl
-
- m = UBound(sj): n = UBound(sj, 2) '读取行数m、列数n
- ReDim jg&(m ^ n, n - 1) '定义输出组合结果的数组jg
-
- Set dic = CreateObject("Scripting.Dictionary") '设置去重复用字典dic
-
- k = 0: Call dgMN(1) '调用递归
- MsgBox Format(Timer - tms, "0.000s ") & k '运行耗时及组合结果数k
-
- With [a1].Offset(, n + 2)
- .CurrentRegion = "" '清空
- .Resize(k, n) = jg '输出
- .Resize(, n).EntireColumn.AutoFit '列幅调整
- For j = n To 1 Step -1
- .Resize(k, n).Sort .Offset(, j - 1), 1 '排序
- Next
- End With
-
- End Sub
- Sub dgMN(j&)
- Dim i&, k2&, l&, r$, s, t&
- For i = 1 To m '遍历各行
- t = sj(i, j): If t = 0 Then Exit For '本列无数据时退出
-
- If jl(t) = "" Then '组内记录不重复时继续
- jl(t) = t '记录这一组中该值t已被占用
- If j = n Then '递归到最后一列时
- r = WorksheetFunction.Trim(Join(jl)) '从记录中提取该组 从小到大不重复的组合结果r
- If Not dic.Exists(r) Then '字典检查不重复时
- dic(r) = "" '加入字典
-
- s = Split(r) '拆分该组合结果r
- For l = 0 To n - 1
- jg(k, l) = s(l) '输出该组合到结果数组jg
- Next
- k = k + 1 '结果记录序号k+1
- End If
- Else
- Call dgMN(j + 1) '还不到最后一列时 继续递归进入下一列
- End If
- jl(t) = "" '记录中释放该值
- End If
- Next
- End Sub
复制代码
香川多列组合递归+字典去重复.rar
(12.69 KB, 下载次数: 904)
|
评分
-
3
查看全部评分
-
|