好きなおでんの具材ドラフト会議しましょう

初めての投稿です。
文が拙くて読みにくかったらすみません。

VBAで今ゲームを作っているのですが、やり方が全く分からないので是非教えていただけると嬉しいです。

動きとしては、スタートボタン(btnStart)を押すと問題が問題文(lblQuestion)に表示され、ストップウォッチ(lblTime)が動きます。
4色のボタン(btnRed、btnBlue、btnYellow、btnGreen)のうち、正解のボタンを押すと正誤判定(lblAns)に〇、不正解だと×が表示されます。(表示時間は0.3秒くらい)
4色のボタンで回答したら次の問題文が表示されるようにしたいです。
最後の問題のボタンを押し終わった時にストップウォッチが止まり、同時にメッセージボックスで'"お疲れ様でした、正解数は〇個、かかった時間は〇〇秒です"と表示したいです。

問題文はsheet1のB2~B21、C列に選択肢1、D列に選択肢2、E列に選択肢3、F列に選択肢4、G列に答えが書いてあります。答えは1、2、3、4で書いてあります。
問題の出る順番は都度ランダムで20問出したいです。

複雑なのでわかりにくいと思いますがよろしくお願い致します。
ユーザーフォームはこんな感じです。

「VBAで早押しゲームを作りたい」の質問画像

質問者からの補足コメント

  • 説明足らずですみません。
    自分でも試行錯誤しながら作っていたのですが、そもそもの理解が全くできておらず1人だとできないと判断したので、丸々書き方を教えて頂きたいです。

      補足日時:2022/05/12 14:03

A 回答 (4件)

No1です。



>丸々書き方を教えて頂きたいです。
何のために作ろうとしているのかがわかりませんけれど、出来上がったものがあれば良いだけなら、依頼サイトで依頼したほうが確実です。
ご自分の学習が目的で作成するのなら、出来上がったものをもらったところで、なんの学習にもなりません。

前者なら、いろいろあるので検索してみれば宜しいかと。
http://officeboole-vba.fan.coocan.jp/
https://www.lancers.jp/work/search/system/vba


もしも、後者なら、一気に全部を作ろうとせずに、順を追ってつくってゆけば良いかも。
例えば、「ランダム」や「時間制御」はひとまず置いておいて・・

1)スタートボタンを押す毎に、順に問題文が表示される
準備として、問題文を配列等に入れておきます。
(配列でなく、エクセルなどのシート等を利用しても良いでしょう)
項目を示すカウンタ変数を用意しておいて、ボタンを押したらカウンタを進め、その問題文を表示すれば可能です。
(ランダムにする場合は、この項目変数をランダムになるように制御すれば良い)

次に、
2)問題表示中に回答ボタンを押すと、正誤判定が表示される。
問題とペアで回答を用意しておいて、回答ボタンが押されたら、正誤の表示を行います。
次の問題に行くのには、とりあえずスタートボタンでも良いでしょう。
あるいは、回答したらそのまま次の問題文が表示されるのでも良いでしょう。

更には、
3)タイマー機能を追加する。
最初の問題をスタートしたらタイマーが動き、最後の問題に回答したらタイマーが止まるものを作ってみましょう。

段階を進むときには、前のものがある程度は利用できるはずです。
ただし、そのまま利用できるとは限りません。
多少の手直しや、作り直しが必要になる可能性が高いです。
3)までが完成する頃には、かなり慣れてきているでしょうから、ご質問文にあるようなものも作成できるようになっているのではないかと想像します。

もしも、途中でわからないことがあれば、その部分について具体的に質問をなされば、適切な回答を得られるものと思います。
頑張ってください。
    • good
    • 1

#2です


>丸々書き方を教えて頂きたいです。
・・・・#3様が回答されている通りと存じます

ある程度は書いているのではないかと思いましたが、ちがうのかな?

>問題文はsheet1のB2~B21、C列に選択肢1、D列に選択肢2、E列に選択肢3、F列に選択肢4、G列に答えが書いてあります。答えは1、2、3、4で書いてあります。
問題の出る順番は都度ランダムで20問出したいです。

ここだけ・・・
<書いてある>のならセルの値(行)をランダムに入れ替える(行)方法です。
基表の順番を変えた方が他の処理操作が容易になるのではと思いました
一例コードです
UserForm1のロード時に処理します

Private Sub UserForm_Initialize()
Dim i As Long, j As Long
Dim rn As Long, tp As Variant
Dim Rng As Range
Dim tmp, Ary(), rAry()
Set Rng = Worksheets("Sheet1").Range("B2:G21")'ここだけ
tmp = Rng
ReDim Ary(1 To UBound(tmp, 1)), rAry(1 To UBound(tmp, 1), 1 To UBound(tmp, 2))
For i = 1 To UBound(tmp, 1)
For j = 1 To UBound(tmp, 2)
If Ary(i) <> "" Then Ary(i) = Ary(i) & "|" & tmp(i, j) Else Ary(i) = tmp(i, j)
Next
Next
For i = UBound(Ary) To 1 Step -1
rn = Application.Max(Int((i + 1) * Rnd), 1)
tp = Ary(rn): Ary(rn) = Ary(i): Ary(i) = tp
Next
For i = 1 To UBound(Ary, 1)
For j = 1 To UBound(tmp, 2)
rAry(i, j) = Split(Ary(i), "|")(j - 1)
Next
Next
Application.ScreenUpdating = False
Rng(1).Resize(UBound(rAry, 1), UBound(rAry, 2)) = rAry
Application.ScreenUpdating = True
End Sub

コードは参照範囲の変更を考慮していますので範囲変更のみで対象を変更できます
(処理内容:参照範囲の行のみをランダムに入れ替えます)
*文中に | が使用される事が想定できる場合、違うシンボルに変更してください。
    • good
    • 1

こんにちは


>やり方が全く分からない
・・・どこから?
説明がしっかりされていて、ここ迄出来ていてコードは何も書いていない(書けない)の?
コントロールをダブルクリックしてオブジェクト名やイベントを確認しつつ
実行コードを書いて見ましょう。。。

躓いている所はどこですか?コードなども添えて、ご質問、補足してみてはいかがでしょうか
    • good
    • 1

こんにちは



全体像はわかりますが、その上でご質問は何でしょうか?
どの部分がわからないとか何も記載がないので・・

それとも、ご希望に沿うものをまるっと作れということ?
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報