Excel VBA UserForm表示中のブック表示設定を検証

UserForm を表示する際にExcelブックを表示したままにするか、非表示にしてしまうほうがいいのかなどを検証してみます。

くるみこ
くるみこ

今回は「UserForm」の表示方法や位置の設定ではなくて、表示元のExcelブック自体の表示について検証してみましょう! いろいろなケースで検証してみたいと思います(^^)/

Excelのシートを表示しないで単独で UserForm だけを表示する感じは、すごくかっこいいですよね! よろしくお願いしますm(__)m

【この記事でわかること
UserForm表示中Excelを非表示に(UserFormだけで表示)する方法がわかります
・Excelを UserForm の後ろに隠してドラッグしても追従する方法がわかります

関連記事のおさらいは、下のカードをクリックすれば開きます(^^ゞ

くるみこ
くるみこ

前回、前々回の記事で UserForm の表示方法について紹介しています。この記事と関連しているので是非あわせて覗いてみてね(^^)/

Excelブックの表示・非表示について比較検証する

UserForm を表示している間、Excelブックの表示・非表示はどうするのかを比較検証していきたいと思います。

Excelブックの表示・非表示を設定する

・Excelブックを表示するか表示しないかの設定は次のとおりです。
UserForm を開く時に「非表示」にして、閉じるときに「表示」に戻す設定です。

Excelを非表示にする/表示するコード

'フォームを開く
Private Sub UserForm_Initialize()
  Application.Visible = False 'Excelを非表示にする
End Sub
'フォームを閉じる
Private Sub UserForm_Terminate() 'またはQueryCloseでもOK
  Application.Visible = True  'Excelを表示する
End Sub

・ApplicationオブジェクトのVisibleプロパティにFalseを設定するとExcelが非表示になります。
・Excelを再び表示させるには True を設定します。
UserForm を閉じる前に必ず非表示を解除することを忘れないようにしましょう!
・WindowsコレクションのVisibleプロパティではBookは非表示になりますがExcel本体は非表示になりません。

Excelを非表示にした場合の問題点など

False で非表示となっている場合、Excelはタスクバーからも非表示にされてしまいます。
ですが、Excelは非表示でもVBAからは操作できます。

【非表示にする場合の注意点】
・処理途中に何らかのエラーが発生して停止してしまった場合、タスクバーにも表示されていないので消えてしまったように見えて以降の操作が不能になります。
・Excelが終了しているかをタスクマネージャーを確認してみると、アプリには「Excel」が表示されています。Excelはまだ終了していません!
・終わらせるためには「プロセスの終了」を行なう必要があります。
・インスタンスが残ったままの場合、予期しないトラブル発生の原因になります。

・以上のような非表示の問題点が存在する限り、安易に使用するのは危険です。

非表示ではなく最小化が安全です

・画面にシートを表示したくない場合は、最小化が安全です。(タスクバーには表示されます)

Excelを最小化するコード

'フォームを開く
Private Sub UserForm_Initialize()
  Application.WindowState = xlMinimized 'Excel最小化しておく
End Sub

・1行で済みますので簡単ですね。
・でも、最小化していて UserForm はモダールでも、タスクバーをクリックするとExcelが表示されてしまいます。(モダールなので操作はできませんが)
・この動作を我慢で、安全策を優先するならこの方法が良いと思います。

UserForm の後ろに隠しておく方法

・では、Excelを UserForm の後ろに隠しておく方法を検証してみます。
UserForm の後ろに隠す考え方は次のとおりです。

  1. 始めに Excel の表示設定を保存しておきます。
  2. UserForm から取得した位置とサイズを取得します。
  3. Excel に取得した位置とサイズを UserForm に隠れるように調整して適用します。
  4. UserForm の位置を動かした場合でも後ろに隠れて追従するようにする。
  5. UserForm 終了時には、最初に取得していた位置とサイズを Excel に適用します。

Excel の表示設定を保存するための変数を用意します

UserForm の General 部に変数を Single で用意しておきます。

Option Explicit
'最初のExcelウィンドウ設定を保存
Private xlTop As Single     '上位置
Private xlLeft As Single    '左端位置
Private xlWidth As Single   '幅
Private xlHeight As Single  '高さ

UserForm_Initializeイベントのコード

UserForm 起動時に ExcelのWindow設定を用意しておいた変数に代入保存します。

'セルから位置設定取得
Private Sub UserForm_Initialize()
    With Application
        .WindowState = xlNormal
        'Excelのウィンドウ状態を変数に代入
        xlTop = .Top
        xlLeft = .Left
        xlWidth = .Width
        xlHeight = .Height
    End With
End Sub

UserForm_Activateイベントのコード

UserForm_Initializeイベントでも良いのですが、UserForm_Activateイベントを使います。
・ただし、モードレスで表示する場合は注意が必要です!(この点は最後に説明します)
・ここで UserForm の後ろに隠れるように Excel の位置を調整します。

'UserFormの後ろに隠れるようにExcelのサイズと位置を調整
Private Sub UserForm_Activate()
    With Application
        '環境で変わるので増減数は調整が必要
        .Top = Me.Top + Me.Height / 2   '高さの半分をプラス
        .Left = Me.Left + Me.Width / 2  '幅の半分をプラス
        .Width = Me.Width / 5           '幅の5分の1に
        .Height = Me.Height / 5         '高さの5分の1に
    End With
End Sub

ポイントは、サイズを UserForm のギリギリに設定する必要は無いということです。
どの位置にドラッグしてもはみ出ることのないように思い切り小さくした方が良いでしょう
どうせ隠れて見えないのですから(^^;

UserForm_Layoutイベントを使います

UserForm_Layoutは、フォームに配置されたコントロールが移動したとき発生するイベントです。
UserForm 自体をドラッグした場合にも発生しますのでこれを使って Excel の位置を同期させるようにします。

'Excelの位置をドラッグ時にも同期させる
Private Sub UserForm_Layout()
    With Application
        If .WindowState <> xlNormal Then Exit Sub
        .Top = Me.Top + Me.Height / 2   '高さの半分をプラス
        .Left = Me.Left + Me.Width / 2  '幅の半分をプラス
    End With
End Sub

・調整するのは、位置だけなので TopLeft だけでOKです。
Activate で設定した値と同じにします。

UserForm_QueryCloseイベントのコード

・閉じる際に、ExcelのWindow設定を最初に保存しておいた変数値を適用して元に戻します。

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    '元のExcelウィンドウ状態に戻す
    With Application
        .Top = xlTop
        .Left = xlLeft
        .Width = xlWidth
        .Height = xlHeight
    End With
End Sub

モードレスではActivateイベントが発生しない場合があります

モードレスで開いた後にメッセージボックスを表示すると Activateイベントが発生しません!
・次のサンプルを実行してみるとわかります。

'Userform起動(モードを変えて2回表示する)
Sub sample01()
    MsgBox "UserForm1をモダールで開きます!"
    UserForm1.Show vbModal
    'MsgBox "今度は UserForm1をモードレスで開きます!"
    UserForm1.Show vbModeless
    MsgBox "UserForm1をモードレスで開きました!"
End Sub

Excel が後ろに隠れません。ドラッグすると Excel が追従します。
・一番最後のメッセージボックスのコードを消すかコメントアウトしてから実行すると Activateイベントがちゃんと発生します!
Excel を後ろに隠してしまうのですからモードレスにする必要はないと思います。
・もしくは、Activateイベントではなく Initializeイベントを使う設定に変更すればOKですね(^^;

UserForm 表示中の Excelの表示設定を指定する方法は以上で終了します。

スポンサーリンク

まとめ(おわりに)

・いかがでしたでしょうか?
・記事内で使用したコードのサンプルファイルを登録していますのでご利用ください。
Excel の後ろに隠す方法の部分に絞って登録しています(^^;
登録しているサンプルは前回記事のものに追加して流用しています。ご了承ください!
今までの記事のサンプルも登録していますのでよろしければお使いください(^^)

まとめと感想など

くるみこ
くるみこ

UserForm 表示中の Excel 表示設定について勉強しました。非表示にしてしまうと問題がありそうなので、後ろに隠す方法がいいのかなぁ(^^ゞ 好みの問題ですね!

Excel 非表示がかっこいいと思ったけど、アイコンも表示されないしリスクを考えると迷いますね(^^; うまく隠すせればその方がいいみたいですね(^^)

【今回わかったことは】
Excelを非表示にして UserFormだけで表示する方法と注意点わかりました
Excel最小化ではタスクバークリックで表示されてしまうことがわかりました
ExcelUserFormの後ろに隠してドラッグしても追従する方法がわかりました

★★★ ランキング参加中! クリックしてね(^^)/ ★★★

今後の記事について

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/

記事のサンプルファイルをダウンロードできます

今回の記事のサンプルをダウンロードできるようにしています!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください