2010-05-17 127 views
0

我需要創建一個表具有以下結構:使用宏在Excel中生成數據?

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名申請者,其中的測試是完全隨機的。有人知道怎麼做嗎?

+1

我假設'G'分數是一個錯字。 – 2010-05-17 12:39:30

+0

是的......抱歉。我會盡快修復它。 – coderama 2010-05-17 13:25:11

+0

所以,爲了清楚起見,您希望能夠生成A,B,C,D,E,F隨機洗牌的行(所有字符都必須存在,但不應該重複) - 並且我認爲沒關係如果某些行是相同的(每行是隨機選擇一個隨機播放)。 – Mathias 2010-05-17 18:03:25

回答

2

你不需要一個宏。一個公式將這樣做:=CHAR(RANDBETWEEN(65, 70))

+0

雖然這可能會給一個候選人多次同樣的測試。 (例如,A B C A B C)。我認爲提問者真的想要A B C D E F的隨機排列。 – Vicky 2010-05-17 12:40:12

+0

也許,但是OP實際上還沒有要求(尚)。 – 2010-05-17 13:02:06

+0

我認爲他的例子很清楚。 – Vicky 2010-05-17 13:06:00

2

有720個排列的6個字符。

雖然你可能通過選擇一個,然後另一個從其餘集合等產生隨機排列,我認爲你最好生成所有720到工作表,然後從工作表中選擇200個隨機行。

有代碼示例在這裏產生的排列: http://j-walk.com/ss/excel/tips/tip46.htm

那麼你可以使用RANDBETWEEN(),以從這些選擇一行。

+0

生成720個排列來挑選200個聲音,就像一個巨大的開銷。我還假設重複一些排列是可以接受的,否則你無法使用超過720人的算法。 – Mathias 2010-05-18 20:54:37

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 
+0

注意,這隻填寫前10行。但我認爲你可以看到如何擴展它! – Vicky 2010-05-17 13:49:37

+0

@RD:這是否解決了您的問題?如果是這樣,請考慮接受答案 - 如果不是,您仍然面臨哪些問題? – Vicky 2010-05-18 09:16:05

1

只是踢,我很快實現的洗牌在VBA,這將創建的字母A,B,C,d,E,F的隨機置換,使用Fisher-Yates - 它傳遞一個數組,並且它將洗牌它:

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個隨機置換,並寫入它們逐行到Active表:

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