Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4461|回复: 10

[已解决]VBA求助 我的这个随机排序 点击后 没有反应 代码应该怎么修改

[复制链接]
发表于 2012-2-6 17:23 | 显示全部楼层 |阅读模式
本帖最后由 爱疯 于 2012-2-6 23:31 编辑

思路:
    先为每个考号添加一个各不相同的随机数字(此表为滚动存入的),再把考生按这些随机数按升序的顺序排列
排列后 生成新的序号(1到有数据的行 结束)(补充:编排结果输出到 随机编号)

代码:
Private Sub 随机编号()Dim arr1(), i As Integer, i1 As Integer, n As Integer, j As Integer, y As Integer, t As Boolean, temp1i = Sheets("提取库").Range("a65536").End(xlUp).RowIf i < 2 Then Exit Subarr1 = Sheets("提取库").Range("a2:e" & i).Valuei = 1Randomize    Do While i <= UBound(arr1)       Do        n = Int((UBound(arr1) * Rnd) + 1)       Loop While n < i       For j = 1 To 5          temp1 = arr1(i, j)          arr1(i, j) = arr1(n, j)          arr1(n, j) = temp1       Next       arr1(i, 1) = i       i = i + 1    LoopFor i = 1 To 2   For j = 1 To 288      n = (i - 1) * 288 + j      If n > UBound(arr1) Then        Exit For        Exit For      End If      arr1(n, 1) = j   Next jNext iSheets("随机编号").Range("a3").Resize(UBound(arr1), 5) = arr1End Sub





最佳答案
2012-2-7 08:55
如果要在VBA内存数组中进行随机排序,那么代码如下:
  1. Sub Macro2()
  2.     With Sheets(1)
  3.         n = .[a65536].End(3).Row - 2
  4.         arr = .[a3].Resize(n, 8)
  5.     End With
  6.     x = WorksheetFunction.Transpose(Application.Index(arr, , 1))
  7.     '获取列序号(或任何作为随机排序依据的列的内容)压入一维数组用来随机
  8.     Call GetRnd(x, n) '调用经典随机洗牌过程 进行高效不重复随机排序
  9.    
  10.     brr = arr
  11.     For i = 1 To n
  12.         brr(i, 1) = i 'brr数组第1列生成新的序号
  13.         For j = 2 To 8
  14.             brr(i, j) = arr(x(i), j) '把arr数组内容按新的随机排序值重新整理数据到brr数组
  15.         Next
  16.     Next
  17.    
  18.     Sheets(2).[a3].Resize(n, 8) = brr '在表2输出结果
  19.     Sheets(2).Activate
  20.    
  21. End Sub

  22. '经典随机洗牌过程代码,以后可以在别的代码中使用
  23. '因此,我把它单独列出,而不是放在过程中。
  24. Sub GetRnd(arr, n)
  25.     Randomize
  26.     For i = 1 To n
  27.         r = Int(Rnd() * (n - i + 1)) + i
  28.         t = arr(r): arr(r) = arr(i): arr(i) = t
  29.     Next
  30. End Sub
复制代码

排序练习02.06.rar

14.62 KB, 下载次数: 20

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2012-2-6 17:46 | 显示全部楼层
直接用按钮运行你的程序即可,何必用窗体?
另:你的附件有病毒!!

评分

参与人数 1 +30 金币 +30 收起 理由
爱疯 + 30 + 30 谢谢给提醒大家

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2012-2-6 18:05 | 显示全部楼层
zjdh 发表于 2012-2-6 17:46
直接用按钮运行你的程序即可,何必用窗体?
另:你的附件有病毒!!

应该不是病毒 是宏的事吧
回复

使用道具 举报

发表于 2012-2-7 08:01 | 显示全部楼层
如果有效利用Excel自身功能,进行随机排序的话,代码如下:

  1. Sub Macro1()
  2.     rw = [a65536].End(3).Row '获取最大行序号
  3.     [a3].Resize(rw - 2).FormulaR1C1 = "=RAND()" 'A列填入随机公式取值
  4.     [a3].Resize(rw - 2, 8).Sort Key1:=[a3], Order1:=xlAscending, Header:=xlNo '按随机值排序
  5.     [a3] = 1:    [a3].Resize(rw - 2).DataSeries Rowcol:=xlColumns, Type:=xlLinear, Step:=1 ‘自动填充
  6. End Sub
复制代码
回复

使用道具 举报

发表于 2012-2-7 08:55 | 显示全部楼层    本楼为最佳答案   
如果要在VBA内存数组中进行随机排序,那么代码如下:
  1. Sub Macro2()
  2.     With Sheets(1)
  3.         n = .[a65536].End(3).Row - 2
  4.         arr = .[a3].Resize(n, 8)
  5.     End With
  6.     x = WorksheetFunction.Transpose(Application.Index(arr, , 1))
  7.     '获取列序号(或任何作为随机排序依据的列的内容)压入一维数组用来随机
  8.     Call GetRnd(x, n) '调用经典随机洗牌过程 进行高效不重复随机排序
  9.    
  10.     brr = arr
  11.     For i = 1 To n
  12.         brr(i, 1) = i 'brr数组第1列生成新的序号
  13.         For j = 2 To 8
  14.             brr(i, j) = arr(x(i), j) '把arr数组内容按新的随机排序值重新整理数据到brr数组
  15.         Next
  16.     Next
  17.    
  18.     Sheets(2).[a3].Resize(n, 8) = brr '在表2输出结果
  19.     Sheets(2).Activate
  20.    
  21. End Sub

  22. '经典随机洗牌过程代码,以后可以在别的代码中使用
  23. '因此,我把它单独列出,而不是放在过程中。
  24. Sub GetRnd(arr, n)
  25.     Randomize
  26.     For i = 1 To n
  27.         r = Int(Rnd() * (n - i + 1)) + i
  28.         t = arr(r): arr(r) = arr(i): arr(i) = t
  29.     Next
  30. End Sub
复制代码

0206.zip

17.13 KB, 下载次数: 15

回复

使用道具 举报

 楼主| 发表于 2012-2-7 09:00 | 显示全部楼层
香川群子 发表于 2012-2-7 08:55
如果要在VBA内存数组中进行随机排序,那么代码如下:

那我要是存入另一个SHEET里呢 加行什么代码?
回复

使用道具 举报

 楼主| 发表于 2012-2-7 09:01 | 显示全部楼层
香川群子 发表于 2012-2-7 08:55
如果要在VBA内存数组中进行随机排序,那么代码如下:

要保持两表样式一样  就是 新表是随机排序后 又按顺序填的序号
回复

使用道具 举报

 楼主| 发表于 2012-2-7 09:06 | 显示全部楼层
香川群子 发表于 2012-2-7 08:01
如果有效利用Excel自身功能,进行随机排序的话,代码如下:

还有个 要求 新生成的表要有边框的
回复

使用道具 举报

 楼主| 发表于 2012-2-7 12:54 | 显示全部楼层
香川群子 发表于 2012-2-7 08:55
如果要在VBA内存数组中进行随机排序,那么代码如下:

  • Sheets(2).[a3].Resize(n, 8) = brr '在表2输出结果
  • Sheets(2).Activate
   在这个代码上 加什么 输出的结果 是带表格的啊?


回复

使用道具 举报

发表于 2012-2-7 17:39 | 显示全部楼层
wg68241064 发表于 2012-2-7 12:54
  • Sheets(2).[a3].Resize(n, 8) = brr '在表2输出结果
  • Sheets(2).Activate
       在这 ...

  • 录制宏就可以知道如何画表格的格子线。

    算啦,直接帮你整理好:


    1.     With Selection 'Draw Line
    2.         .Borders(xlEdgeLeft).LineStyle = xlContinuous
    3.         .Borders(xlEdgeTop).LineStyle = xlContinuous
    4.         .Borders(xlEdgeBottom).LineStyle = xlContinuous
    5.         .Borders(xlEdgeRight).LineStyle = xlContinuous
    6.         .Borders(xlInsideVertical).LineStyle = xlContinuous
    7.         .Borders(xlInsideHorizontal).LineStyle = xlContinuous
    8.     End With
    复制代码

    回复

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-4-25 12:07 , Processed in 3.401590 second(s), 15 queries , Gzip On, Yac On.

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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