九九の計算問題を作成
ユーザーフォームとコントロールを使って、九九の計算問題を作成しよう。

先ほどのUserForm1を元にして作成していきます。


UserFormの名前を変更
UserForm1の名前を「九九計算問題」に変更する。
@UserFor上をクリックするとUserFormのプロパティーが選択されます。
ACaptionを選択し、右側の文字を削除し、「九九計算問題」と入力します。
BBackColorを選択し、を押す。パレットを選択し、好きな色をクリックすると、Formの色が変わります。

Label2・4の設定
@Label2とLabel4のCaptionに「×」「=」を入れます。
AFontを選択し、文字の種類と大きさを決めます。
BBackColorを選択し、Formの色に合わせます。

Label1・3の設定
@Label2とLabel4のCaptionを空白にします。
AFontを選択し、文字の種類と大きさを決めます。
BLabel1とLabel3のBackColorをFormの色に合わせます。

正解・不正解の文字を表示するために新たにLabel5を作成します(追加)
@Label5のCaptionを空白にします。
AFontを選択し、文字の種類と大きさを決めます。
BLabel5のBackColorをFormの色に合わせます。

CommandButton1・2の設定
@CommandButton1とCommandButton2のCaptionに「スタート」「終了」を入れます。
ABackColorを選択し、Formの色と違う色を選択します。
BCommandButton1のオブジェクト名を「St」に、CommandButton2のオブジェクト名を「En」に変更します。

TextBoxの設定
@このままにしておきます。

以上でFormのスタイルが完成しました。





次は、それぞれにコードを記述していきます。
コードの記述の前に
大切なことは、どのようなものを作成したいのかを決めることです。今回は、次の条件のものを作成します。
@スタートを押すと式の中に数字が出てくる。
ATextBoxにすぐ答えを入力できるように、TextBoxにカーソルを点滅させておく。(Focus)
BEnterを押すと、正解か不正解かを表示し、次の問題が出てくる。
C問題の数字は、ランダムに出てくるようにする。

コードの記述

スタートを押すと式の中0から9までのランダムな数字が出てくる。
スタートボタンの上で右クリックし、コードの表示を選択します。
Private Sub St_Click()

End Sub
このPrivte Sub と End Sub との間にコードを記述します。

ランダムな数字を発生させる
Rnd関数

単精度浮動小数点数型 (Single) の乱数を返します。

Rnd 関数は 0 以上、1 未満の範囲の値を返します。

初期シード値が変わらない限り、一連の Rnd 関数が返す乱数系列は同じになります。これは、連続する各 Rnd 関数が乱数系列の中の直前の乱数をシード値として、次の乱数をそれぞれ生成するためです。

システム タイマーから取得した新しいシード値を使って、乱数ジェネレータを初期化するには、Rnd 関数を呼び出す前に、引数を指定せずに Randomize ステートメントを実行してください。

任意の範囲の整数の乱数を生成するには、次の式を使ってください。

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

この式では、変数 upperbound には範囲の上限の値を指定し、変数 lowerbound には範囲の下限の値を指定します。


Int関数

指定した数値の整数部分を返します。

構文

Int(number)

Int 関数は、引数 number の小数部分を取り除いた整数値を返します。


Randomize ステートメント

乱数ジェネレータを初期化 (乱数系列を再設定) する数値演算ステートメントです。

Randomize ステートメントを使用しない場合、引数を指定しないで Rnd 関数を呼び出すと、最初に Rnd 関数を呼び出したときのシード値と同じ値が使用されます。それ以降は、直前に生成された数がシード値として使用されます。


 Randomizeステートメント・Rnd関数・Int関数を使って、ランダムな数字を発生させ、ラベル1・ラベル3に代入します。
Private Sub St_Click()
Dim Value1, Value2 As Integer
Randomize
Value1 = Int((9 - 0 + 1) * Rnd + 0)
Label1.Caption = Value1

Randomize
Value2 = Int((9 - 0 + 1) * Rnd + 0)
Label3.Caption = Value2


テキストボックス1に解答者が入れた数字と正解とを比べて、正解・不正解を表示する

ここで、正解を代入するLabel6を作成します。

Formの幅を広げ、Label6を作成してください。
幅を狭めるとLabel6は隠れます。

正解をLabel6に代入する。
Label6.Caption = Value1 * Value2

TextBox1に入力した解答が正解の場合は、「正解」という文字を出す。間違いの場合は、「不正解」という文字を出す。
If TextBox1.Text = Label6.Caption Then
Label5.Caption = "正解"
Else
Label5.Caption = "不正解"
End If

