こんにちは、Ryoです。
VBAでユーザーフォームを扱っていると、ユーザーフォームからユーザーフォームを呼び出したり、切り替えて運用したいことがあるかと思います。例えばパスワード入力フォームを最初に表示し、正常入力されたら次画面のフォームを開いて、最初の認証用フォームは閉じる…のような流れですね。今回はこの例えに沿って書いていこうと思います。
1.サンプル概要
先ず「PassWord入力用フォーム」を起動して表示します。今回のサンプルでは”pass”をパスワードとして設定していますが、入力時の表示は”●”になります。

「入力画面へ」のボタンを押すと、「PassWord入力」フォームは消えて次の「入力画面」フォームが開きます。

この「入力画面」にあるテキストボックスに入力して「セルへ書込み」ボタンを押すと、セルA1に「Name」、セルA2に「Address」が書き込まれます。

2.ユーザーフォーム構成
「PassWord入力」フォームは以下画像の通りUserForm1、TextBox1、CommandButton1で構成しています。

サンプル用としてFormのCaptionやフォントを設定していますが、この辺り既定のままでも特に問題ないです。変更したい場合はプロパティ画面の「Font」や「Caption」を適宜設定してください。

次に「入力画面」の構成ですが、これもほぼ同様でUserForm2、TextBox1、TextBox2、CommandButton1となっていて、テキストボックスが1つ増えているだけです。

こちらのCaptionやFontも必要に応じて適宜設定してください。「Name」や「Address」の表記はツールボックス内で「A」となっている「ラベル」を使えば設定できます。
3.サンプルコード
◆「PassWord入力」フォーム:UserForm1
このフォームではパスワードを入力するので、入力文字を”●”に置換していますが、詳しい内容については以前の記事を参照いただければと思います。

入力文字の置換やテキストボックス内の位置設定をUserForm1の初期化処理として行いますので、UserForm_Initialize()に以下の記述を行います。
Private Sub UserForm_Initialize()
With TextBox1
.PasswordChar = "●"
.TextAlign = fmTextAlignCenter
'既定:fmTextAlignLeft 右揃え:fmTextAlignRight
End With
End Sub
この処理によって、Textbox1に入力された文字は”●”となり、位置は「中央」になります。
次に「入力画面へ」のボタンを押した際の処理になります。
Private Sub CommandButton1_Click()
'入力文字の判定
If TextBox1.Value = "pass" Then
'UserForm1を非表示
Unload Me
'UserForm2を呼び出し
UserForm2.Show
Else
MsgBox "パスワードが一致しません", vbCritical
'入力不一致の場合、TextBox1をクリア
Me.TextBox1 = vbNullString
'再入力しやすいようにTextBox1にフォーカスを戻す
Me.TextBox1.SetFocus
End If
End Sub
ここで処理しているのは、入力された文字(パスワード)の判定を行い、正しく入力されていれば本フォーム(UseForm1)を非表示にして入力画面(UserForm2)を呼び出しています。
入力が不一致であればメッセージボックスで警告表示を行い、再入力しやすいようにTextBox1の文字をクリアしてフォーカスを移す処理を行っています。
◆「入力画面」フォーム:UserForm2
こちらはTextBox1、TextBox2に入力された文字をセルA1,A2に書込む処理を行います。サンプルとしては二つのテキストボックスに入力済みで書込みを行い、空白がある場合はメッセージボックスで警告表示する形としています。
Private Sub CommandButton1_Click()
If Me.TextBox1 <> "" And Me.TextBox2 <> "" Then
Cells(1, 1) = Me.TextBox1.Value
Cells(2, 1) = Me.TextBox2.Value
Else
MsgBox "未入力箇所があります", vbCritical
End If
End Sub
これでパスワードが正しく入力されたら別フォームが開き、そのフォームから違う処理を行うことが出来ます。
4.まとめ
本サンプルではパスワード入力⇒別フォームを一例として書いていますが、フォーム自体の切替がこのように出来ることを知っておくと、今後何かを作成する際に幅が広がると思います。
今回の内容ではフォームを切り替えていますが、フォーム間で変数を共有したい場合時は「標準モジュール」に共用できる「広域変数」として定義させる方法もありますから、その際はPublic 変数名 As データ型(Integerなど)と書けばOKです。
以上、ユーザーフォームを切り替えて使用する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo

