VBA ユーザーフォームを常に表示する方法|自動表示と最前面固定の基本と応用

VBA ユーザーフォームを常に表示する方法|自動表示と最前面固定の基本と応用

本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。

Excelのユーザーフォームを使って、入力補助やデータ確認をしている方も多いのではないでしょうか。
でも「毎回ボタンを押してフォームを開くのが面倒…」「他の作業をしているとフォームが後ろに隠れてしまう…」なんて思ったこと、ありませんか?

そんなときに便利なのが、ユーザーフォームを“常に表示”させる設定です。
ブックを開いた瞬間にフォームが自動で立ち上がったり、シート操作中でもフォームが前面に固定されたままになったりすると、作業がぐっと快適になります。

この記事では、

  • ブックを開いたときに自動でユーザーフォームを表示する方法

  • Excel操作中もフォームを常に最前面に表示しておく方法
    の2つを中心に、初心者でもすぐ試せるサンプルコード付きでわかりやすく紹介します。

「フォームをもっと便利に使いたい!」という方は、ぜひ最後まで読んでみてくださいね。

ユーザーフォームを自動で表示する方法

Excelでは通常、ボタンをクリックしてユーザーフォームを開くことが多いですよね。
でも、毎回その操作を行うのは少し面倒です。
特に他の人にも使ってもらうブックでは、開いた瞬間にフォームが自動で表示される仕組みにしておくと、とても便利です。

ここでは、VBAの「Workbook_Open」イベントを使って、Excelブックを開いたときにフォームを自動で表示する方法を紹介します。


Workbook_Openイベントを使ってフォームを起動する

まずは基本の手順です。
Excelを開いたときに自動でフォームを立ち上げるには、以下のコードを「ThisWorkbook」モジュールに記述します。

Private Sub Workbook_Open()
    UserForm1.Show
End Sub

手順は次の通りです。

  1. Alt + F11 キーでVBA画面(VBE)を開く

  2. 左側の「ThisWorkbook」をダブルクリック

  3. 上のコードを貼り付けて保存

  4. Excelブックを一度閉じて、再度開いてみる

ExcelのVBA画面でThisWorkbookにWorkbook_Openイベントを記述し、顧客情報入力フォームを自動表示させる例
「ThisWorkbook」にWorkbook_Openイベントを記述し、ブックを開いたときに自動でユーザーフォームを表示する設定例です。
ポイント:
コードは「ThisWorkbook」モジュールに記述します。標準モジュールやフォームに書いても自動では実行されないので注意しましょう。

これで、ブックを開いた瞬間にユーザーフォームが自動で表示されます。
特別なボタンを押す必要がないので、社内共有用のブックなどにもおすすめです。

フォームを「モードレス」で表示して操作を続ける

上記の方法でフォームを表示すると、デフォルトでは“モーダル表示”になります。
つまり、フォームを閉じないとシートを操作できない状態です。

もし「フォームを出したまま、セルの操作もしたい」という場合は、モードレス表示を使いましょう。
コードの最後に「vbModeless」を追加するだけでOKです。

Private Sub Workbook_Open()
    UserForm1.Show vbModeless
End Sub

この設定にすると、フォームを表示したままでもシート上の操作が可能になります。
入力支援ツールや確認用パネルのように、横に出しっぱなしで使いたいフォームにぴったりです。

ThisWorkbookにUserForm1.Show vbModelessを記述して、フォームを開いたままシート操作できるようにしたVBA設定例
vbModelessを指定すれば、フォームを表示したままシート上の操作が可能になります。

補足
「モーダル」と「モードレス」の違いをまとめると以下の通りです:

表示モード 特徴 操作の自由度
モーダル フォームを閉じるまで他の操作ができない 低い
モードレス フォームを開いたまま他の操作が可能 高い

フォームを閉じたあと再表示させたい場合

もし誤ってフォームを閉じてしまったときに、再表示したい場合は簡単な再表示ボタンを用意しておくと安心です。

たとえば、以下のようなマクロを標準モジュールに用意しておくと便利です。

