构建一个没有重复项的随机名称生成器

时间:2018-02-15 05:39:04

标签: excel vba excel-vba excel-formula excel-2007

我目前正在指派我的组织成员与其他观点成员会面。我有三个标准:

  1. 每个透视成员必须与6位不同的现有成员见面
  2. 当前成员没有成员具有相同的透视成员两次
  3. 配对必须是随机的
  4. 我在Excel中尝试过随机名称/数字生成器:

    =INDEX($A:$A,RANDBETWEEN(1,COUNTA($A:$A)),1) 
    

    ......虽然有用,但并不能确保每个观点都与6个不同的当前成员相遇,或者没有当前的成员遇到过两次。

    我还添加了一个图表,我想红色是透视成员,蓝色是当前成员,绿色是我对这些对进行排序的位置(基于当前成员)。

    Screenshot

    请帮助我,我完全不知道如何做到这一点。

1 个答案:

答案 0 :(得分:1)

有很多方法可以随机化列表...

使用VBA随机化选择

使用的一种方法是遍历工作表上的选定(突出显示)单元格,使用单元格值以随机顺序填充数组,然后将原始值替换为数组值:

Sub randomizeSelection()

    Dim arrOut() As String
    Dim x As Integer, n As Integer

    Randomize 'reseed random number generator

    With Selection '"Using the selected (highlighted) cells..."

        ReDim arrOut(1 To .Count) 'set array to same size as selection

        'make sure multiple cells are selected
        If .Count <= 1 Then
            MsgBox "Must select at least 2 cells to randomize."
            Exit Sub
        End If

        For x = 1 To .Count 'loop through selection
            Do
                n = Int(Rnd() * .Count) + 1 'pick random position in array
            Loop Until arrOut(n) = "" 'if position is 'occupied' then repeat loop

            arrOut(n) = .Item(x) 'store item in the new (random) position
        Next x

        'repopulate selection with items from [arrOut]
        For x = 1 To .Count
            .Item(x) = arrOut(x)
        Next x

    End With

End Sub

它适用于一维选择: "Screenshot 1"

... ,二维: "Screenshot 2"

更多信息:

随机化没有VBA的工作表列表

随机化列表(不使用VBA)的另一种方法是使用附加(“帮助”)列或行,以及Excel的内置排序功能。

  1. 在要排序的列表旁边的列或行中,添加函数:

    =RAND()

    ...并按原样“填写”(或复制并粘贴)该列表的长度。

  2. 突出显示列表添加的“辅助单元格”,然后按“帮助程序”排序。

  3. 请注意,此方法仅适用于 列/行中的列表。要在二维列表中随机化单元格,请使用上面的VBA方法。

    随机排序垂直列表:

    "Screenshot 3"

    水平列表进行随机排序:

    "Screenshot 4"