こんにちは!Lenocoです。本日も見てくださりありがとうございます。
今回はユーザーフォームについてのTips回です!!!
過去のブログ3回に渡り、氏名・性別・生年月日のデータをランダム生成するマクロを作ってきました。
第一回目「氏名のダミーデータを自動作成するマクロ」
第二回目「指定した年齢の範囲でランダムで生年月日を出力するマクロ」
第三回目「指定した列数に応じて出力列を変更する」
マクロを動かしてみると分かりますが、
全てダイアログボックスが表示され、出力有無を確認しています。
ただこれだと何度もダイアログボックスが表示され、少し煩わしい気がしますよね。
今回は、ユーザーフォームを使用して一回で確認するようにしたいと思います。
ラベル、テキストボックス、フレーム、チェックボックス、コマンドボタンを使用していきますので是非参考にしてみてください!
ユーザーフォームの呼び出し方
①ユーザーフォームを追加する
VBEを開き、メニユーの「挿入」→「ユーザー フォーム」から追加します。
もしくは、左ウインドウのプロジェクト内を右クリックし、「挿入」→「ユーザー フォーム」から追加します。
UserForm1が追加されます。
②ツールボックスからコントロールを配置していく
以下のように、ラベル、テキストボックス、フレーム、チェックボックス、コマンドボタンを配置していきます。
※図形で囲っているツールボックスのコントロールが、それぞれの色の項目に対応しています。
オレンジ:ラベル
黄色:テキストボックス
緑:フレーム
青:チェックボックス
赤:コマンドボタン
③表示される文字列を変更する
プロパティのCaptionを変更することで、表示されている名称を変更できます。それぞれ以下のように変更してください。
※プロパティウィンドウが開いてない場合はF4キーもしくは「表示」→「プロパティウィンドウ」で開けます。
UserForm1:出力設定
Label1:出力件数
Label2:※必須
Label3:最少年齢
Label4:最大年齢
Label5:※必須
Label6:※必須
Frame1:出力項目
CheckBox1:タイトル
CheckBox2:性別
CheckBox3:生年月日
CommandButton1:実行
※TextBox1~3は設定不要です。
※書式はプロパティの「Font」から「Meiryo UI」、ラベル「※必須」はプロパティの「Forecolor」から赤字に設定しています。
それぞれ設定すると以下のようになります。
④生年月日の最小年齢と最大年齢の項目を非表示設定にする
最小年齢と最大年齢のテキストボックスと「※必須」のラベルは、生年月日のチェックボックスがオンのときのみ表示したいです。
フォームを開いた時には生年月日のチェックボックスはオフになっているので、
プロパティから非表示設定をしておきます。
項目を選択し、プロパティの「Visible」を「False」に変更します。
最初に開いたとき以下のような形になります。
⑤フォームのコードを記述する
チェックボックスがオンになったとき、コマンドボタンが押されたときなどそれをトリガーに処理を実行することができます。
今回は以下の2つの場合に処理を実行させます。
1.「生年月日」のチェックボックスがオンになったとき
フォームに配置した生年月日のチェックボックスをダブルクリックすると、以下のコードが自動的に生成されます。
Private Sub CheckBox3_Click()
End Sub
そうしたら、Subの間にコードを書き入れましょう。
Private Sub CheckBox3_Click()
If CheckBox3.Value = True Then
TextBox2.Visible = True
TextBox3.Visible = True
Label5.Visible = True
Label6.Visible = True
Else
TextBox2.Visible = False
TextBox3.Visible = False
Label5.Visible = False
Label6.Visible = False
End If
End Sub
コードの説明
生年月日のチェックボックスをクリックした際、このSubステートメントに入ります。
チェックボックスの「Value」を見て、チェックボックスがオン(True)かオフ(False)かを確認します。
生年月日のチェックボックスがオンだった場合、
テキストボックス2と3(最小年齢と最大年齢の右側のテキストボックス)、ラベル5と6(最小年齢と最大年齢の右側の「※必須」)を表示し、
逆に生年月日のチェックボックスがオフになった場合、
テキストボックス2と3、ラベル5と6は非表示となります。
2.「実行」ボタンを押したとき
フォームに配置した「実行」のコマンドボタンをダブルクリックすると、以下のコードが自動的に生成されます。
Private Sub CommandButton1_Click()
End Sub
そうしたら、Subの間にコードを書き入れましょう。
Private Sub CommandButton1_Click()
If TextBox1.Value = "" Or (CheckBox3.Value = True And (TextBox2.Value = "" Or TextBox3.Value = "")) Then
MsgBox "テキストボックスは必須入力です。"
Else
Me.Hide
End If
End Sub
コードの説明
「実行」のコマンドボタンをクリックした際、このSubステートメントに入ります。
まず、If文で、テキストボックスが空白でないかどうかを確認します。
以下に該当する場合、If文に入り、エラーメッセージを表示します。
「出力件数」のテキストボックスが空白
もしくは
「生年月日」のチェックボックスがオン かつ 最小年齢と最大年齢のテキストボックスが空白
If文を抜け、再びフォームの入力画面になり、再度入力を促します。
入力が正しくできていた場合、
Elseに入り、フォームを非表示にします。
⑥マクロからフォームを呼び出し、値を取得する
以前のブログ「」で作成した「CreateDummyData」プロシージャの、一部のコードを差し替えてください。
差し替え前:ダイアログボックスから値取得
'何件出力するか入力
outputNum = Application.InputBox("何件出力しますか?", "出力件数確認", "", Type:=1)
'タイトル行を出力するか確認
outputTitleAns = MsgBox("タイトル行を出力しますか?", vbYesNo + vbInformation)
'性別も出力するか確認
outputSexAns = MsgBox("性別も出力しますか?", vbYesNo + vbInformation)
'生年月日を出力するか確認
outputBirthdayAns = MsgBox("生年月日も出力しますか?", vbYesNo + vbInformation)
If outputBirthdayAns = vbYes Then
outputMinAge = Application.InputBox("出力したい最小年齢を入力してください。", "最小年齢確認", "", Type:=1)
outputMaxAge = Application.InputBox("出力したい最高年齢を入力してください。", "最高年齢確認", "", Type:=1)
End If
上記の部分を以下のコードに差し替えてください。
差し替え後:フォームから値取得
UserForm1.Show
With UserForm1
outputNum = .TextBox1.Value
If .CheckBox1.Value = True Then outputTitleAns = vbYes
If .CheckBox2.Value = True Then outputSexAns = vbYes
If .CheckBox3.Value = True Then
outputBirthdayAns = vbYes
outputMinAge = .TextBox2.Value
outputMaxAge = .TextBox3.Value
End If
Unload UserForm1
End With
コードの説明
ユーザーフォームを表示します。
出力件数のテキストボックスの内容を取得します。
タイトルのチェックボックスがオンだったら、outputTitleAnsにvbYesを入れておきます。
性別のチェックボックスがオンだったら、outputSexAnsにvbYesを入れておきます。
生年月日のチェックボックスがオンだったら、最小年齢と最大年齢をoutputMinAge、outputMaxAgeに入れておきます。
最後にユーザーフォームを閉じます。
UnloadとHideの違い
「フォームを閉じる」(Unload)ではフォームは完全に終了し、メモリからも削除されますが、
⑤のコードで記述した「フォームを隠す」(Hide)では、フォーム自体は、メモリ上に残り終了はしていない状態です。
最後に必ず「Unload」を使用してフォームを閉じるようにしましょう。
さいごに
フォームから確認できるようになったのでとってもすっきりしました。
今回はフォームの使用方法をご紹介しました!
是非使用してみてください。
Lenoco