ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 6818|回复: 30

[求助] 求单元格数据全排列的vba程序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-10-5 22:49 | 显示全部楼层 |阅读模式

1、在b2开始的b列各单元格中分别填有不同的数据、各数据间空一格,
2、写出b列各单元格每组数据的全排列并依次输入到从d2开始的d列各单元格中且各数据间空一格,当d列填写完后就自动换列到从e2开始的e列,依次类推,
3、例如:b2单元格的数据:1 2 3 的全排列填在d2开始的d2-d7单元格,那么b3单元格的数据:4 5 6 7 的全排列就从d8开始填直到d31,b4单元格的数据:3 1 3 5 7 的全排列就从d32开始填直到d91,当d列填写完后就自动换到从e2开始的e列,

谢谢 !
数据排序.zip (10.54 KB, 下载次数: 43)

TA的精华主题

TA的得分主题

发表于 2012-10-6 00:59 | 显示全部楼层
有点难度:
  1. Dim aStr As Variant, crr() As String

  2. Sub 宏1()
  3.     Dim arr() As String, brr
  4.     Dim s As String, n As Integer, i As Long, r As Long
  5.     brr = Range("b2:b" & Range("b" & Rows.count).End(xlUp).Row)
  6.     [d:d].ClearContents
  7.     For i = 1 To UBound(brr)
  8.         s = brr(i, 1)
  9.         n = (Len(s) + 1) / 2
  10.         r = Application.Permut(n, n)
  11.         ReDim arr(1 To r)
  12.         ReDim crr(1 To r, 1 To 1)
  13.         aStr = Split(s)
  14.         getall n - 1, n, "", arr, 0
  15.         Range("d" & Rows.count).End(xlUp).Offset(1).Resize(r) = crr
  16.     Next
  17. End Sub

  18. Sub getall(ByVal m As Integer, ByVal n As Integer, ByRef a As String, ByRef arr() As String, Optional ByRef count As Long)
  19.     Dim i As Long, j As Long, s As String
  20.     If Len(a) = n Then
  21.         count = count + 1
  22.         arr(count) = a
  23.         s = ""
  24.         For j = 1 To n
  25.             s = s & " " & aStr(Mid(a, j, 1))
  26.         Next
  27.         crr(count, 1) = Mid(s, 2)
  28.         Exit Sub
  29.     End If
  30.     For i = 0 To m
  31.         If InStr(a, i) = 0 Then getall m, n, a & i, arr, count
  32.     Next i
  33. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2012-10-6 01:01 | 显示全部楼层
请看附件
数据排序.rar (26.51 KB, 下载次数: 57)

TA的精华主题

TA的得分主题

