ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论] “没有最好,只有更好”——论坛“纠客”

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-7-26 19:10 | 显示全部楼层 |阅读模式
“没有最好,只有更好”是好多企业的文化理念;而在情感上,如上《非诚勿扰》,往往更易牵手成功;对于程序,偶也是这么认为。彭版的排列组
合(http://club.excelhome.net/viewth ... 1%D0%2B%D7%EE%D3%C5)算法非常巧妙,但是冠以“最优”,让许
多“纠客”内心蠢蠢欲动,想挑出毛病来。下面就让偶做一下论坛“纠客”吧。
    1、显式地声明数据类型,尽量不要使用Variant类型,省去类型的转换,可以提高不少效力,也节省内存;
    2、一维数组比二维形式速度更快;通过这两步的优化,就算法(不考虑写入文件)约可提高一倍的效率,见Peng2。
    3、对于连接字符串,用“&”效率并不高,特别M值比较大时更是降低效率的凶杀,以N=30、M=6和N=30、M=24为例,取得同样的组合数,后者用时是
前者的4倍多,可以考虑用MID句替之;
    4、用“Open "d:\peng.txt" For Output As #1”逐个写入虽可以防止内存溢出,但效率也降低,可以考虑把数据先存放在数组(内存允许内的大小
),再分次写入文件。这一步待完善。
  1. Option Base 1
  2. 'Dim c() As String
  3. Dim a() As String
  4. Dim b() As Integer
  5. Dim n%, m%, Mn&, nL As Byte, S$, Rng As Range
  6. Public Sub ZhuHe()
  7. Dim cc, x%, Sl$
  8. S = ""
  9. t = Timer
  10. n = Cells(65536, 1).End(3).Row
  11. m = [b1]
  12. ReDim a(n)
  13. ReDim b(m)
  14. r = Range("a1:a" & n)
  15. For Each cc In r
  16.   If Len(cc) > nL Then nL = Len(cc)
  17. Next
  18. Sl = String(nL, "0")
  19. For i = 1 To n
  20.   a(i) = Format(r(i, 1), Sl)
  21. Next
  22. Mn = Application.Combin(n, m)
  23. For i = 1 To m
  24.   b(i) = i
  25.   S = S & " " & a(i)
  26. Next
  27. S = Mid(S, 2)
  28. 'ReDim c(Mn) '数组存放
  29. For i = 1 To Mn
  30. '  c(i) = S '数组存放
  31.   SetS m
  32. Next

  33. Set Rng = [f65536].End(3)(2, 1)
  34. Rng(1, 2) = Format(Timer - t, "0.00")
  35. Rng = Mn
  36. Rng(1, 0) = "Zamyi"

  37. 'Dim Fs As FileSystemObject, F As TextStream '写入文件
  38. 'Set Fs = CreateObject("scripting.filesystemobject")
  39. 'Set F = Fs.OpenTextFile("d:\Text.txt", 2, True)
  40. 'F.Write Join(c, vbNewLine)
  41. 'F.Close
  42. 'Set F = Nothing
  43. 'Set Fs = Nothing
  44. End Sub

  45. Private Sub SetS(ByVal mm%)
  46. If b(mm) = n - m + mm Then
  47.   If mm > 1 Then
  48.     SetS mm - 1
  49.     b(mm) = b(mm - 1) + 1
  50.     Mid(S, (nL + 1) * (mm - 1) + 1, nL) = a(b(mm))
  51.     End If
  52.   Else
  53.   b(mm) = b(mm) + 1
  54.   Mid(S, (nL + 1) * (mm - 1) + 1, nL) = a(b(mm))
  55. End If
  56. End Sub
复制代码

Zamyi_ZhuHe.rar

16.74 KB, 下载次数: 1213

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-7-27 00:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
谢谢分享,学习了!!!!!!!

TA的精华主题

TA的得分主题

发表于 2011-7-27 10:00 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谁注重细节,谁精益求精,谁就会走得更远

TA的精华主题

TA的得分主题

发表于 2011-8-31 17:47 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
For Each cc In r
用循环代替 For Each  会不会快一点呢?

用“&”效率并不高为什么还有&
S = S & " " & a(i)

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-8-31 18:36 | 显示全部楼层
白云2011 发表于 2011-8-31 17:47
For Each cc In r
用循环代替 For Each  会不会快一点呢?

因为“没有最好,只有更好”。

TA的精华主题

TA的得分主题

发表于 2012-1-20 18:44 | 显示全部楼层
应该不错了,好办法!试试看,感谢Zamyi的分享!!

TA的精华主题

TA的得分主题

发表于 2012-2-16 10:05 | 显示全部楼层
折磨与精彩 !

昂首云舒掠飞鸟,欲穷半里空恨足。

TA的精华主题

TA的得分主题

发表于 2012-5-2 18:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
你的执行结果放在哪里了

TA的精华主题

TA的得分主题

发表于 2013-2-21 15:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
好经验,谢谢分享

TA的精华主题

TA的得分主题

发表于 2013-6-9 12:56 | 显示全部楼层
写的真好,谢谢分享!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 07:42 , Processed in 0.035721 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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