Office中国论坛/Access中国论坛

标题: [再求助]如何用Excel进行抽签 [打印本页]

作者: 平常心即道    时间: 2005-6-15 00:15
标题: [再求助]如何用Excel进行抽签
  请教各位高手一个如何抽签的问题,例如有20个人的姓名,编号从1到20,如何让其自动重新排序,号码变成随机而定(就是原来的10号现在可能变成5号,15号变成了19号,余类推,总数还是20。)大概就是这个意思,希望会的朋友不吝赐教!!!

  万分感谢!!!

[此贴子已经被作者于2005-6-14 21:04:13编辑过]


作者: sunredday    时间: 2005-6-15 02:04
<TABLE 162pt; BORDER-COLLAPSE: collapse" cellSpacing=0 cellPadding=0 width=216 border=0 x:str><COLGROUP><COL style="WIDTH: 54pt" span=3 width=72>1810111677149101551112171581916<TR 14.25pt" height=19>19<TD #d4d0c8; BORDER-TOP: #d4d0c8; BORDER-LEFT: #d4d0c8; BORDER-BOTTOM: #d4d0c8; BACKGROUND-COLOR: transparent" align=right x:num x:fmla="=ROU
作者: sunredday    时间: 2005-6-15 02:06
选定三列,对第二列和第三列进行排序
作者: 淼漫    时间: 2005-6-15 02:39
生成随机数函数rand():若要生成 a 与 b 之间的随机实数,请使用:RAND()*(b-a)+a
作者: 平常心即道    时间: 2005-6-15 04:20
首先谢谢蜘蛛侠和淼漫管理员的迅速回帖帮助,我试了一下,可能是我还没说清楚,我要的是这20个数字重排后,还是1-20个数字,不能出现重复的数字,我以5个数字为例说明:1 王××  5

2 李××  2

3 张××  4

4 赵××  1

5 孙××  3

………



第一、二例是原数据,第三例是抽签后的号,是不能出现重号的。其实就在第一例重排也行,就是把第一例号码打乱重排,原来的1号成了5号,2号也有可能仍旧是2号,3号成了4号,4号成了1号,5号成了3号……不能同时出现2个相同的号码的,呵呵~~~罗嗦了吧,大概是这意思,希望麻烦你们再帮忙指教,再次感谢了!!!
作者: 红池坝    时间: 2005-6-16 03:33
有一个很简单的办法:第一列(A列)的序号使用row()函数自动生产,添加一个辅助列C列使用rand()函数产生随机数并在此排序,这样,B列的姓名会因为C列变化而变化,但A列却因为row()函数而不会发生变化,毅然是123456……的顺序。为了表格美观,可以隐藏c列。
作者: 平常心即道    时间: 2005-6-16 05:09
试了一下,还是不行,有没有这样的函数:在一列20个单元格内,随机产生1至20不重复的20个数字。?
作者: 红池坝    时间: 2005-6-16 07:54
为什么非得产生1-20的不重复的随机数呢?虽然使用VBA代码很容易。使用一个变通的办法其实真的很简单。6楼的办法是一个。下面是另一个,只是不使用Row()而已添加一个C列,填充1-20添加一个D列,=rand()对D列排序,这样无论D列里是否有重复,但在C列中,事实上就成了1-20不重复的随机数了,明白吗?
作者: 平常心即道    时间: 2005-6-16 23:23
这样可以,但不是很理想,我试了一下,这样是否好些?辅助列, D1输入公式, 下拖至D20 :=RAND()



C1输入公式, 下拖至C20 :=RANK(D1,$D$1D$20)


作者: 红池坝    时间: 2005-6-17 07:24
你用了两个公式,可8楼只有一个公式,哪个效率高一目了然啊。何况,rank()函数也会有重复的啊,比如并列第5,呵呵
作者: sunredday    时间: 2005-6-18 04:19
标题: 看一看
实际例子
作者: sunredday    时间: 2005-6-18 04:26
标题: HELLO
[attach]11297[/attach]


作者: czq1688    时间: 2006-11-17 21:07
研究ing
作者: cola    时间: 2006-11-18 03:49
将以下代码复制到模块中,可以当函数使用.

Option Explicit
Function RANGERANDOMIZE(rng)
    Dim V() As Variant, ValArray() As Variant
    Dim CellCount As Double
    Dim i As Integer, j As Integer
    Dim r As Integer, c As Integer
    Dim Temp1 As Variant, Temp2 As Variant
    Dim RCount As Integer, CCount As Integer
    Randomize
   
'   Return an error if rng is too large
    CellCount = rng.Count
    If CellCount > 1000 Then
        RANGERANDOMIZE = CVErr(xlErrNA)
        Exit Function
    End If
   
'   Assign variables
    RCount = rng.Rows.Count
    CCount = rng.Columns.Count
    ReDim V(1 To RCount, 1 To CCount)
    ReDim ValArray(1 To 2, 1 To CellCount)


    For i = 1 To CellCount
        ValArray(1, i) = Rnd
        ValArray(2, i) = rng(i)
    Next i

    For i = 1 To CellCount
        For j = i + 1 To CellCount
            If ValArray(1, i) > ValArray(1, j) Then
                Temp1 = ValArray(1, j)
                Temp2 = ValArray(2, j)
                ValArray(1, j) = ValArray(1, i)
                ValArray(2, j) = ValArray(2, i)
                ValArray(1, i) = Temp1
                ValArray(2, i) = Temp2
            End If
        Next j
    Next i
   
    i = 0
    For r = 1 To RCount
        For c = 1 To CCount
            i = i + 1
            V(r, c) = ValArray(2, i)
        Next c
    Next r
    RANGERANDOMIZE = V
End Function





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3