发表于 2012-10-6 01:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. '翻译一下
  2. '注:只翻译最接近【最佳答案】和有【疑问】的帖子
  3. 有点难度:
  4. Dim aStr As Variant, crr() As String
  5. Sub 宏1()
  6.     Dim arr() As String, brr
  7.     Dim s As String, n As Integer, i As Long, r As Long
  8.     brr = Range("b2:b" & Range("b" & Rows.count).End(xlUp).Row)
  9.     [d:d].ClearContents
  10.     For i = 1 To UBound(brr)
  11.         s = brr(i, 1)
  12.         n = (Len(s) + 1) / 2
  13.         r = Application.Permut(n, n)
  14.         ReDim arr(1 To r)
  15.         ReDim crr(1 To r, 1 To 1)
  16.         aStr = Split(s)
  17.         getall n - 1, n, "", arr, 0
  18.         Range("d" & Rows.count).End(xlUp).Offset(1).Resize(r) = crr
  19.     Next
  20. End Sub
  21. Sub getall(ByVal m As Integer, ByVal n As Integer, ByRef a As String, ByRef arr() As String, Optional ByRef count As Long)
  22.     Dim i As Long, j As Long, s As String
  23.     If Len(a) = n Then
  24.         count = count + 1
  25.         arr(count) = a
  26.         s = ""
  27.         For j = 1 To n
  28.             s = s & " " & aStr(Mid(a, j, 1))
  29.         Next
  30.         crr(count, 1) = Mid(s, 2)
  31.         Exit Sub
  32.     End If
  33.     For i = 0 To m
  34.         If InStr(a, i) = 0 Then getall m, n, a & i, arr, count
  35.     Next i
  36. End Sub
  37. 普通浏览复制代码保存代码打印代码
  38. Dim aStr As Variant, crr() As String
  39. Sub 宏1()
  40.     Dim arr() As String, brr
  41.     Dim s As String, n As Integer, i As Long, r As Long
  42.     brr = Range("b2:b" & Range("b" & Rows.count).End(xlUp).Row)
  43.     [d:d].ClearContents
  44.     For i = 1 To UBound(brr)
  45.         s = brr(i, 1)
  46.         n = (Len(s) + 1) / 2
  47.         r = Application.Permut(n, n)
  48.         ReDim arr(1 To r)
  49.         ReDim crr(1 To r, 1 To 1)
  50.         aStr = Split(s)
  51.         getall n - 1, n, "", arr, 0
  52.         Range("d" & Rows.count).End(xlUp).Offset(1).Resize(r) = crr
  53.     Next
  54. End Sub
  55. Sub getall(ByVal m As Integer, ByVal n As Integer, ByRef a As String, ByRef arr() As String, Optional ByRef count As Long)
  56.     Dim i As Long, j As Long, s As String
  57.     If Len(a) = n Then
  58.         count = count + 1
  59.         arr(count) = a
  60.         s = ""
  61.         For j = 1 To n
  62.             s = s & " " & aStr(Mid(a, j, 1))
  63.         Next
  64.         crr(count, 1) = Mid(s, 2)
  65.         Exit Sub
  66.     End If
  67.     For i = 0 To m
  68.         If InStr(a, i) = 0 Then getall m, n, a & i, arr, count
  69.     Next i
  70. End Sub


  71. 有点难度:
  72. 定义变量 为tr 为 变体数据类型 ,crr() 为 字符串
  73. 过程 宏1()
  74.     定义变量 arr() 为 字符串 ,brr
  75.     定义变量 s 为 字符串 ,n 为 整型值 ,i 为 长整型值 ,r 为 长整型值
  76.     brr = 单元格区域("b2:b" & 单元格区域("b" & 行数 . 计数值) . 结束(方向向上) . 行标)
  77.     [d:d] . 清除内容
  78.     循环范围 i = 1 到 数组上限(brr)
  79.         s = brr(i ,1)
  80.         n = (字符串长度(s) + 1) / 2
  81.         r = 应用程序 . permut(n ,n)
  82.         重定义变量 arr(1 到 r)
  83.         重定义变量 crr(1 到 r ,1 到 1)
  84.         astr = 分割字符串(s)
  85.         getall n - 1 ,n ,"" ,arr ,0
  86.         单元格区域("d" & 行数 . 计数值) . 结束(方向向上) . 偏移(1) . 重调大小(r) = crr
  87.     下一句
  88. 结束 过程
  89. 过程 getall(传值变量 m 为 整型值 ,传值变量 n 为 整型值 ,传址 a 为 字符串 ,传址 arr() 为 字符串 ,选择 传址 计数值 为 长整型值)
  90.     定义变量 i 为 长整型值 ,j 为 长整型值 ,s 为 字符串
  91.     如果 字符串长度(a) = n 那么
  92.         计数值 = 计数值 + 1
  93.         arr(计数值) = a
  94.         s = ""
  95.         循环范围 j = 1 到 n
  96.             s = s & " " & astr(截取字符串(a ,j ,1))
  97.         下一句
  98.         crr(计数值 ,1) = 截取字符串(s ,2)
  99.         退出 过程
  100.     结束 如果
  101.     循环范围 i = 0 到 m
  102.         如果 包含位置(a ,i) = 0 那么 getall m ,n ,a & i ,arr ,计数值
  103.     下一句 i
  104. 结束 过程
  105. 普通浏览复制代码保存代码打印代码
  106. 定义变量 为tr 为 变体数据类型 ,crr() 为 字符串
  107. 过程 宏1()
  108.     定义变量 arr() 为 字符串 ,brr
  109.     定义变量 s 为 字符串 ,n 为 整型值 ,i 为 长整型值 ,r 为 长整型值
  110.     brr = 单元格区域("b2:b" & 单元格区域("b" & 行数 . 计数值) . 结束(方向向上) . 行标)
  111.     [d:d] . 清除内容
  112.     循环范围 i = 1 到 数组上限(brr)
  113.         s = brr(i ,1)
  114.         n = (字符串长度(s) + 1) / 2
  115.         r = 应用程序 . permut(n ,n)
  116.         重定义变量 arr(1 到 r)
  117.         重定义变量 crr(1 到 r ,1 到 1)
  118.         astr = 分割字符串(s)
  119.         getall n - 1 ,n ,"" ,arr ,0
  120.         单元格区域("d" & 行数 . 计数值) . 结束(方向向上) . 偏移(1) . 重调大小(r) = crr
  121.     下一句
  122. 结束 过程
  123. 过程 getall(传值变量 m 为 整型值 ,传值变量 n 为 整型值 ,传址 a 为 字符串 ,传址 arr() 为 字符串 ,选择 传址 计数值 为 长整型值)
  124.     定义变量 i 为 长整型值 ,j 为 长整型值 ,s 为 字符串
  125.     如果 字符串长度(a) = n 那么
  126.         计数值 = 计数值 + 1
  127.         arr(计数值) = a
  128.         s = ""
  129.         循环范围 j = 1 到 n
  130.             s = s & " " & astr(截取字符串(a ,j ,1))
  131.         下一句
  132.         crr(计数值 ,1) = 截取字符串(s ,2)
  133.         退出 过程
  134.     结束 如果
  135.     循环范围 i = 0 到 m
  136.         如果 包含位置(a ,i) = 0 那么 getall m ,n ,a & i ,arr ,计数值
  137.     下一句 i
  138. 结束 过程



