- ベストアンサー
VBAでプログラムをランダムに発生させる事が…
- VBAで問題を作成する課題に行き詰まっています。可能なのでしょうか?
- VBAでランダムに問題を出題し、一度出た問題を避けるプログラムを作成することは可能でしょうか?アドバイスをお待ちしています。
- VBAを使用して問題をランダムに出題し、重複を避けるプログラムを作成する方法について教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
良く判らないのですが、複数あるプロシジャーをランダムにコールしたいって事でしょうか? とりあえず「例題1」~「例題100」まであるとしてこんな感じで…… Sub sample() Dim nSub(100) As Long Dim nTarget, nRtn, i '例題の番号を配列に For i = 1 To 100 nSub(i) = i Next i 'ランダムに並び替え For i = 1 To 100 nTarget = Int(Rnd() * 100) + 1 nRtn = nSub(i) nSub(i) = nSub(nTarget) nSub(nTarget) = nRtn Next i '出題 For i = 1 To 100 Application.Run "例題" & nSub(i) Next i End Sub そうではなくて、どこかに置いてある問題をランダムに出題したいのでしたら、 何処かのシートに乱数(=RAND() )、問題、答え と3列使って問題を沢山作って置いておき、それを一列目の乱数で順番に並び替えて上から順番に出題して行けば良いと思います。
その他の回答 (2)
- MARU4812
- ベストアンサー率43% (196/452)
まず、1つ指摘事項ですが > If 借方 = 現金 Then 上記は「現金」という変数に入っているデータとの比較です。 変数を宣言してない場合は、VBが勝手に用意してしまいますので 空っぽの文字列と比較する事になります。 1)そもそもの問題データを、全て同じ形式(問題文と答えの文字列2つのセットなど) にできるなら、関数は1つで済みます。 2)できない場合は、Application.Run で実行するマクロを文字列で 指定できますから、指定しやすい関数名にしておけば可能です。 データの入替えはトランプのシャッフルなどで使われる 配列やコレクションの任意の場所同士の入替えで実現できます。 1)の場合は問題データそのものを入れておいてシャッフルすればいいです。 2)の場合は連番でも入れておいて、その連番に対応する関数を呼び出せばいいです。 (関数名入れておいてもできます)
- nda23
- ベストアンサー率54% (777/1415)
例えば問題を出すプロシージャ名が「例題n」だとすると、 次のようになります。(nは1、2、3、・・・) Const 問題数 As Long 100 Sub 出題() Dim 番号 As Long Dim 回数 As Long Dim 名前 As String ReDim 済み(問題数) As Boolean '乱数表を初期化 Randomize Time '問題数分のループ For 回数 = 1 To 問題数 '出題されていない問題番号を得る Do '乱数で問題番号を求める 番号 = Int(問題数 * Rnd) + 1 '出題済みでなければループを抜ける If Not 済み(番号) Then Exit Do Loop '出題済みにする 済み(番号) = True 'プロシージャ名を決める 名前 = "例題" & CStr(番号) '名前によりプロシージャを実行する Application.Run 名前 Next End Sub