使用宏在Excel中生成数据?

时间:2010-05-17 12:28:37

标签: excel excel-vba vba

我需要创建一个具有以下结构的表:

 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个申请人,其中测试是完全随机的。有谁知道怎么做?

4 个答案:

答案 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