Excel精英培训网

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

[已解决]随机问题-怎么打乱顺序才好

[复制链接]
发表于 2010-2-10 18:50 | 显示全部楼层 |阅读模式

随机问题-怎么打乱顺序才好

随机问题-怎么打乱顺序才好

运行前如上。

运行后,仍是这9个数字,但位置发生了随机变化。

请问怎么写好?

谢谢!

最佳答案
2010-2-11 08:43

Sub Test()
    Dim Rng As Range, i%, Temp%
    Set Rng = Range("a1:c3")
    Rng.Clear
    For i = 1 To 9
        Do While Rng(i) = ""
            Randomize
            Temp = Int(Rnd * 9 + 1)
            If WorksheetFunction.CountIf(Rng, Temp) = 0 Then Rng(i) = Temp
        Loop
    Next
End Sub
[此贴子已经被作者于2010-2-11 8:43:34编辑过]
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2010-2-10 19:17 | 显示全部楼层

补:运行前A1:C3无数据,运行后是被打乱顺序的,也行。

恨自己为什么想不出既简单、又正确的办法[em06]

回复

使用道具 举报

发表于 2010-2-10 21:56 | 显示全部楼层

引玉用的:

Sub test()
Dim rng As Range, i1 As Byte, i2 As Byte, tmp As Integer
For Each rng In Range("a1:c3")
  i1 = Int(Rnd * 3 + 1)
  i2 = Int(Rnd * 3 + 1)
  tmp = Cells(i1, i2).Value
  Cells(i1, i2) = rng.Value
  rng.Value = tmp
Next
End Sub

回复

使用道具 举报

发表于 2010-2-10 22:03 | 显示全部楼层


Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Sub fx1()
    Dim a(1 To 9) As Long, b(1 To 3, 1 To 3) As Long
    Dim tmp As Long
    Dim n As Long
    Dim i As Long
    Dim t As Double

    For i = 1 To 9
        a(i) = i
    Next
    For i = 1 To 9
        n = Int(Rnd * 9 + 1)
        tmp = a(i)
        a(i) = a(n)
        a(n) = tmp
    Next
    CopyMemory ByVal VarPtr(b(1, 1)), ByVal VarPtr(a(1)), 4 * 9
    [A1:C3] = b
End Sub
回复

使用道具 举报

 楼主| 发表于 2010-2-10 22:43 | 显示全部楼层

谢谢青城山、吕布!

学习了!!!吕布用的api我不会,真想学会啊。。。。

回复

使用道具 举报

发表于 2010-2-11 08:43 | 显示全部楼层    本楼为最佳答案   


Sub Test()
    Dim Rng As Range, i%, Temp%
    Set Rng = Range("a1:c3")
    Rng.Clear
    For i = 1 To 9
        Do While Rng(i) = ""
            Randomize
            Temp = Int(Rnd * 9 + 1)
            If WorksheetFunction.CountIf(Rng, Temp) = 0 Then Rng(i) = Temp
        Loop
    Next
End Sub
[此贴子已经被作者于2010-2-11 8:43:34编辑过]
回复

使用道具 举报

发表于 2010-2-11 09:38 | 显示全部楼层

Sub tt()
    Dim arr
    Dim arr2
    Dim i As Long
    Dim j As Long
    Dim m As Long
    Dim d As Object
    Set d = CreateObject("scripting.dictionary")
    Do
        m = Int(Rnd() * 9 + 1)
        d(m) = ""
    Loop Until d.Count = 9
    arr = d.keys
    ReDim arr2(1 To 3, 1 To 3)
    For i = 1 To 3
        For j = 1 To 3
            arr2(i, j) = arr(i * 3 + j - 4)
        Next j
    Next i
    Range("A1:C3") = arr2
End Sub
回复

使用道具 举报

发表于 2010-2-11 09:42 | 显示全部楼层

收藏学习

回复

使用道具 举报

 楼主| 发表于 2010-2-11 10:05 | 显示全部楼层

青城山的,因没交代有误(2楼),是我的问题。

吕布的,应该是最佳的,,,,评吕布的话,可我没这个资格(自己不懂,实在心虚)

阿木的,或许是被更多人接受的。

这里,我觉得比最佳更有价值的是,可以一次学习多种好方法,谢谢青城山、吕布、阿木!

回复

使用道具 举报

 楼主| 发表于 2010-2-11 10:09 | 显示全部楼层

⊙﹏⊙b汗,回帖时赶上搁浅也回了帖,没看见!

这才发现各个解法中,见到不少我们常用方法,谢谢搁浅!

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-17 07:41 , Processed in 0.296040 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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