Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: On_fire

[已解决]一个Vba的超级难题求解…恳求大神出手...!

[复制链接]
发表于 2017-5-11 08:44 | 显示全部楼层
结果必须顺序是可以的,你的例子里面都是条件?和AB等等,很方便确定顺序,但是实际应用时可能会变成各种各样奇怪的物品,无法从字符串直接确定顺序,必须要做一次排序了。
回复

使用道具 举报

 楼主| 发表于 2017-5-11 16:06 | 显示全部楼层
大灰狼1976 发表于 2017-5-11 08:44
结果必须顺序是可以的,你的例子里面都是条件?和AB等等,很方便确定顺序,但是实际应用时可能会变成各种各 ...

谢谢老师
考虑到实际用途的需求要添加一项统计(蓝色区域 ),
请您看看截图

ScreenHunter_26702 May. 11.jpg
ScreenHunter_26703 May. 11.jpg
回复

使用道具 举报

发表于 2017-5-18 16:05 | 显示全部楼层
  1. Sub aaa()
  2. Dim arr, s$, s1$, i&, j&, k&, d As Object, brr, crr, a&, b&, c&, n&, r&, r1&, mx$, rx&, tmp$
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("a4:g" & [a65536].End(3).Row)
  5. For i = 1 To UBound(arr)
  6.   For j = 1 To 3
  7.     For k = j To 4
  8.       mx = arr(i, j)
  9.       If mx > arr(i, k) Then
  10.         mx = arr(i, k)
  11.         rx = k
  12.       End If
  13.     Next k
  14.     If mx <> arr(i, j) Then
  15.       tmp = arr(i, j)
  16.       arr(i, j) = arr(i, rx)
  17.       arr(i, rx) = tmp
  18.     End If
  19.   Next j
  20. Next i
  21. n = InputBox("Please input ...")
  22. [j:y].ClearContents
  23. ReDim brr(1 To Application.Combin(4, n) * UBound(arr), 1 To n + 4)
  24. crr = brr
  25. For i = 1 To UBound(arr)
  26.   For a = 1 To 5 - n
  27.     For b = a + 1 To 6 - n
  28.       For c = b + 1 To 7 - n
  29.         s = arr(i, a) & arr(i, b) & arr(i, 6) & arr(i, 7)
  30.         If n = 3 Then s = s & arr(i, c)
  31.         If Not d.exists(s) Then
  32.           r = r + 1
  33.           d(s) = r
  34.           brr(r, 1) = arr(i, a)
  35.           brr(r, 2) = arr(i, b)
  36.           If n = 3 Then brr(r, 3) = arr(i, c)
  37.           brr(r, n + 2) = arr(i, 6)
  38.           brr(r, n + 3) = arr(i, 7)
  39.         End If
  40.         brr(d(s), n + 4) = brr(d(s), n + 4) + 1
  41.         If n = 2 Then Exit For
  42.       Next c
  43.     Next b
  44.   Next a
  45. Next i
  46. d.RemoveAll
  47. For i = 1 To r
  48.   s = ""
  49.   For j = 1 To n
  50.     s = s & brr(i, j)
  51.   Next j
  52.   s1 = s
  53.   s = s & brr(i, UBound(brr, 2) - 2) & brr(i, UBound(brr, 2) - 1)
  54.   s1 = s1 & brr(i, UBound(brr, 2) - 1) & brr(i, UBound(brr, 2) - 2)
  55.   If Not d.exists(s) And Not d.exists(s1) Then
  56.     r1 = r1 + 1
  57.     d(s) = r1
  58.     d(s1) = r1
  59.     For j = 1 To UBound(brr, 2) - 1
  60.       crr(r1, j) = brr(i, j)
  61.     Next j
  62.   End If
  63.   crr(d(s), UBound(brr, 2)) = crr(d(s), UBound(brr, 2)) + brr(i, UBound(brr, 2))
  64. Next i
  65. [j4].Resize(r, n + 4) = brr
  66. [s4].Resize(r1, n + 4) = crr
  67. End Sub
复制代码
回复

使用道具 举报

发表于 2017-5-18 16:14 | 显示全部楼层    本楼为最佳答案   
  1. Sub aaa()
  2. Dim arr, s$, s1$, i&, j&, k&, d As Object, brr, crr, a&, b&, c&, n&, r&, r1&, mx$, rx&, tmp$
  3. Set d = CreateObject("scripting.dictionary")
  4. arr = Range("a4:g" & [a65536].End(3).Row)
  5. For i = 1 To UBound(arr)
  6.   For j = 1 To 3
  7.     For k = j To 4
  8.       mx = arr(i, j)
  9.       If mx > arr(i, k) Then
  10.         mx = arr(i, k)
  11.         rx = k
  12.       End If
  13.     Next k
  14.     If mx <> arr(i, j) Then
  15.       tmp = arr(i, j)
  16.       arr(i, j) = arr(i, rx)
  17.       arr(i, rx) = tmp
  18.     End If
  19.   Next j
  20. Next i
  21. n = InputBox("Please input ...")
  22. [j:y].ClearContents
  23. For k = 1 To 2
  24.   ReDim brr(1 To Application.Combin(4, n) * UBound(arr), 1 To n + 4)
  25.   If k = 2 Then
  26.     For r1 = 2 To UBound(arr)
  27.       If arr(r1, 6) > arr(r1, 7) Then
  28.         tmp = arr(r1, 6)
  29.         arr(r1, 6) = arr(r1, 7)
  30.         arr(r1, 7) = tmp
  31.       End If
  32.     Next r1
  33.   End If
  34.   For i = 1 To UBound(arr)
  35.     For a = 1 To 5 - n
  36.       For b = a + 1 To 6 - n
  37.         For c = b + 1 To 7 - n
  38.           s = arr(i, a) & arr(i, b) & arr(i, 6) & arr(i, 7)
  39.           If n = 3 Then s = s & arr(i, c)
  40.           If Not d.exists(s) Then
  41.             r = r + 1
  42.             d(s) = r
  43.             brr(r, 1) = arr(i, a)
  44.             brr(r, 2) = arr(i, b)
  45.             If n = 3 Then brr(r, 3) = arr(i, c)
  46.             brr(r, n + 2) = arr(i, 6)
  47.             brr(r, n + 3) = arr(i, 7)
  48.           End If
  49.           brr(d(s), n + 4) = brr(d(s), n + 4) + 1
  50.           If n = 2 Then Exit For
  51.         Next c
  52.       Next b
  53.     Next a
  54.   Next i
  55.   d.RemoveAll
  56.   If k = 1 Then [j4].Resize(r, n + 4) = brr Else [s4].Resize(r, n + 4) = brr
  57.   r = 0
  58. Next k
  59. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-5-18 16:43 | 显示全部楼层
本帖最后由 On_fire 于 2017-5-27 15:37 编辑

非常感谢老师,


您的代码, 会帮助到很多有需要的



太好了, 上天可以让我遇到你们几位大好人

好人一生平安, 祝福你们万事如意!!!

回复

使用道具 举报

 楼主| 发表于 2017-5-27 15:38 | 显示全部楼层

老师,
我已找到一个参考, 是香川老师的代码

ScreenHunter_27266 May. 26.jpg

评分

参与人数 1 +4 收起 理由
france723 + 4 能自己学习思考赞一个

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-29 22:03 , Processed in 0.342414 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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