|
楼主 |
发表于 2014-5-22 09:31
|
显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
zhu918918 发表于 2014-5-22 00:38
香川群子老师,有几个问题非常想请教您,首先是如何组合附件中的数据(ab2:ag35),每组6个。谢谢了!(希望 ...
代码如附件。
附件为2003版,可自行转为2007版后使用。
请在AB列中输入原始数据的行序号,如果输入错误或留有空白间隔将影响原始数据读取。- Dim sj&(), jg&(), m&, n&, k&, cnt&, cnt2&
- Sub MultiColumnCombin() 'by kagawa
-
- sj0 = [aa1].CurrentRegion.Offset(1, 1)
- '以AA1列中序号的行数决定原始数据区域大小。所以序号不能错!
-
- m = UBound(sj0) - 1: n = UBound(sj0, 2) - 1
- ReDim sj&(1 To m, 1 To n)
- For j = 1 To n
- k = 0
- For i = 1 To m
- If sj0(i, j) Then k = k + 1: sj(k, j) = sj0(i, j)
- Next
- If k > l Then l = k
- Next
- '以上把数据转为Long型数值 可以提高计算速度。
- m = l 'm更新为有效最大行数l 减少无效循环次数。
- cnt = [ai1]: ReDim jg&(cnt, 1 To n)
- '根据AI1中指定数值作为输出行数 如5万行,或100万行都可以。这样2003和2007都可以适用了。
- cnt2 = 1: [iv1].End(1).Offset(, 2) = cnt2
-
- k = 0: Call dgMN(1) '递归计算 并输出整数行的结果
- If k Then [iv1].End(1).Offset(1, 1).Resize(k, n) = jg '输出最后零数行的结果
- End Sub
- Sub dgMN(j&) '递归过程代码
- Dim i&, l&
- For i = 1 To m '循环本列
- If sj(i, j) = 0 Then Exit For '为空时退出
- jg(k, j) = sj(i, j) '填入组合数据
- If j = n Then '已经到最后一列(=n)时
- For l = 1 To n
- If jg(k, l) Then Exit For Else jg(k, l) = jg(k - 1, l)
- '循环检查如果本列为空则复制上一列数据 不为空则可退出
- Next
- k = k + 1
- If k = cnt Then '如果满足整数行则输出结果
- k = 0: [iv1].End(1).Offset(1, 1).Resize(cnt, n) = jg
- cnt2 = cnt2 + 1: [iv1].End(1).Offset(, 1 + n) = cnt2
- End If
- Else
- Call dgMN(j + 1) '递归到下一列
- End If
- Next
- End Sub
复制代码
MultiColumnCombin.zip
(13.25 KB, 下载次数: 154)
|
|