エクセルのVBAを使って、選択肢を選んで答える簡単な学習ソフトを作っています。問題文を作るときは正解をいちばん左のセルに入れて、あとから3つの選択肢の順番をランダムに入れ替える簡単なマクロを作ろうとしましたがうまくいきません。たとえば、A列に問題番号、B列に問題文、C列~E列までに選択肢の1,2,3が入っています。問題は20問、つまり1から20行まで入っています。そしてコマンドボタンを押すと適当にC~Eの内容が入れ替わるようにしたいのです。私がやろうとしたのは選択肢1~3を文字列の変数にして、1行目から20行目まではループで実行させるのですが、肝心な入れ替えをどのようにしたらよいかわかりません。乱数を使ったらどうかと思ったのですが、使い方がわかりません。もっと簡単な方法があればそれも教えてください。VBAの初心者ですのでよろしくお願いします。
No.2ベストアンサー
- 回答日時:
おもしろそうですね。
Rnd関数にDictionaryオブジェクトを組み合わせてみました。
これなら3択じゃなくとも、5択でも10択?でも楽に行けます。
Sub test01()
Dim myW, myX
Dim myDic As Object
Dim i As Long, x As Long, n As Long
myW = Range("C1:E20").Value
ReDim myX(1 To UBound(myW, 1), 1 To UBound(myW, 2))
Set myDic = CreateObject("Scripting.Dictionary")
For i = 1 To 20
Randomize
Do Until myDic.Count = 3
x = Int(Rnd() * 3) + 1
If Not myDic.Exists(x) Then
myDic.Add x, ""
End If
Loop
For n = 1 To 3
myX(i, myDic.keys()(n - 1)) = myW(i, n)
Next n
myDic.RemoveAll
Next i
Range("C1:E20").Value = myX
End Sub
Dictionaryの使い方を本で読んで知ってはいましたが、ここで思いつきませんでした。5択でもできるというので、早速やってみます。ありがとうございます。
No.3
- 回答日時:
試してみてください。
Sub test_rnd()
Dim myrag As Range
Randomize
For Each myrag In Range("F2:H21")
myrag = Rnd
Next myrag
Range("C2").Formula = "=RANK(F2,$F2:$H2,0)"
Range("C2").Copy
Range("C2:E21").PasteSpecial Paste:=xlPasteAll
Application.Calculation = xlAutomatic
Range("C2:E21").Copy
Range("C2:E21").PasteSpecial Paste:=xlPasteValues
Range("F2:H21").ClearContents
End Sub
このマクロでは、セルの("F2:H21")を作業用に使っています。
回答ありがとうございました。できました。簡単にできることに感動しました。おかげで少しずつVBAのことがわかってきました。お礼申し上げます。
No.1
- 回答日時:
全然スマートじゃない力技ですが、こんなのはどうでしょう?
Sub test()
Dim r As Long
For r = 1 To 20
Dim ans1, ans2, ans3
Dim x1, x2
x1 = Rnd()
x2 = Rnd()
If x1 < 1 / 3 Then
If x2 < 1 / 2 Then
ans1 = Cells(r, "C").Value
ans2 = Cells(r, "D").Value
ans3 = Cells(r, "E").Value
Else
ans1 = Cells(r, "C").Value
ans2 = Cells(r, "E").Value
ans3 = Cells(r, "D").Value
End If
ElseIf x1 < 2 / 3 Then
If x2 < 1 / 2 Then
ans1 = Cells(r, "D").Value
ans2 = Cells(r, "C").Value
ans3 = Cells(r, "E").Value
Else
ans1 = Cells(r, "D").Value
ans2 = Cells(r, "E").Value
ans3 = Cells(r, "C").Value
End If
Else
If x2 < 1 / 2 Then
ans1 = Cells(r, "E").Value
ans2 = Cells(r, "C").Value
ans3 = Cells(r, "D").Value
Else
ans1 = Cells(r, "E").Value
ans2 = Cells(r, "D").Value
ans3 = Cells(r, "C").Value
End If
End If
Cells(r, "C").Value = ans1
Cells(r, "D").Value = ans2
Cells(r, "E").Value = ans3
Next r
End Sub
選択肢がたった3つだから何とかなりますが、選択肢が5つとかだと、こんなマクロを組む気にはなれません(笑)
回答ありがとうございました。私もこのように作ってみたのですが、もっと短くなるかなと思ったのです。私と同じような回答でうれしかったです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで早押しゲームを作りたい 4 2022/05/12 13:46
- Excel(エクセル) 【Excel】指定のセル内容を基に別シートのセルを検索して選択する【VBA】 1 2022/06/16 16:16
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- 英語 another の使い方、otherなどの使い方がわかりません。 大学に入って英文法を研究している先 3 2022/08/03 21:23
- 日本語 「私ぐらいに作れる」という言い方は? 8 2023/03/02 13:14
- 計算機科学 アルゴリズムについて 1 2023/01/01 19:43
- Excel(エクセル) 製品番号での整列と、検索に関して 3 2023/06/28 19:20
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- フリーソフト フォルダ、ファイル名の一括変換について 3 2023/03/16 09:23
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既婚で現役のAV女優さんは居ま...
-
CDレコの曲の消し方を教えてく...
-
エクセルのマクロの作り方で、...
-
Excelで抽出・連続印刷したいです
-
VBA ソートすると、1、11、...
-
4次元について
-
大昔から、クンニ、フェラって...
-
EXCELで3行を一組にして結合す...
-
射精したあとの匂いって他人に...
-
おっぱいを舐める
-
1日3回セックスって多いですか...
-
夫にセックスがないのなら他人...
-
先日彼氏とラブホに行ったら電...
-
彼とのエッチで、彼がイクのが...
-
精液のにおいがほとんど無いの...
-
男の精子ってどんな匂いですか、
-
彼女をオカズにして抜くのって...
-
彼のペニスが挿入時に柔らかく...
-
2人でエッチできる場所を探して...
-
あそこって・・みんな 舐める?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
既婚で現役のAV女優さんは居ま...
-
大昔から、クンニ、フェラって...
-
VBA ソートすると、1、11、...
-
CDレコの曲の消し方を教えてく...
-
別ブックの空白行に転記
-
VBAが止まります。
-
私は今年で60歳で孤独です。40...
-
直線コネクタの中央にコネクタ...
-
EXCELで3行を一組にして結合す...
-
エクセル最終行の下に貼り付け
-
シンナーの夏型と冬型の違いは?
-
データの平均を1分値にまとめる...
-
Word 黒塗り部分の文字のみ削除...
-
最適な組み合わせの自動計算
-
VBA AB列”3000”以上の数字の行...
-
性欲自体はあるのにセックスで...
-
相対参照から絶対参照に変換す...
-
bluetoothのclass1とclass2の互...
-
EXCELの関数でエンコードをしたい
-
エクセルのマクロの作り方で、...
おすすめ情報