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の中のコードがとてもスッキリするので、
非常におすすめです!

この記事が気に入ったらサポートをしてみませんか?