ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 【关于多列组合问题】的求助 (香川多列组合)

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-23 11:41 | 显示全部楼层
香川群子 发表于 2014-7-23 11:36
更多列也没关系……代码已经在8楼贴出了。

想穿裙子女侠太给力了,完美,完美,谢谢,谢谢!

TA的精华主题

TA的得分主题

发表于 2014-7-23 12:01 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
楼主请把标题改一下:

【关于多列组合问题】的求助 (香川多列组合)

TA的精华主题

TA的得分主题

发表于 2014-7-23 18:39 | 显示全部楼层
香川群子 发表于 2014-7-23 11:13
附件也只是2列……会有更多列么?
下面这个是通用的【香川多列组合】的递归算法代码:

结果怎么不是合并起来的?

多列组合.rar

11.45 KB, 下载次数: 59

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-7-24 13:07 来自手机 | 显示全部楼层
张雄友 发表于 2014-7-23 18:39
结果怎么不是合并起来的?

根据我的请求做的

TA的精华主题

TA的得分主题

发表于 2014-7-24 13:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 香川群子 于 2014-7-24 14:23 编辑
中山郎 发表于 2014-7-24 13:07
根据我的请求做的

稍稍修改一下,把各列元素合并组合为一个字符串然后输出的代码:

需要输入分隔符。(可以默认留空,或直接在代码中固化设置好。)

  1. Dim sj, jg(), m&, n&, k&, w$  '公共变量中增加了一个分隔符w$变量
  2. Sub MultiColumnCombin() 'by kagawa
  3.     Dim i&, j&, tms#
  4.    
  5.     'l = MsgBox("Yes to output Multi-Columns, No to only One Column", vbYesNo)
  6.     'If l = vbNo Then w = InputBox("Please input insert-word", "One Column Only")
  7.     l = MsgBox("是 = 多列输出,  否 = 单列合并输出", vbYesNo)
  8.     If l = vbNo Then w = InputBox("请输入分隔字符", "单列合并输出")
  9.     '如果单列输出时不需要分隔符,或把分隔符设置为固定字符串,那么这一句可以改成这样
  10.     'If l = vbNo Then w = "" '不需要分隔符时
  11.     'If l = vbNo Then w = "-" '固定设置为中杠或其它字符串时 (分隔符长度不限)   
  12.     tms = Timer
  13.    
  14.     sj = [a1].CurrentRegion
  15.     m = UBound(sj): n = UBound(sj, 2)
  16.     k = 1
  17.     For j = 1 To n
  18.         For i = 1 To m
  19.             If sj(i, j) = "" Then Exit For
  20.         Next
  21.         If i > m Then k = k * m Else k = k * i
  22.     Next
  23.    
  24.     [a1].Offset(, n + 2).CurrentRegion = ""
  25.     If l = vbYes Then '多列输出时
  26.         ReDim jg(k, 1 To n)
  27.         k = 0: Call dgMN(1)
  28.         [a1].Offset(, n + 2).Resize(k, n) = jg
  29.     Else '单列合并字符串输出时
  30.         ReDim jg(k, 0)
  31.         k = 0: Call dgMN1("", 1)
  32.         [a1].Offset(, n + 2).Resize(k) = jg
  33.     End If
  34.     MsgBox Format(Timer - tms, "0.000s ") & k
  35. End Sub

  36. Sub dgMN(j&) '多列输出时的递归过程
  37.     Dim i&, l&
  38.     For i = 1 To m
  39.         If sj(i, j) = "" Then
  40.             Exit For
  41.         Else
  42.             jg(k, j) = sj(i, j)
  43.             If j = n Then
  44.                 For l = 1 To n
  45.                     If jg(k, l) = "" Then jg(k, l) = jg(k - 1, l) Else Exit For
  46.                 Next
  47.                 k = k + 1
  48.             Else
  49.                 Call dgMN(j + 1)
  50.             End If
  51.         End If
  52.     Next
  53. End Sub
  54. Sub dgMN1(s$, j&) '单列合并输出时的递归过程
  55.     Dim i&
  56.     For i = 1 To m
  57.         If sj(i, j) = "" Then
  58.             Exit For
  59.         Else
  60.             If j = n Then
  61.                 jg(k, 0) = Mid(s & w & sj(i, j), Len(w) + 1): k = k + 1
  62.             Else
  63.                 Call dgMN1(s & w & sj(i, j), j + 1)
  64.             End If
  65.         End If
  66.     Next
  67. End Sub
复制代码
上面代码可以由用户自己选择输出【多列/或单列合并】方式。其实也很简单那。



评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-8-21 15:37 | 显示全部楼层
好棒,根据自己的需求改成从每一行取一个元素,也运行成功了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 11:56 , Processed in 0.023366 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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