• ベストアンサー

VBAでこのプログラムの作り方

最近VBAを勉強し始めた初心者です。 Excel上でコマンンドボタン1つで D18~H18からD22~H22の5×5の25マス(Aシート) と M18~Q18からM22~Q22の5×5の25マス(Bシート) それぞれに1~75の乱数を同時に発生させ一定時間、数字を回転させたあと数字を表示させたいのですがどのようなプログラムを組めばよろしいですか? ただしAシート内での数字の重複、Bシート内での数字の重複は起きないものです。 AシートとBシートの数字の重複はOKです。 数字はAシート25マス、Bシート25マス全て同時に回転させたいです。 乱数を回転させ数字を表示させるプログラムは For = i = 0 To 100  Range("○○").Value = Int(Rnd * 75) + 1 Next i です。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • hige_082
  • ベストアンサー率50% (379/747)
回答No.1

>最近VBAを勉強し始めた初心者です。 なぜこんなことをしたいのか分りませんが 初心者にはチョッと敷居が高いと思いますよ >それぞれに1~75の乱数を同時に発生させ・・・ え~っと、同時は無理です 同時に処理をしようとすれば、CPUが50個必要ですよ この辺のことはご自分で調べてね まあ、ある程度のパワーのPCで順番に処理すれば 同時に処理してるように見えるので、それで勘弁して 'サンプル Sub test() Dim rng As Range Dim i As Integer Dim a As String, b As String '一定時間、数字を回転させる For i = 1 To 300 For Each rng In Range("d18:h22,m18:q22") rng.Value = Int(Rnd * 75) + 1 Next rng Next i 'Aシート a = "," For Each rng In Range("d18:h22") Do b = Int(Rnd * 75) + 1 If InStr(a, "," & b & ",") = 0 Then a = a & b & "," rng.Value = b Exit Do End If Loop Next rng 'Bシート a = "," For Each rng In Range("m18:q22") Do b = Int(Rnd * 75) + 1 If InStr(a, "," & b & ",") = 0 Then a = a & b & "," rng.Value = b Exit Do End If Loop Next rng End Sub 初心者が勉強しやすそうなコードで処理しているので 解説はなしです、ご自分で勉強してね

shorinji36
質問者

お礼

わざわざ有難うございます、大変助かりました。 今、学校の授業で簡単なゲームを作っているのですが今日、全くプログラムが組めず1日を無駄にしてしまいました。

その他の回答 (1)

  • hotosys
  • ベストアンサー率67% (97/143)
回答No.2

こんなのではどうでしょうか? 作業シートを使うので適当なシートを用意してください。 一定時間のループをfor nextの回数で指定すると一定時間にならないので指定された方法を使っていませんが、必要なら数値回転の部分を変更してください。 Sub sample() 乱数表示 Sheets("A").Range("D18:H22") 乱数表示 Sheets("B").Range("M18:Q22") End Sub Sub 乱数表示(area As Range) Dim tempSheet As Worksheet Dim rng As Range Dim n As Integer Dim r As Long Set tempSheet = Sheets("Sheet3") '作業シート tempSheet.Cells.Clear '作業シート tempSheet.Range("A1").Value = 1 'A1=1 tempSheet.Range("A1").AutoFill tempSheet.Range("A1").Resize(75, 1), xlFillSeries '75列まで連続する値を格納(A列に1-75の候補値を作成) n = 75 '乱数発生値の最大値(候補数)を75に設定 area.Parent.Select '目的エリアのシートを選択 area.Clear '目的エリアをクリア For Each rng In area '目的エリアのセルを順に 数値回転 rng '回転 r = Int(Rnd * n) + 1 '最大値までの範囲の乱数発生(行番号) rng.Value = tempSheet.Range("A" & r).Value '候補値の中から乱数で取得した行のセルの値を目的セルに tempSheet.Range("A" & r).Delete xlShiftUp '候補値から選択された行の値を削除 n = n - 1 '候補数-1 Next End Sub Sub 数値回転(rng As Range) Dim t As Single Dim r As Long r = 1 t = Timer Do While Timer < t + 0.5 '0.5秒間 DoEvents rng.Value = Int(Rnd * 75) + 1 '乱数表示 Loop End Sub

shorinji36
質問者

お礼

回答有難うございます。

関連するQ&A