Генерировать данные в Excel с помощью макросов? - PullRequest
0 голосов
/ 17 мая 2010

Мне нужно создать таблицу со следующей структурой:

 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 ]

2 голосов
/ 17 мая 2010

Есть 720 перестановок из 6 символов.

Хотя вы могли бы создать случайную перестановку, выбрав одну, затем другую из оставшегося набора и т. Д., Я думаю, вам лучше сгенерировать все 720 в лист, а затем выбрать 200 случайных строк из рабочий лист.

Вот пример кода для генерации перестановок: http://j -walk.com / сс / Excel / советы / tip46.htm

тогда вы можете использовать randbetween (), чтобы выбрать строку из них.

2 голосов
/ 17 мая 2010

Вам не нужен макрос. Одна формула сделает это: =CHAR(RANDBETWEEN(65, 70))

1 голос
/ 18 мая 2010

Просто для ударов, я быстро реализовал Shuffle в 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 случайных перестановок и записывает их построчно в активный лист:

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
1 голос
/ 17 мая 2010

Поскольку вы говорите, что не хотите генерировать перестановки по отдельности, вот код 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...