こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

[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の

【質問】
毎ラウンドごとにボタンの入力待ちのような状態を
「できるだけこの形を崩さずに」組み込むためには、どのような処理を加えればいいでしょうか。

投稿日時 - 2012-11-06 16:08:09

QNo.7784606

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

投稿日時 - 2012-11-06 16:49:27

ANo.2

自分で思いつかないような内容を「丸投げ」するのはあまり感心できませんですね!

考え方だけ述べます。具体的なコードは自分でやってください。


ボタンをカウントする変数はFormの一番上、つまりフォーム内のどこでも参照できるようにしておくことです。

あと、ボタンを1回押したら、それをマークするためのフラグを作ってもいいですし、各ボタンのカウント数がゼロ
から変化したどうかをループで監視させればいいのです。

ループで監視させるには「タイマ処理」でいいのではないですか?タイマコンポーネントがありますよね?それのイベントハンドラ内で処理するということです。


こういうことを自分で思いつくというのはムリですか?

画面だけしか作れない、というのが実例で多いのですが、それではプログラミングとは思えないなぁ~!

オリジナルな発想でやってみてください。そうすれば、こんなバカな考え方でも「パッ!」と出てくるものです。

では、ご精進ください!

投稿日時 - 2012-11-06 16:43:34

ANo.1

こんにちは、こういうことですか?

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

投稿日時 - 2012-11-06 16:41:20

あなたにオススメの質問