フォームを表示したらExcelのウィンドウを消去

ユーザーフォームを使った仕組みを考える上で、Excel環境を意識させたくない場合があるでしょう。
VisualBasicで作成したかのようにExcelを意識させないようにします。 別にワークシートを利用しないような仕組みをマクロで作成することもありますが、中にはVisual Basicなどの開発言語で作成したかのように Excelで動いていることを意識させたくない場合もあるかもしれません。まあ、そのようなことがあるかどうかは判りませんが、そんなつもりでイタズラ半分で見て下さい。
でも、結局は最後に書いたように、このようなケースは開発言語であるVisual Basicでフォームを作成して処理する方が自然であり、 他ブックを操作する場合のExcel2013以降のバージョンのSDIであるがための問題にも遭遇しないで済むと思います。



Excelのウィンドウを消してしまう。
最も簡単な方法は、Excelのウィンドウを消してしまうことでしょう。

'***************************************************************************************************
'   フォームを表示したらExcelを消す                                 UserForm1(Class)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'05/07/27(1.00)新規作成
'07/10/07(1.01)初回修正
'20/02/25(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit

'***************************************************************************************************
'   ■■■ フォームイベント ■■■
'***************************************************************************************************
'* 処理名 :UserForm_Initialize
'* 機能  :フォーム初期化
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Initialize()
    '-----------------------------------------------------------------------------------------------
    ' Excelウィンドウを非表示にする
    Application.Visible = False
End Sub

'***************************************************************************************************
'* 処理名 :UserForm_Terminate
'* 機能  :フォーム終了
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Terminate()
    '-----------------------------------------------------------------------------------------------
    ' Excelウィンドウを表示する
    Application.Visible = True
End Sub
これだけのコード(ユーザーフォームのコードです)で実現できます。
但し、実行時エラーなどでマクロが終了してしまうと問題です。
ユーザーフォームにボタンを1つ貼り付けて、下記のようなコードを書いてみます。

'***************************************************************************************************
'   ■■■ コントロールイベント ■■■
'***************************************************************************************************
'* 処理名 :CommandButton1_Click
'* 機能  :ボタンクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_Click()
    '-----------------------------------------------------------------------------------------------
    Dim objSh As Worksheet                                          ' Worksheet
    Set objSh = Worksheets("HOGE")
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
ダウンロードした中の「フォームを表示したらExcelを消す.xlsm」を起動してみて下さい。
これを起動して、ボタンをクリックすると、
実行時エラー「インデックスが有効範囲にありません。」
(この画像をクリックすると、サンプルのExcelブックがダウンロードできます)
となってしまいます。「HOGE」などというシートはないので当然ですが。
ここで「終了」をクリックすると、全て終わってしまいExcelはタスクバーにも見あたりません。
ですが、タスクマネージャを見てみると、
タスクマネージャに「EXCEL.EXE」がある!
このようにExcel自身が終わってはいないことを示しています。終わらせるためにはこの状態で「プロセスの終了」を行なう必要があります。
記述は簡単でしたが、エラー処置などをきちんと行なっていないとこのようなトラブルの元になる危険性があるので注意して下さい。
正常に動作するサンプルは「フォームを表示したらExcelを消す②.xlsm」です。

では、もう少し「安全」な方法はないでしょうか。
前の章で、2つのユーザーフォームの排他表示を行なうのに一方のフォームを裏に隠す方法をご紹介しましたが、この方法を利用して見ましょう。

'***************************************************************************************************
'   フォーム表示でExcelWindowを隠す                                 UserForm1(Class)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'05/07/27(1.00)新規作成
'07/10/07(1.01)初回修正
'20/02/25(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit
'===================================================================================================
' Excelウィンドウ状態退避用
Private g_sngTopSV As Single                                    ' 上端位置
Private g_sngLeftSV As Single                                   ' 左端位置
Private g_sngWidthSV As Single                                  ' 幅
Private g_sngHeightSV As Single                                 ' 高さ

'***************************************************************************************************
'   ■■■ フォームイベント ■■■
'***************************************************************************************************
'* 処理名 :UserForm_Activate
'* 機能  :フォームの表示イベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Activate()
    '-----------------------------------------------------------------------------------------------
    ' フォームの後ろにExcelウィンドウを隠す
    With Application
        .Top = Me.Top + 1
        .Left = Me.Left + 1
        .Width = Me.Width - 2
        .Height = Me.Height - 2
    End With
End Sub

'***************************************************************************************************
'* 処理名 :UserForm_Initialize
'* 機能  :フォームの初期化イベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Initialize()
    '-----------------------------------------------------------------------------------------------
    ' 現在のExcelウィンドウ状態を保管
    With Application
        .WindowState = xlNormal
        g_sngTopSV = .Top
        g_sngLeftSV = .Left
        g_sngWidthSV = .Width
        g_sngHeightSV = .Height
    End With
End Sub

'***************************************************************************************************
'* 処理名 :UserForm_Layout
'* 機能  :フォームのレイアウトイベント(ドラッグ時にも発生)
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_Layout()
    '-----------------------------------------------------------------------------------------------
    ' Excelウィンドウ位置を同期させる
    With Application
        If .WindowState = xlNormal Then
            .Top = Me.Top + 1
            .Left = Me.Left + 1
        End If
    End With
