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を最小化するコード
'フォームを開く
Private Sub UserForm_Initialize()
Application.WindowState = xlMinimized 'Excel最小化しておく
End Sub
・1行で済みますので簡単ですね。
・でも、最小化していて UserForm はモダールでも、タスクバーをクリックするとExcelが表示されてしまいます。(モダールなので操作はできませんが)
・この動作を我慢で、安全策を優先するならこの方法が良いと思います。
UserForm の後ろに隠しておく方法
・では、Excelを UserForm の後ろに隠しておく方法を検証してみます。
・UserForm の後ろに隠す考え方は次のとおりです。
- 始めに Excel の表示設定を保存しておきます。
- UserForm から取得した位置とサイズを取得します。
- Excel に取得した位置とサイズを UserForm に隠れるように調整して適用します。
- UserForm の位置を動かした場合でも後ろに隠れて追従するようにする。
- 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
・調整するのは、位置だけなので Top と Left だけで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 非表示がかっこいいと思ったけど、アイコンも表示されないしリスクを考えると迷いますね(^^; うまく隠すせればその方がいいみたいですね(^^)
★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★
今後の記事について
今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考えてVBAを使う」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m
【検討中の今後の記事内容は・・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思います・・・・・
・今後の記事にもご期待ください(^^)/
記事のサンプルファイルをダウンロードできます
今回の記事のサンプルをダウンロードできるようリンク先に登録しています!
過去の記事で使用したサンプルファイルがダウンロードできるページを設置しています
こちら(このリンク先)からご利用ください
【今回わかったことは】
・Excel を非表示にして UserForm だけで表示する方法と注意点わかりました
・Excel 最小化ではタスクバークリックで表示されてしまうことがわかりました
・Excel を UserForm の後ろに隠してドラッグしても追従する方法がわかりました