これらのコードを続けて記述すると(左側)
Private Sub St_Click()
Dim Value1, Value2 As Integer
Randomize
Value1 = Int((9 - 0 + 1) * Rnd + 0)
Label1.Caption = Value
Randomize
Value2 = Int((9 - 0 + 1) * Rnd + 0)
Label3.Caption = Value2
If TextBox1.Text = Label6.Caption Then
Label5.Caption = "正解"
Else
Label5.Caption = "不正解"
End If
Label6.Caption = Value1 * Value2
End Sub



Private Sub En_Click()
End
End Sub
Private Sub St_Click()
Dim Value1, Value2 As Integer
Label5 = ""
Randomize
Value1 = Int((9 - 0 + 1) * Rnd + 0)
Label1.Caption = Value1
Randomize
Value2 = Int((9 - 0 + 1) * Rnd + 0)
Label3.Caption = Value2
TextBox1.SetFocus
If TextBox1.Text = Label6.Caption Then
Label5.Caption = "正解"
Else
Label5.Caption = "不正解"
End If
If TextBox1.Text = "" Then
Label5.Caption = ""
End If

If Label5.Caption = "正解" Then
Beep
End If

Label6.Caption = Value1 * Value2
TextBox1.Text = ""
End Sub



Private Sub En_Click()
End
End Sub
となりますが、このままでは思うように動きません。右側に動作するコードを記述します。
赤文字が追加した記述です。コードの記述はこれでいいのですが、各コントロールのプロパティーを一部変更する必要があります。

@UserForm1上で右クリックし、タブオーダーを選択します。次の順番に並べ替えしてください。(しなければ動かないというわけではありません)

各コントロールのプロパティーの「TabIndex」が順番付けされます。番号は0から始まります。Stは0です。

ASt CommandButtonのプロパティーの「Default」を「True」にしてください。こうすることによって、 Enter キーを押すとスタートを押したことになります。

BModule1に次のコードを記述します
Sub 九九計算問題()
UserForm1.Show
End Sub

以上で、設定はすべて終了し九九計算問題が完成しました。

追加として、「正解」ときに○の図を表示し、「不正解」のときに×の図を表示するコードを作成します。
○と×のjpgを用意してください。
サンプルです。 
@ツールボックスのイメージを選択して、UseForm1のあいているところに、Image1を作成します。その上に重ねてImage2を作成します。
AImage1のプロパティーの「Picture」を選択し、貼り付けるjpgを決めます。
BImage2のプロパティーの「Picture」を選択し、貼り付けるjpgを決めます。
C赤文字のコードを追加・変更します。
Private Sub St_Click()
Dim Value1, Value2 As Integer
Label5 = ""
Randomize
Value1 = Int((9 - 0 + 1) * Rnd + 0)
Label1.Caption = Value1
Randomize
Value2 = Int((9 - 0 + 1) * Rnd + 0)
Label3.Caption = Value2
TextBox1.SetFocus
If TextBox1.Text = Label6.Caption Then
Label5.Caption = "正解"
Image1.Visible = True
Image2.Visible = False

Else
Label5.Caption = "不正解"
Image1.Visible = False
Image2.Visible = True

End If
If TextBox1.Text = "" Then
Label5.Caption = ""
End If
If TextBox1.Text = "" Then
Image1.Visible = False
ElseIf Label5.Caption = "正解" Then

Beep
End If
Label6.Caption = Value1 * Value2
TextBox1.Text = ""
End Sub

Private Sub En_Click()
End
End Sub
これで、○×も表示されるようになりました。

ここをクリックして九九計算問題をオープンしてください。ファイルにダウンロードすることなく動きを確認することができます。
次に、ここをクリックして、九九計算問題2をオープンしてください。九九計算問題2は、エクセルのブックが開かれずに、UserFormのみが開かれています。この方法を次に書いていきます。




Open イベント
ブックを開いたときに発生します。次の構文の下に処理を作成します。
構文
Private Sub Workbook_Open()

イベントプロシージャの作成


「ThisWorkbook」をダブルクリックします。


オブジェクトリストから「Workbook」を選択します。


自動的に「Open」イベントプロシージャが作成されます。

ブックを開かずに、UserFormを開くコードの記述
Private Sub Workbook_Open() 
Application.Visible = False
UserForm1.Show
End Sub
ApplicationのVisibleプロパティー
Excelアプリケーションを表示するかどうか。
Trueの場合は、表示
Falseの場合は、非表示