End Sub

'***************************************************************************************************
'* 処理名 :UserForm_QueryClose
'* 機能  :フォームの消失イベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(既定)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    '-----------------------------------------------------------------------------------------------
    ' 保管情報を元にExcelウィンドウを元に戻す
    With Application
        .Top = g_sngTopSV
        .Left = g_sngLeftSV
        .Width = g_sngWidthSV
        .Height = g_sngHeightSV
    End With
End Sub

'***************************************************************************************************
'   ■■■ コントロールイベント ■■■
'***************************************************************************************************
'* 処理名 :CommandButton1_Click
'* 機能  :ボタンクリックイベント
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Private Sub CommandButton1_Click()
    '-----------------------------------------------------------------------------------------------
    ' フォームを消去
    Unload Me
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
少々、面倒なコードになってしまいましたが、Excelウィンドウの位置やサイズをいじってしまうので、ユーザーフォームが閉じられる時に Excelウィンドウの位置やサイズを元に戻そうとしているわけです。 WindowStateも元に戻すように記述しているのですが「最大化」には戻ってくれませんでした。ですが「最大化」前のウィンドウ状態には復帰します。
この方法なら実行時エラーになっても、ユーザーフォームの後ろに隠した状態でExcelウィンドウはそのまま残りますからタスクマネージャのお世話にはならずに済みます。
このサンプルは「フォーム表示でExcelWindowを隠す.xlsm」です。

サンプルでは、上記の問題を少し改善してあります。
結局のところ、ユーザーフォームからExcelのウィンドウ状態を元に戻すのは、エラーのはならないものの不成功のようです。
ですが、このようにして、

'***************************************************************************************************
'   フォーム表示でExcelWindowを隠す                                 Module1(Module)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
'変更日付 Rev  変更履歴内容------------------------------------------------------------------------>
'05/07/27(1.00)新規作成
'07/10/07(1.01)初回修正
'20/02/25(1.10)*.xlsm化、他
'***************************************************************************************************
Option Explicit
'===================================================================================================
Private g_lngWindowState As XlWindowState                       ' ウィンドウ状態

'***************************************************************************************************
'   ■■■ ワークシート側からの呼び出し処理 ■■■
'***************************************************************************************************
'* 処理名 :TEST
'* 機能  :ユーザーフォームの起動
'---------------------------------------------------------------------------------------------------
'* 返り値 :(なし)
'* 引数  :(なし)
'---------------------------------------------------------------------------------------------------
'* 作成日 :2005年07月27日
'* 作成者 :井上 治
'* 更新日 :2020年02月25日
'* 更新者 :井上 治
'* 機能説明:
'* 注意事項:
'***************************************************************************************************
Sub TEST()
    '-----------------------------------------------------------------------------------------------
    ' WindowStateを退避
    g_lngWindowState = Application.WindowState
    ' ユーザーフォームの起動
    UserForm1.Show
    ' WindowStateを復旧
    Application.WindowState = g_lngWindowState
End Sub

'----------------------------------------<< End of Source >>----------------------------------------
ウィンドウ状態の保管、復旧をユーザーフォームの表示の前後に配置すれば問題なく動作します。また、サンプルには「最小化」させるものも追加してあります。 ここでは最後にExcelウィンドウを元に戻していますが、場合によってはそのまま終了させるなどの方が良いかも知れません。
サンプルブックは上の画像のところをクリックすると自動解凍圧縮ファイルがダウンロードできるので試してみて下さい。
例えば「最小化」のサンプルであれば、ユーザーフォームの表示中にタスクバーのExcelアイコンをクリックするとExcelウィンドウを元に戻ってしまうなど、 問題がないわけではありません。

そんな苦労するより、最初からVBで作れば... 目的がユーザーフォームだけのアプリケーションであるのなら、つまりワークシートを使わないアプリケーションなのであれば、なぜExcelを使うのでしょうか。 まあ、今でこそこんなことを書いていますが、その昔(このサイトを始めるより前)は私自身もExcelを使って、ほぼ「何でもできる」ものだから まるで「VBランタイム」のようにも利用していたこともありました。
ですが、フォーム(ユーザーフォーム)だけのアプリケーションを作るのであれば、こんな簡易的機能しかないOfficeのユーザーフォームより 本来の開発言語であるVisualBasic(.NET)での「Windowsフォーム」で作成した方が、 このような制御であったり、以前のページのような「閉じるボタン」を消してしまうとかもプロパティだけで設定できます。 さらにコントロールも多彩に揃っている上、配置を揃えるのも簡単です。
コードの記述癖が若干違う問題があるので、それをいやがるのか避けているのか解りませんが、トライした方が良いと思います。 また、VisualBasic(.NET)側からExcelワークブック、ワークシートを操作する件についても 当サイトにサンプルがあるので試してみて下さい。
Excel2013以降のバージョンではSDIになったため、ユーザーフォームを表示させるとそのユーザーフォームが所属するワークブックと他に開いたワークブックの表示順位が変えられないという問題もあるので、 このことはVisualBasic(.NET)に不慣れだとかでは片付けられない問題になってきています。