連載
» 2014年10月29日 18時00分 公開

VBA/マクロ便利Tips:Excelフォームの表示位置を指定し右クリックメニューを表示する

業務効率化に役立つVBA/マクロのさまざまなTipsをコード例を交えて紹介していきます。今回は、フォームの表示位置を指定するStartUpPosition/Top/Leftプロパティ、右クリックメニューを表示するShowPopupメソッドなどの使い方を解説。

[薬師寺国安,ITmedia]
「VBA/マクロ便利Tips」のインデックス

連載目次

※本Tipsの環境:Windows 8.1 Enterprise(64ビット)+Excel 2013


 今回も、Tips「Excelのフォームをモードレス表示する、閉じる、隠す」に引き続きフォームの扱い方について解説する。

 通常、フォームをShowメソッドで表示すると、自分の意図する位置とは異なる位置に表示される。そこで今回は、フォームの表示位置を指定する方法を紹介する。また、右クリックメニューを表示する方法も紹介する。

フォームの表示位置を指定するStartUpPosition/Top/Leftプロパティ

 まずは、フォームの表示位置を指定する方法から解説しよう。

 フォームの表示位置を指定するStartUpPosition/Top/Leftプロパティの書式は下記の通りだ。

フォームの表示位置を指定するStartUpPosition/Top/Leftプロパティの書式

{オブジェクト}.StartUpPosition={表1の値}

{オブジェクト}.Top={val}

{オブジェクト}.Left={val}


 {オブジェクト}には、対象となるUserFormオブジェクトを指定する。{val}には、表示する位置を表す座標を数値で指定する。

表1 StartUpPositionの値
定数 説明
0 初期設定値を指定しない
1 オーナーフォームの中央
2 画面の中央
3 画面の左上隅
参考:StartUpPosition Property

 まずは、VBE(Visual Basic Editor)を起動して図1のようなフォームを作っておこう。コントロールは何も配置せず、UserForm1のプロパティからCaptionに「フォームの表示位置」と指定しておく。

図1 「フォームの表示位置」というキャプションの付いたUserForm1を作成する

 続いて、Excelシートに「フォームの表示」ボタンを作成する。プロジェクト内のUserForm1を選択して、マウスの右クリックで表示される、「コードの表示」を選択してコードを記述する。

 図2のように「UserForm」を選択して、右の選択ボックスから「Initialize」を選択する。

図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
リスト1 指定した位置にフォームを表示するコード

 「StartPosition」には「0」を指定して「初期設定値を指定しない」にしておく。「Top」に「200」、「Left」に「250」と指定する。

 次に、VBEのメニューから、[挿入]→[標準モジュール]を選択する。プロジェクト内にModule1が追加されるので、この中に「フォームの表示」のコードを記述する(リスト2)。ShowメソッドでUserForm1を表示するだけだ。

Option Explicit
Sub フォームの表示()
  UserForm1.Show
End Sub
リスト2 フォームを表示するコード

 このリスト2のコードを「フォームの表示」ボタンに関連付け、実行した結果が図3だ。

図3 「Top」が200、「Left」が250の場所にフォームが表示された

右クリックメニューを表示するShowPopupメソッド

 次に、右クリックメニューを表示する方法を紹介しよう。Excelシートを追加して、図4のようにデータと「フォームを表示」というボタンを配置しておく。

図4 データと「フォームを表示」ボタンを配置した

 次に、Tips「Excelのフォームをモードレス表示する、閉じる、隠す」で解説した手順でユーザーフォームを作成する。

 UserForm1のCaptionプロパティに、「右クリックでメニューを表示フォーム」と指定しておく。ユーザーフォーム上には、リストボックスを1個だけ配置しておく。プロパティから、リストボックスの「オブジェクト名」には、「一覧ボックス」としておく。

 図5のように配置する。リストボックスの「書体」や「文字サイズ」は、「Font」プロパティから指定している。読者の皆さんの好きな指定にしてもらって構わない。

図5 リストボックスコントロールを配置した

 右クリックメニューを表示するShowPopupメソッドの書式は下記の通りだ。

右クリックメニューを表示するShowPopupメソッドの書式

{オブジェクト}.ShowPopup

{オブジェクト}.Add(Position:{表2の値},Temporary:=True|False)


 {オブジェクト}には、CommandBarオブジェクトを指定する。Addメソッドの「Position」プロパティには、表2の値を指定する。「Temporary」は省略可能だが、「True」を指定すると、新しいコマンドバーが一時的なものになる。この一時コマンドバーは、コンテナーアプリケーションの終了と同時に自動的に削除される。この引数を省略すると、既定値の「False」になる。

表2 Positionに指定する値
定数 説明
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
リスト3 「一覧リストボックス」にデータを表示するコード

 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
リスト4 「一覧リストボックス」で、マウスの右クリックが行われたときのコード

 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」になる。

フォーム表示処理と「OnAction」で呼び出すイベントハンドラーを標準モジュールに

 次に、VBEのメニューから、[挿入]→[標準モジュール]を選択する。プロジェクト内にModule1が追加されるので、この中に「フォームの表示」のコードを記述する(リスト5)。この標準モジュール内にはフォームを表示する処理と、リスト4の「OnAction」で呼び出すイベントハンドラーも記述している。

Option Explicit
Sub フォームの表示()
  UserForm1.Show vbModeless
End Sub
 
Sub nameShow(名前 As String)
  MsgBox "選択されたのは" & 名前 & "さんです。"
End Sub
リスト5 標準モジュール内のコード

 図4の「フォームを表示」ボタンには、「フォームの表示」プロシージャを関連付ける。Showメソッドを使って、モードレスでフォームを表示している。

 リスト4の7行目の「OnAction」のイベントハンドラーは、「nameShow(名前 As String)」だ。リスト5の7行目では、リスト4から渡された引数の「名前」の値を、「MsgBox」関数で表示させている。

実行結果

図6 「一覧リストボックス」上で、マウスの右クリックをするとポップアップメニューが表示され、それをクリックすると選択した氏名がダイアログボックスで表示される

まとめ

 今回はフォームの表示位置を指定する方法と右クリックメニューを表示する方法を解説した。

 「フォームの表示位置」は、何も設定しないと、「オーナーフォームの中央(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© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。