Sub フォーム再表示()
    UserForm1.Show vbModeless
End Sub

このマクロをボタンやショートカットに割り当てておけば、いつでもフォームを再表示できます。
また、Application.OnTimeを使って定期的にフォームをチェックし、閉じられていたら再表示する…といった応用も可能です。

標準モジュールにフォーム再表示マクロを登録したVBA画面の例
フォームを閉じた後に再表示できるよう、標準モジュールにマクロを登録しておくと便利です。

マクロボタンについて詳しくは以下の記事をご参考ください。


ブックを非表示にしてフォームだけ表示する(応用)

もし「ユーザーにExcelシートを直接触ってほしくない」「フォームからのみ入力してほしい」という場合は、
ブックを非表示にしてフォームだけ表示する方法もあります。

以下のコードを「ThisWorkbook」に記述します。

Private Sub Workbook_Open()
  Application.Visible = False 'Excel本体を非表示にする
  UserForm1.Show
End Sub
ThisWorkbookにApplication.Visible = Falseを指定し、Excel本体を非表示にしてフォームのみ表示しているVBA設定例
Application.Visible = Falseを使えば、Excel本体を非表示にしてフォームだけを表示できます。

これで、Excelブックを開いた瞬間にフォームだけが表示された状態になります。
シートは見えないので、ユーザーはフォーム経由でのみ操作できます。

フォームを閉じた際にExcelを再表示するには、フォーム側に次のコードを追加します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Application.Visible = True 'Excelを再表示
End Sub
ユーザーフォームのコードにUserForm_QueryCloseイベントを記述し、フォームを閉じたときにExcelを再表示するVBA例
UserForm_QueryCloseイベントでApplication.Visible = Trueを指定すれば、フォームを閉じたあとにExcelを再表示できます。

これで、フォームを閉じると自動的にExcel画面が戻るようになります。
誤操作防止やレイアウト保護を目的とした社内ツールなどで重宝します。

注意ポイント
「Excel本体を非表示にする」コード(Application.Visible = False)を使うときは、
必ず**フォーム側にも再表示用のコード(Application.Visible = True)**をセットで記述しましょう。
片方だけだと、Excel画面が見えなくなったまま戻せなくなる場合があります。

また、この設定を行うと他のExcelブックも同時に非表示になります。
複数のファイルを並行して使う場合には、この方法は避けたほうが良いでしょう。

ここまでで、「ブックを開いたときに自動でユーザーフォームを表示する」方法と、
さらに一歩進んだ「フォームのみ表示」までを学べました。
次の章では、フォームを常に最前面に固定して、他のウィンドウに隠れないようにする方法を紹介します。

フォームを常に最前面に表示する方法(応用)

ここまでで、Excelを開いたときにユーザーフォームを自動で表示する方法を紹介しました。
ただし、フォームを表示したまま別のウィンドウを操作していると、フォームが他の画面の裏に隠れてしまうことがあります。

そんなときに役立つのが、「フォームを常に最前面に固定する」設定です。
たとえば、作業手順や入力項目を確認しながら作業する場面でとても便利です。


Windows APIを使って最前面に固定する

Excel VBAだけでは「ウィンドウを最前面に固定する」機能は用意されていません。
そこで、Windowsの仕組みを利用してフォームを常に前面に表示させる方法を紹介します。

これを実現するのが、**Windows API(SetWindowPos関数)**です。

以下のコードを使うと、ユーザーフォームを他のウィンドウよりも常に最前面に固定できます。


標準モジュール(Module1)に記述

Option Explicit

#If VBA7 Then
 Public Declare PtrSafe Function SetWindowPos Lib "user32" ( _
  ByVal hWnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
  ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
  ByVal cy As Long, ByVal uFlags As Long) As Long

Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
 ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
#Else
 Public Declare Function SetWindowPos Lib "user32" ( _
  ByVal hWnd As Long, ByVal hWndInsertAfter As Long, _
  ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _
  ByVal cy As Long, ByVal uFlags As Long) As Long

 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
  ByVal lpClassName As String, ByVal lpWindowName As String) As Long
