ExcelVBAのユーザーフォームで入力項目が増えてくると、1つの画面にすべてのコントロールを詰め込んでしまい、見づらく操作しにくいフォームになりがちです。また、オプションボタン(ラジオボタン)を複数グループ用意したいのに、すべて同じフォーム上に置くと選択が競合してしまうこともあります。
こうした悩みを解決してくれるのが、MultiPageコントロールとFrameコントロールです。MultiPageは画面をタブで切り替えて表示できるコントロール、Frameはコントロールをグループ化する箱のようなコントロールです。
この記事では、2つのコントロールの基本的な使い方から、実務でよくある「入力ステップを分けたウィザード形式のフォーム」への応用まで解説します。
MultiPageコントロールの使い方
MultiPageは、1つのユーザーフォーム上に複数の「ページ」を作り、タブをクリックすることで表示を切り替えられるコントロールです。入力項目が多いフォームを「基本情報」「詳細情報」「確認」のようにステップごとに分けたいときに便利です。
ツールボックスからMultiPageをフォームにドラッグすると、デフォルトで「Page1」「Page2」の2ページが作成されます。ページ数を増やしたい場合は、タブを右クリックして「ページの挿入」を選択します。各ページのCaptionプロパティを変更すると、タブに表示される名前を変えられます。
コード上でページを切り替えるには、MultiPageのValueプロパティを使います。Valueは0から始まるインデックスで、0番目のページが「Page1」に対応します。
Private Sub btnNext_Click()
' 現在のページの次のページへ移動する
If MultiPage1.Value < MultiPage1.Pages.Count - 1 Then
MultiPage1.Value = MultiPage1.Value + 1
End If
End Sub
Private Sub btnBack_Click()
' 現在のページの前のページへ戻る
If MultiPage1.Value > 0 Then
MultiPage1.Value = MultiPage1.Value - 1
End If
End Sub
「次へ」「戻る」ボタンと組み合わせることで、ウィザード形式の入力フォームを簡単に作成できます。また、Changeイベントを使えば、ページが切り替わったタイミングで処理を実行することも可能です。
Private Sub MultiPage1_Change()
' ページが切り替わったときに、現在のページ名をタイトルバーに表示する
Me.Caption = "入力フォーム - " & MultiPage1.Pages(MultiPage1.Value).Caption
End Sub
Frameコントロールの使い方
Frameは、複数のコントロールを1つの枠でまとめるためのコントロールです。特に、オプションボタン(OptionButton)は「同じ親コントロールの中にあるもの同士」でしか排他選択(1つ選ぶと他が外れる動き)が働かない性質があります。そのため、フォーム上に2種類以上のオプショングループを配置したい場合は、Frameで分けて配置する必要があります。
Private Sub UserForm_Initialize()
' 「性別」グループの初期選択
optMale.Value = True
' 「配送方法」グループの初期選択
optStandard.Value = True
End Sub
Private Sub btnConfirm_Click()
Dim genderText As String
Dim shippingText As String
' fraGenderフレーム内のオプションボタンから選択値を取得
If optMale.Value = True Then
genderText = "男性"
ElseIf optFemale.Value = True Then
genderText = "女性"
End If
' fraShippingフレーム内のオプションボタンから選択値を取得
If optStandard.Value = True Then
shippingText = "通常配送"
ElseIf optExpress.Value = True Then
shippingText = "速達配送"
End If
MsgBox "性別:" & genderText & vbCrLf & "配送方法:" & shippingText
End Sub
上記の例では、fraGenderというFrameの中にoptMaleとoptFemale、fraShippingという別のFrameの中にoptStandardとoptExpressを配置しています。フレームを分けることで、「性別」と「配送方法」のそれぞれで独立して1つずつ選択できるようになります。
MultiPageとFrameを組み合わせた実践例
MultiPageの各ページの中にFrameを配置すれば、「タブで大分類を切り替えつつ、各タブ内でオプショングループを整理する」という、実務でよく使われるフォーム構成を作れます。
Private Sub UserForm_Initialize()
' 1ページ目(基本情報)を表示した状態で起動する
MultiPage1.Value = 0
' 各ページ内のフレームにあるオプションボタンの初期値を設定
optMale.Value = True
optStandard.Value = True
End Sub
Private Sub btnSubmit_Click()
' 入力チェック:氏名が未入力なら1ページ目に戻して警告
If Trim(txtName.Text) = "" Then
MultiPage1.Value = 0
MsgBox "氏名を入力してください。"
txtName.SetFocus
Exit Sub
End If
MsgBox "入力内容を送信しました。"
Unload Me
End Sub
このように、入力チェックで不備があったページへMultiPage1.Valueを使って自動的に戻す処理を組み込むと、ユーザーが迷わず修正できる親切なフォームになります。
まとめ
MultiPageは、1つのフォームを複数ページに分けてタブで切り替えられるコントロール。Valueプロパティでページを切り替え、Changeイベントで切り替え時の処理を実装できるFrameは、コントロールをグループ化する箱。特にオプションボタンを複数グループ用意したいときは、フレームで分けないと排他選択が正しく働かないMultiPageのページの中にFrameを配置することで、大分類はタブ、その中の選択肢はフレームで整理する実務的なフォーム設計が可能
入力項目が多いフォームほど、MultiPageとFrameを使った画面整理の効果は大きくなります。ユーザーフォームを設計する際は、いきなり1画面に詰め込むのではなく、これらのコントロールで構造化することを検討してみてください。

コメント