ExcelVBAのフォームを駆使する
僕は、ExcelVBAでフォームを多用していますが、特定の
ブックにバインドしているフォームではなく、個人用マ
クロブックに作成して、汎用的な使用を想定しているフ
ォームが非常にたくさんあります。
ですが、フォームを使うには、フォームごとにShowメ
ソッドが必要ですよね。結果、フォーム1つに対して、
それを開くプロシージャが1つ必要になり、モジュール
が非常に煩雑になってしまいます。
また、不要になったフォームを解放(削除)しても、
Showメソッドの削除を忘れたりして、プログラムに
不備が生じる原因にもなります。
そこで、VBプロジェクト内の、VBコンポーネントの中
から、フォームだけを取得して、そのオブジェクト名を
コンボボックスから選択して開くようにする方法を紹介します。
まず、Excelの開発タブで、マクロのセキュリティをク
リックし、「VBAプロジェクトオブジェクトモデルへ
のアクセスを信頼する」にチェックを入れます。
その後、各フォームへの入り口となる、ポータル的なフ
ォームを作ります。コンボボックス1個、コマンドボタ
ン1個の、シンプルなフォームでOKです。
そのフォームのイニシャライズイベントに、以下のコードを記述します。
Dim i As Long
With ThisWorkbook.VBProject.VBComponents
For i = 1 To .Count
If .item(i).Type = 3 And .Item(i).Name <> "portal" Then
combo1.AddItem .Item(i).Name
End If
Next i
End With
ItemのTypeが「3」のものがフォームで、ポータル的なフ
ォーム名をportal、コンボボックスの名前をcombo1と
仮定したコードです。
次に、コマンドボタンのクリックイベントに、以下の
コードを記述します。
Dim str As String
str = combo1.Text
If str <> "" Then
UserForms.Add(str).Show vbModeless
End If
すると、portalを除くすべてのフォームが、コンボボッ
クスから選択できるようになり、フォーム名の変更、
新規フォームの追加、既存フォームの削除などのいかな
る状況でも、コードに修正を加える必要がなくなります。
あとは、portalのフォームのShowメソッドを作成するの
みです。VBEの中のコードがとてもスッキリするので、
非常におすすめです!