复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-10-6 08:19 | 显示全部楼层
zhaogang1960 发表于 2012-10-6 01:01
请看附件

For i = 0 To m
第一次循环的时候M就等于2,前面没给M赋值,M为什么会等于2,请教赵老师

点评

getall n - 1, n, "", arr, 0其中n-1就是m  发表于 2012-10-6 12:44

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-6 08:20 | 显示全部楼层
本帖最后由 CAONI 于 2012-10-6 12:22 编辑
zhaogang1960 发表于 2012-10-6 00:59
有点难度:

版主你好,我用2003测试了一下,在b列填入6位数字时最多到b92(b2-b92),当b93填入时就出现:类型不匹配的提示,Range("d" & Rows.count).End(xlUp).Offset(1).Resize(r) = crr显示黄色,也就是说:d列只能填入到d65521而不是65536,我原本想:当d列填写完后就自动换列到从e2开始的e列,依次类推,也就是说b列填入数字其行不受限制,麻烦你修改一下,谢谢!

排序.zip (19.05 KB, 下载次数: 17)

TA的精华主题

TA的得分主题

发表于 2012-10-6 12:18 | 显示全部楼层
CAONI 发表于 2012-10-6 08:20
版主你好,我用2003测试了一下,在b列填入6位数字时最多到b92(b2-b92),当b93填入时就出现:类型不匹配的 ...
  1. Dim aStr As Variant, crr() As String


  2. Sub 宏1()
  3.     Dim arr() As String, brr
  4.     Dim s As String, n As Long, i As Long, r As Long, c As Long
  5.     Application.ScreenUpdating = False
  6.     brr = Range("b2:b" & Range("b" & Rows.count).End(xlUp).Row)
  7.     ActiveSheet.UsedRange.Offset(, 3).ClearContents
  8.     c = 4
  9.     For i = 1 To UBound(brr)
  10.         s = brr(i, 1)
  11.         n = (Len(s) + 1) / 2
  12.         r = Application.Permut(n, n)
  13.         ReDim arr(1 To r)
  14.         ReDim crr(1 To r, 1 To 1)
  15.         aStr = Split(s)
  16.         getall n - 1, n, "", arr, 0
  17.             lr = Cells(Rows.count, c).End(xlUp).Row
  18.         If Rows.count - lr < r Then
  19.             c = c + 1
  20.             lr = 1
  21.         End If
  22.         Cells(lr + 1, c).Resize(r) = crr
  23.     Next
  24.     Application.ScreenUpdating = True
  25. End Sub

  26. Sub getall(ByVal m As Long, ByVal n As Long, ByRef a As String, ByRef arr() As String, Optional ByRef count As Long)
  27.     Dim i As Long, j As Long, s As String
  28.     If Len(a) = n Then
  29.         count = count + 1
  30.         arr(count) = a
  31.         s = ""
  32.         For j = 1 To n
  33.             s = s & " " & aStr(Mid(a, j, 1))
  34.         Next
  35.         crr(count, 1) = Mid(s, 2)
  36.         Exit Sub
  37.     End If
  38.     For i = 0 To m
  39.         If InStr(a, i) = 0 Then getall m, n, a & i, arr, count
  40.     Next i

  41. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2012-10-6 12:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请看附件
