はじめまして 今、単語テストをエクセルのマクロで簡単に作成できるようにしようと思っています。 「単語リスト」というシートに単語が縦に並んでおり そこから例えば51から150番の単語テストをテストシートというところにランダムで並べたいのです。 発生させる乱数は1から100の間です。 わからないところなのは、前回出た数値と同じ数値が乱数で出てきてしまいます。 do until で前に出ていないかをチェックさせているはずなのですけども、なぜかできません。 ドコがおかしいのか教えていただけると助かります。 よろしくお願いします。
最初のほうは飛ばして見ていただいて結構です。
Sub 単語()
Dim i Dim j Dim k Dim l Dim strspace Dim intstart Dim intend Dim strcopy Dim strcopy2 Dim line Dim error Dim wordlist Dim testlist Dim testtype Dim random1 Dim random2 Dim random3 Dim compare Dim compare2 Dim searchweek(110)
If wordlist = "英単語ターゲット1900(3訂版)" Then wordlist = 2 ElseIf wordlist = "英単語ターゲット1900(4訂版)" Then wordlist = 4 ElseIf wordlist = "速読英単語・必修編(増訂第3版)" Then wordlist = 6 End If
If error > 99 Then MsgBox "一度に作れるのは100個までです。" ElseIf testtype = "番号順" Then For i = intstart + 1 To intend + 1 Step 1 strcopy = Worksheets("単語リスト").Cells(i, wordlist) strcopy2 = Worksheets("単語リスト").Cells(i, testlist) Worksheets("テストシート").Cells(j, line) = strcopy Worksheets("解答シート").Cells(j, line) = strcopy Worksheets("解答シート").Cells(j, line + 1) = strcopy2 j = j + 1 If j = 52 Then j = 2 line = 3 End If Next i
大事なのはココからだと思います。
ElseIf testtype = "ランダム" Then j = 2 For i = intstart + 1 To intend + 1 Step 1 compare2 = Int((random2 - random1 + 1) * Rnd + random1) k = 1 Do Until k = j - 1 compare = searchweek(k) If compare = compare2 Then compare2 = Int((random2 - random1 + 1) * Rnd + random1) k = 1 Else k = k + 1 End If Loop
If searchweek(j) <= 51 Then line = 1 Worksheets("テストシート").Cells(searchweek(j), line) = strcopy Worksheets("解答シート").Cells(searchweek(j), line) = strcopy Worksheets("解答シート").Cells(searchweek(j), line + 1) = strcopy2 ElseIf searchweek(j) > 52 Then searchweek(j) = searchweek(j) - 50 line = 3 Worksheets("テストシート").Cells(searchweek(j), line) = strcopy Worksheets("解答シート").Cells(searchweek(j), line) = strcopy Worksheets("解答シート").Cells(searchweek(j), line + 1) = strcopy2 End If 'Worksheets("テストシート").Cells(j, "F") = searchweek(j) j = j + 1 Next i End If
Option Explicit
Sub test()
'乱数初期化
Randomize
'配列の用意
Dim i As Integer
Dim NUM(99) As Variant
Dim buf As Variant
Dim r1 As Integer
Dim r2 As Integer
Dim tmpNum As Integer
For i = 0 To 99
NUM(i) = i + 1
Next i
'入れ替え
For i = 0 To 1000 'とりあえず1000回ぐらい切る
r1 = Int(Rnd() * 100)
r2 = Int(Rnd() * 100)
tmpNum = NUM(r1)
NUM(r1) = NUM(r2)
NUM(r2) = tmpNum
Next i
buf = Range("A1:A100")
For i = 1 To UBound(buf, 1)
buf(i, 1) = NUM(i - 1)
Next i
Range("A1:A100") = buf
End Sub
Option Explicit
Sub test()
'乱数初期化
Randomize
'配列の用意
Dim i As Integer
Dim NUM(99) As Variant
Dim r1 As Integer
Dim r2 As Integer
Dim tmpNum As Integer
For i = 0 To 99
NUM(i) = i + 1
Next i
'入れ替え
For i = 0 To 1000 'とりあえず1000回ぐらい切る
r1 = Int(Rnd() * 100)
r2 = Int(Rnd() * 100)
tmpNum = NUM(r1)
NUM(r1) = NUM(r2)
NUM(r2) = tmpNum
Next i
For i = LBound(NUM) To UBound(NUM)
Cells(i + 1, 1) = NUM(i)
Next i
End Sub