業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、フォームの表示位置を指定するStartUpPosition/Top/Leftプロパティ、右クリックメニューを表示するShowPopupメソッドなどの使い方を解説。
今回も、Tips「Excelのフォームをモードレス表示する、閉じる、隠す」に引き続きフォームの扱い方について解説する。
通常、フォームをShowメソッドで表示すると、自分の意図する位置とは異なる位置に表示される。そこで今回は、フォームの表示位置を指定する方法を紹介する。また、右クリックメニューを表示する方法も紹介する。
まずは、フォームの表示位置を指定する方法から解説しよう。
フォームの表示位置を指定するStartUpPosition/Top/Leftプロパティの書式は下記の通りだ。
{オブジェクト}.StartUpPosition={表1の値}
{オブジェクト}.Top={val}
{オブジェクト}.Left={val}
{オブジェクト}には、対象となるUserFormオブジェクトを指定する。{val}には、表示する位置を表す座標を数値で指定する。
定数 | 説明 |
---|---|
0 | 初期設定値を指定しない |
1 | オーナーフォームの中央 |
2 | 画面の中央 |
3 | 画面の左上隅 |
参考:StartUpPosition Property |
まずは、VBE(Visual Basic Editor)を起動して図1のようなフォームを作っておこう。コントロールは何も配置せず、UserForm1のプロパティからCaptionに「フォームの表示位置」と指定しておく。
続いて、Excelシートに「フォームの表示」ボタンを作成する。プロジェクト内のUserForm1を選択して、マウスの右クリックで表示される、「コードの表示」を選択してコードを記述する。
図2のように「UserForm」を選択して、右の選択ボックスから「Initialize」を選択する。
すると下記のコードが自動的に作成されるので、この中にリスト1のコードを記述する。
Private Sub UserForm_Initialize() End Sub
Initializeイベントは、ユーザーフォームが開かれたときに発生するイベントだ。
Option Explicit Private Sub UserForm_Initialize() With UserForm1 .StartUpPosition = 0 .Top = 200 .Left = 250 End With End Sub
「StartPosition」には「0」を指定して「初期設定値を指定しない」にしておく。「Top」に「200」、「Left」に「250」と指定する。
次に、VBEのメニューから、[挿入]→[標準モジュール]を選択する。プロジェクト内にModule1が追加されるので、この中に「フォームの表示」のコードを記述する(リスト2)。ShowメソッドでUserForm1を表示するだけだ。
Option Explicit Sub フォームの表示() UserForm1.Show End Sub
このリスト2のコードを「フォームの表示」ボタンに関連付け、実行した結果が図3だ。
次に、右クリックメニューを表示する方法を紹介しよう。Excelシートを追加して、図4のようにデータと「フォームを表示」というボタンを配置しておく。
次に、Tips「Excelのフォームをモードレス表示する、閉じる、隠す」で解説した手順でユーザーフォームを作成する。
UserForm1のCaptionプロパティに、「右クリックでメニューを表示フォーム」と指定しておく。ユーザーフォーム上には、リストボックスを1個だけ配置しておく。プロパティから、リストボックスの「オブジェクト名」には、「一覧ボックス」としておく。
図5のように配置する。リストボックスの「書体」や「文字サイズ」は、「Font」プロパティから指定している。読者の皆さんの好きな指定にしてもらって構わない。
右クリックメニューを表示するShowPopupメソッドの書式は下記の通りだ。
{オブジェクト}.ShowPopup
{オブジェクト}.Add(Position:{表2の値},Temporary:=True|False)
{オブジェクト}には、CommandBarオブジェクトを指定する。Addメソッドの「Position」プロパティには、表2の値を指定する。「Temporary」は省略可能だが、「True」を指定すると、新しいコマンドバーが一時的なものになる。この一時コマンドバーは、コンテナーアプリケーションの終了と同時に自動的に削除される。この引数を省略すると、既定値の「False」になる。
定数 | 説明 |
---|---|
msoBarLeft | 新しいコマンドバーを表示する位置をウィンドウの左端に指定 |
msoBarTop | 新しいコマンドバーを表示する位置をウィンドウの上端に指定 |
msoBarRight | 新しいコマンドバーを表示する位置をウィンドウの右端に指定 |
msoBarBottom | 新しいコマンドバーを表示する位置をウィンドウの下端に指定 |
msoBarFloating | 新しいコマンドバーがフローティング表示される |
msoBarPopup | 新しいコマンドバーがショートカットメニューとして作成される |
参考:_CommandBars.Add メソッド(Microsoft.Office.Core) |
プロジェクト内のUserForm1を右クリックすると表示される「コードの表示」を選択して、コードを記述する。
まず、ユーザーフォームがアクティブになったときに、「一覧ボックス」にデータを追加するコードはリスト3になる。
Option Explicit Dim i As Integer Dim myCommandBar As Variant Dim 名前 As String Private Sub UserForm_Activate() For i = 3 To 10 一覧リストボックス.AddItem Cells(i, 2) Next End Sub
2〜4行目でInteger型のプライベートモジュールレベル変数「i」、バリアント型の変数「myCommandBar」、文字列型の変数「名前」を宣言する。
処理自体は5〜9行目のUserForm_Activateイベント内に記述されている。
6〜8行目はプライベートモジュールレベル変数「i」を、「3」から「10」まで繰り返す処理だ。この値は「行番号」に該当する。「一覧リストボックス」にAddItemメソッドで「i」行目の「2列目(B列)」の値を追加していく。
次に、「一覧リストボックス」で、マウスの右クリックが行われたときのコードはリスト4になる。処理は「一覧リストボックス_MouseDown」イベント内に記述することになる。
Private Sub 一覧リストボックス_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 名前 = 一覧リストボックス.Text Set myCommandBar = CommandBars.Add(Position:=msoBarPopup, Temporary:=True) With myCommandBar With .Controls.Add .Caption = "選択します" .OnAction = "'nameShow " & Chr(34) & 名前 & Chr(34) & "'" End With End With If Button = 2 Then myCommandBar.ShowPopup End Sub
2行目ではプライベートモジュールレベル変数「名前」に、「一覧リストボックス」から選択された「氏名」を格納しておく。
3行目ではプライベートモジュールレベル変数「myCommandBar」に、Addメソッドで以下のプロパティを追加する。「Position」プロパティに表2の「msoBarPopup」を指定する。「Temporary」には「True」を指定して、コマンドバーを一時的なものにし、コンテナアプリケーションの終了と同時に自動的に削除されるようにしておく。
4〜9行目ではWith文を使い、myCommandBarのControls.Addメソッドに、ポップアップメニューに表示する「Caption」を指定する。また「OnAction」には、ポップアップメニューを選択したときに実行される、イベントハンドラーを指定する。
7行目のOnActionに指定するイベントハンドラーは、必ず「標準モジュール」内に記述する必要があるので、注意してほしい。
「OnAction」では実行されるイベントハンドラーに引数を渡している。渡している引数はプライベートモジュールレベル変数「氏名」に格納されている値だ。引数を指定する際に記述している「Chr(34)」は「"」(ダブルクオーテーション)の意味だ。引数に変数を渡す場合は、下記のように記述する必要があるので、注意してほしい。
.OnAction = "'nameShow " & Chr(34) & 名前 & Chr(34) & "'"
最後に10行目で、MouseDownイベントの引数「Button」が「2」の場合に、ShowPopupメソッドでポップアップメニューを表示するようにしている。「Button」が「2」の場合ということは、「マウスの右ボタンがクリックされたとき」という意味になる。「マウスの左ボタンがクリックされたとき」は値は「1」になる。
次に、VBEのメニューから、[挿入]→[標準モジュール]を選択する。プロジェクト内にModule1が追加されるので、この中に「フォームの表示」のコードを記述する(リスト5)。この標準モジュール内にはフォームを表示する処理と、リスト4の「OnAction」で呼び出すイベントハンドラーも記述している。
Option Explicit Sub フォームの表示() UserForm1.Show vbModeless End Sub Sub nameShow(名前 As String) MsgBox "選択されたのは" & 名前 & "さんです。" End Sub
図4の「フォームを表示」ボタンには、「フォームの表示」プロシージャを関連付ける。Showメソッドを使って、モードレスでフォームを表示している。
リスト4の7行目の「OnAction」のイベントハンドラーは、「nameShow(名前 As String)」だ。リスト5の7行目では、リスト4から渡された引数の「名前」の値を、「MsgBox」関数で表示させている。
今回はフォームの表示位置を指定する方法と右クリックメニューを表示する方法を解説した。
「フォームの表示位置」は、何も設定しないと、「オーナーフォームの中央(1)」に表示される。明示的に表示位置を指定する必要がある場合には、ぜひこのTipsを使っていただきたい。
薬師寺 国安(やくしじ くにやす) / 薬師寺国安事務所
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。
Copyright © ITmedia, Inc. All Rights Reserved.