#End If

 Public Const HWND_TOPMOST As Long = -1
 Public Const SWP_NOSIZE As Long = &H1
 Public Const SWP_NOMOVE As Long = &H2
 Public Const SWP_SHOWWINDOW As Long = &H40
VBAの標準モジュール(Module1)にWindows APIの宣言を記述している画面
API宣言部は標準モジュール(Module1)に記述します。これで他のフォームから呼び出せるようになります。

この宣言部は、**「標準モジュール(Module1)」**に記述します。
これで、他のフォームやモジュールからAPI関数を呼び出せるようになります。


ユーザーフォームのコードに記述

次に、常に表示させたいユーザーフォームに以下のコードを記述します。

Option Explicit

Private Sub UserForm_Activate()
 Dim h As LongPtr
 ' 少し待機を入れて、他ウィンドウの前面化を防ぐ
 DoEvents
 Application.Wait (Now + TimeValue("0:00:01"))

 ' UserForm のウィンドウハンドルを取得
 h = FindWindow("ThunderDFrame", Me.Caption)
 If h = 0 Then h = FindWindow("ThunderXFrame", Me.Caption)

 If h <> 0 Then
  SetWindowPos h, HWND_TOPMOST, 0, 0, 0, 0, _
  SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW
 End If
End Sub
VBAのユーザーフォームに最前面固定用コードを記述している画面
ユーザーフォームのコードに「UserForm_Activate」イベントを追加して、最前面に固定します。

これで、フォームが他のウィンドウの後ろに隠れることなく、
常に最前面に表示されるようになります。

Excel上での操作中や他のアプリを開いたときも、フォームを見失うことがありません。

Google Chromeの上に常に表示されているVBAユーザーフォームの例
他のアプリを開いても、ユーザーフォームが最前面に固定されて表示されます。

ポイント

環境によっては、起動直後に他のウィンドウが一瞬前面に出ることがあります。
その場合は、フォームの表示前に DoEvents を挟むことで安定します。

サンプルコードでは、以下の5~7行目が該当します。

' 少し待機を入れて、他ウィンドウの前面化を防ぐ
DoEvents
Application.Wait (Now + TimeValue("0:00:01"))

実行結果と使い方のコツ

この設定を行うと、たとえば以下のような使い方ができます。

  • 入力補助フォームを常に画面右側に表示しながら作業

  • 作業指示やチェックリストを常に見える位置に固定

  • 作業マニュアル風にメッセージを出しておく

見た目の印象としては、「Excelの上に小さな常駐ウィンドウが浮いているような状態」になります。
フォームの位置やサイズを整えると、作業画面を邪魔せず使いやすくできます。


最前面固定の注意点

便利な機能ですが、使い方には少し注意が必要です。

  • 他のアプリ操作時にも前面に残るため、人によっては作業の邪魔になることがあります。

  • WindowsのバージョンやExcelの32bit/64bit環境によっては、動作に差が出ることもあります。

  • チーム共有のブックでは、環境の違いによるトラブルを避けるために、最前面固定を使わずvbModelessで十分な場合もあります。

そのため、実際に利用する環境で動作確認を行い、必要に応じて調整するようにしましょう。


まとめ:用途に応じて使い分けよう

ユーザーフォームを常に表示させたい場合、目的に合わせて次のように使い分けるのがおすすめです。

目的 方法 特徴
Excelを開いた瞬間にフォームを表示 Workbook_Openイベント 自動表示に便利
シートを操作しながらフォームを出しておく UserForm1.Show vbModeless 通常作業と併用可能
他の画面に隠れず常に前面表示したい Windows API(SetWindowPos) 高度な設定・注意が必要

まずは「自動表示+モードレス」で試してみて、
必要に応じて「最前面固定(API)」を追加する流れがおすすめです。

【関連記事】

※外部リンク※

※参考書籍 (PR)

※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プライバシーポリシー へ。