排序.rar (19.37 KB, 下载次数: 53)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-10-6 12:43 | 显示全部楼层
本帖最后由 zhaogang1960 于 2012-10-6 21:16 编辑

改进一下,每列填充到最下面一行后,再从下列开始填充:
  1. Dim aStr As Variant, crr() As String, mm As Long


  2. Sub 宏1()
  3.     Dim arr() As String, drr() As String, brr
  4.     Dim s As String, n As Long, i As Long, j As Long, r As Long, c As Long, lr As Long
  5.     Application.ScreenUpdating = False
  6.     brr = Range("b2:b" & Range("b" & Rows.count).End(xlUp).Row)
  7.     ActiveSheet.UsedRange.Offset(, 3).ClearContents
  8.     ReDim drr(1 To Rows.count - 1, 1 To 1)
  9.     c = 4
  10.     For i = 1 To UBound(brr)
  11.         s = brr(i, 1)
  12.         n = (Len(s) + 1) / 2
  13.         r = Application.Permut(n, n)
  14.         ReDim arr(1 To r)
  15.         ReDim crr(1 To r)
  16.         aStr = Split(s)
  17.         getall n - 1, n, "", arr, 0
  18.         For j = 1 To r
  19.             If mm = Rows.count - 1 Then
  20.                 Cells(2, c).Resize(mm) = drr
  21.                 c = c + 1
  22.                 mm = 0
  23.             End If
  24.             mm = mm + 1
  25.             drr(mm, 1) = crr(j)
  26.         Next
  27.     Next
  28.     If mm Then Cells(2, c).Resize(mm) = drr
  29.     mm = 0
  30.     Erase aStr, crr
  31.     Application.ScreenUpdating = True
  32. End Sub

  33. Sub getall(ByVal m As Long, ByVal n As Long, ByRef a As String, ByRef arr() As String, Optional ByRef count As Long)
  34.     Dim i As Long, j As Long, s As String
  35.     If Len(a) = n Then
  36.         count = count + 1
  37.         arr(count) = a
  38.         s = ""
  39.         For j = 1 To n
  40.             s = s & " " & aStr(Mid(a, j, 1))
  41.         Next
  42.         crr(count) = Mid(s, 2)
  43.         Exit Sub
  44.     End If
  45.     For i = 0 To m
  46.         If InStr(a, i) = 0 Then getall m, n, a & i, arr, count
  47.     Next i
  48. End Sub

复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-10-6 12:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zhaogang1960 发表于 2012-10-6 12:19
请看附件

版主你好,你的功力真深厚,这下能很好的运行了,谢谢,谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-7-1 16:23 , Processed in 0.055942 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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