図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コレクションを利用して一括で処理を行なうことができる、というわけなのです。
「顧客名」を表示しているUserForm1のリストボックスのコード |
|
「商品名」を表示しているUserForm2のコマンドボタンのコード |
|