- 締切済み
[Excel VBA]コマンドボタンの入力待ち方法
コマンドボタンの入力を待つ方法についてご教示願います、 以下に詳しい状況と、具体的な質問を記載します。 【構成】 ・ユーザーフォーム上に5つのコマンドボタン(CommandButton1~CommandButton5) 【やりたいこと】 ・CommandButton1を押したらスタート ・1ラウンドにつき1回、CommandButton2~CommandButton5のいずれかのボタンが押せる。 そして、押されたボタンが何かを毎ラウンド判定する。 これを10ラウンドまで繰り返す。 (つまり、どのボタンが押されたかを10回判定する) なお、「ボタンが押されるまでは勝手にループしないこと」。 【コード】(UserFrom1に記載。質問用として、変数名は仮に日本語にしてあります) Public 押された As Long Dim 現在のラウンド As Long Dim 最終ラウンド As Long Private Sub ラウンド処理() 最終ラウンド = 10 For 現在のラウンド = 1 To 最終ラウンド ボタン判定 Next 現在のラウンド End Sub Private Sub ボタン判定() MsgBox 現在のラウンド & ":" & 押された End Sub Private Sub CommandButton1_Click() ラウンド処理 End Sub Private Sub CommandButton2_Click() 押された = 2 End Sub Private Sub CommandButton3_Click() 押された = 3 End Sub Private Sub CommandButton4_Click() 押された = 4 End Sub Private Sub CommandButton5_Click() 押された = 5 End Sub 【詰まっている点】 ボタンの入力待ちになるような文が入っていないため、 「1:0」「2:0」「3:0」…「10:0」とmsgboxが出るだけの状態です。 (当然ですが…) VBAの 【質問】 毎ラウンドごとにボタンの入力待ちのような状態を 「できるだけこの形を崩さずに」組み込むためには、どのような処理を加えればいいでしょうか。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
Dim 押された(10) As Long Dim 現在のラウンド As Long Dim 最終ラウンド As Long Private Sub 終了処理() CommandButton1.Visible = True CommandButton2.Visible = False CommandButton3.Visible = False CommandButton4.Visible = False CommandButton5.Visible = False End Sub Private Sub ボタン判定() MsgBox 現在のラウンド & ":" & 押された(現在のラウンド) End Sub Private Sub CommandButton1_Click() CommandButton1.Visible = False CommandButton2.Visible = True CommandButton3.Visible = True CommandButton4.Visible = True CommandButton5.Visible = True 現在のラウンド = 1 最終ラウンド = 10 End Sub Private Sub CommandButton2_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 2 ボタン判定 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub Private Sub CommandButton3_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 3 ボタン判定 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub Private Sub CommandButton4_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 4 ボタン判定 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub Private Sub CommandButton5_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 5 ボタン判定 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub フォームにCommandButton1~5を配置したら、CommandButton1のVisibleプロパティをTrueに、CommandButton2~5のVisibleプロパティをFalseにすること。 以下のようにすると、10回押すまで判定は行わず、10回押した段階でまとめて判定する。 Dim 押された(10) As Long Dim 現在のラウンド As Long Dim 最終ラウンド As Long Private Sub 終了処理() CommandButton1.Visible = True CommandButton2.Visible = False CommandButton3.Visible = False CommandButton4.Visible = False CommandButton5.Visible = False For 現在のラウンド = 1 To 最終ラウンド ボタン判定 Next 現在のラウンド End Sub Private Sub ボタン判定() MsgBox 現在のラウンド & ":" & 押された(現在のラウンド) End Sub Private Sub CommandButton1_Click() CommandButton1.Visible = False CommandButton2.Visible = True CommandButton3.Visible = True CommandButton4.Visible = True CommandButton5.Visible = True 現在のラウンド = 1 最終ラウンド = 10 End Sub Private Sub CommandButton2_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 2 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub Private Sub CommandButton3_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 3 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub Private Sub CommandButton4_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 4 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub Private Sub CommandButton5_Click() If CommandButton1.Visible = True Then MsgBox "スタートしていません" Exit Sub End If 押された(現在のラウンド) = 5 現在のラウンド = 現在のラウンド + 1 If 現在のラウンド > 最終ラウンド Then 終了処理 End Sub
- kaoaru
- ベストアンサー率33% (42/127)
自分で思いつかないような内容を「丸投げ」するのはあまり感心できませんですね! 考え方だけ述べます。具体的なコードは自分でやってください。 ボタンをカウントする変数はFormの一番上、つまりフォーム内のどこでも参照できるようにしておくことです。 あと、ボタンを1回押したら、それをマークするためのフラグを作ってもいいですし、各ボタンのカウント数がゼロ から変化したどうかをループで監視させればいいのです。 ループで監視させるには「タイマ処理」でいいのではないですか?タイマコンポーネントがありますよね?それのイベントハンドラ内で処理するということです。 こういうことを自分で思いつくというのはムリですか? 画面だけしか作れない、というのが実例で多いのですが、それではプログラミングとは思えないなぁ~! オリジナルな発想でやってみてください。そうすれば、こんなバカな考え方でも「パッ!」と出てくるものです。 では、ご精進ください!
- gt-t
- ベストアンサー率41% (7/17)
こんにちは、こういうことですか? Dim 現在のラウンド As Long Dim 最終ラウンド As Long Dim 履歴() As Long Private Sub ラウンド処理() 最終ラウンド = 10 現在のラウンド = 1 ReDim 履歴(最終ラウンド - 1) CommandButton2.Enabled = True CommandButton3.Enabled = True CommandButton4.Enabled = True CommandButton5.Enabled = True CommandButton1.Enabled = False End Sub Private Sub ボタン判定(押された As Long) MsgBox 現在のラウンド & ":" & 押された 履歴(現在のラウンド - 1) = 押された If 現在のラウンド = 10 Then Dim msgstr As String For i = LBound(履歴) To UBound(履歴) msgstr = msgstr & 履歴(i) & "," Next MsgBox 最終ラウンド & "ラウンド終了しました。" & Left(msgstr, Len(msgstr) - 1) CommandButton1.Enabled = True CommandButton2.Enabled = False CommandButton3.Enabled = False CommandButton4.Enabled = False CommandButton5.Enabled = False Else 現在のラウンド = 現在のラウンド + 1 End If End Sub Private Sub CommandButton1_Click() ラウンド処理 End Sub Private Sub CommandButton2_Click() ボタン判定 (2) End Sub Private Sub CommandButton3_Click() ボタン判定 (3) End Sub Private Sub CommandButton4_Click() ボタン判定 (4) End Sub Private Sub CommandButton5_Click() ボタン判定 (5) End Sub