我需要创建一个具有以下结构的表:
Applicant | Test 1 | Test 2 | Test 3 | Test 4 | Test 5 | Test 6 |
1 | A | C | D | E | F | B |
2 | C | B | A | E | D | F |
3 | C | A | F | E | B | D |
.... | | | | | | |
基本上,测试1 - 6可以是A和F之间的任何字母。我想要一个宏(或其他方法),通过它可以生成此表,有200个申请人,其中测试是完全随机的。有谁知道怎么做?
答案 0 :(得分:2)
您不需要宏。单个公式将执行此操作:=CHAR(RANDBETWEEN(65, 70))
答案 1 :(得分:2)
有6个字符的720个排列。
虽然你可以通过选择一个来生成随机排列,然后从剩下的集合中选择另一个等等,我认为你最好将所有720生成到工作表然后选择200个随机行从工作表。
这里有代码示例来生成排列: http://j-walk.com/ss/excel/tips/tip46.htm
然后你可以使用randbetween()从那些中选择一行。
答案 2 :(得分:1)
由于您说您不想单独生成排列,因此这里有一些VBA代码可以为您生成随机权限。虽然这有点暴力。
Option Explicit
Function candidateAlreadyInUse(r As Integer, cand As String) As Boolean
Dim col As Integer
candidateAlreadyInUse = False
For col = 1 To 6
If ActiveSheet.Cells(r, col) = cand Then
candidateAlreadyInUse = True
Exit Function
End If
Next col
End Function
Sub perm()
Dim row As Integer
Dim col As Integer
Dim candidate As String
For row = 1 To 10
For col = 1 To 6
candidate = Chr(65 + Int(Rnd() * 6))
While candidateAlreadyInUse(row, candidate)
candidate = Chr(65 + Int(Rnd() * 6))
Wend
ActiveSheet.Cells(row, col) = candidate
Next col
Next row
End Sub
答案 3 :(得分:1)
只是为了踢,我很快在VBA中实现了一个Shuffle,它会使用Fisher-Yates创建字母A,B,C,D,E,F的随机排列 - 传递一个数组,然后它将洗牌:
Public Sub Shuffle(ByRef items() As String)
Dim i, j As Integer
Dim temp As String
For i = UBound(items) To i = 1 Step -1
j = Rnd * i
temp = items(j)
items(j) = items(i)
items(i) = temp
Next
End Sub
以下代码创建一个数组A,B,C,D,E,F,生成200个随机排列,并将它们逐行写入活动工作表:
Public Sub WriteTests()
Dim tests(0 To 5) As String
tests(0) = "A"
tests(1) = "B"
tests(2) = "C"
tests(3) = "D"
tests(4) = "E"
tests(5) = "F"
Dim row, col As Integer
Dim mySheet As Worksheet
Set mySheet = ActiveWorkbook.ActiveSheet
For row = 1 To 200
Shuffle tests
For col = 1 To 6
mySheet.Cells(row, col).Value2 = tests(col - 1)
Next
Next
End Sub