複数フォームの活用のためのポイント

―UserFormsコレクション―

 この、便利な使用方法が期待されるモードレスなユーザーフォームの登場により、複数のフォームを同時に表示する機会が多くなると思われます。それにともない、複数のフォームに同一の処理を行なう機会もおのずと増えることでしょう。そんな時に便利なのが複数のフォームを扱うことのできるUserFormsコレクションです。まずは、図3のように複数のフォームを表示させている次のコードを見てみましょう。

図3:個々のフォームは独立して自由に移動

 Sub ComeonUserForm()
     Load UserForm1
     Load UserForm2
     Load UserForm3
 ' まずユーザーフォームを読み込む
     myTop = Application.Height - UserForms(0).Height
     myLeft = 40
 ' フォームを表示する「初期値」を設定。Excelの画面の高さか
 ' ら最初に読み込んだフォームの高さを引いて、高さを決定している
     For Each myForm In UserForms
         With myForm
             .StartUpPosition = 0
             .Top = myTop
             .Left = myLeft
             .Show vbModeless
         End With
 ' 読み込んだフォームを順番に処理。表示形式、縦位置、横位置
  を順に設定し、最後に「モードレス」で表示

         myLeft = myLeft + myForm.Width
 ' 次のフォームの表示位置を設定。今表示したフォームの横位置にその   
 '   フォームの幅を足して次のフォームが重ならないようにしている
     Next
 End Sub
 個々のユーザーフォームの表示位置の設定は、まず、表示形式を管理する「StartUpPositionプロパティ」を「0」(手動で設定)に変更し、フォームを表示する縦位置・横位置を表わす「TOPプロパティ」と「Leftプロパティ」をそれぞれ変更することで設定できます。その上で、モードレスな状態でフォームを表示させるためにShowメソッドに引数「vbModeless」を指定して表示させているのです。さらに、上記コードでは「For Each〜Nextステートメント」とユーザーフォームのコレクションである「UserFormsコレクション」を組み合わせて複数のユーザーフォームの表示位置の設定をしています。ここで注目していただきたいのが先頭の「Loadステートメント」の部分です。実はUserFormsコレクションは、アプリケーションに読み込まれた各ユーザーフォーム要素のコレクション(集合)を表わします。つまり、たとえ10個のユーザーフォームを作成しても、Loadステートメントなどによりメモリ内に読み込んであげなければ、UserFormsコレクションにはひとつのユーザーフォームも含まない、何も入っていない空の入れ物という状態になります。逆に考えるのならば、必要なフォームだけを読み込ませればUserFormsコレクションを利用して一括で処理を行なうことができる、というわけなのです。
 上記コードを記述したブックでもユーザーフォームは全部で5つ作成してありますが、必要な3つだけを読み込んで処理を行なっています。現在のページ、行なう作業などによりLoadするフォームの組み合わせを変更してあげることで、より細かいユーザーの要望に応えられるアプリケーションが作成できるようになるでしょう。また、一度読み込んだフォームを開放してUserFormsコレクションからはずすには、「Unload UserForm1」のようにUnloadステートメントを使用して開放します。

「顧客名」を表示しているUserForm1のリストボックスのコード

 Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) 
         
     PushAnyButton ListBox1.Value, 4
     ' リスト項目がダブルクリックされると
         ' 「選択された顧客名を4列目(列D)に」
     ' というデータで、「PushAnyButton」を実行している
 
     End Sub
「商品名」を表示しているUserForm2のコマンドボタンのコード

 Private Sub CommandButton1_Click()
      PushAnyButton "サムシンエルス", 5
 End Sub
 
 Private Sub CommandButton2_Click()
      PushAnyButton "20フライトロック", 5
 End Sub
 
 Private Sub CommandButton3_Click()
      PushAnyButton "サマータイムブルース", 5
 End Sub
 
 Private Sub CommandButton4_Click()
      PushAnyButton "未定", 5
 End Sub
 ' それぞれのボタンから「それぞれの商品名で、5列目(列E)に」
 ' というデータで「PushAnyButton」を実行している