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

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

Option Explicit

Private Sub UserForm_Initialize()
    Application.Visible = False
End Sub

Private Sub UserForm_Terminate()
    Application.Visible = True
End Sub
これだけのコード(ユーザーフォームのコードです)で実現できます。
但し、実行時エラーなどでマクロが終了してしまうと問題です。
ユーザーフォームにボタンを1つ貼り付けて、下記のようなコードを書いてみます。

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

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

'*******************************************************************************
'   ユーザーフォームの表示でExcelウィンドウを隠す
'
'   作成者:井上治  URL:http://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'*******************************************************************************
Option Explicit
Private sngTop As Single
Private sngLeft As Single
Private sngWidth As Single
Private sngHeight As Single

' ボタンのクリックイベント
Private Sub CommandButton1_Click()
    ' フォームを消去
    Unload Me
End Sub

' フォームの表示イベント
Private Sub UserForm_Activate()
    ' フォームの後ろにExcelウィンドウを隠す
    With g_xlAPP
        .Top = Me.Top + 1
        .Left = Me.Left + 1
        .Width = Me.Width - 2
        .Height = Me.Height - 2
    End With
End Sub

' フォームの初期化イベント
Private Sub UserForm_Initialize()
    ' 現在のExcelウィンドウ状態を保管
    With g_xlAPP
        .WindowState = xlNormal
        sngTop = .Top
        sngLeft = .Left
        sngWidth = .Width
        sngHeight = .Height
    End With
End Sub

' フォームのレイアウトイベント(ドラッグ時にも発生)
Private Sub UserForm_Layout()
    ' Excelウィンドウ位置を同期させる
    With g_xlAPP
        If .WindowState = xlNormal Then
            .Top = Me.Top + 1
            .Left = Me.Left + 1
        End If
    End With
End Sub

' フォームの消失イベント
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ' 保管情報を元にExcelウィンドウを元に戻す
    With g_xlAPP
        .Top = sngTop
        .Left = sngLeft
        .Width = sngWidth
        .Height = sngHeight
    End With
End Sub

'--------------------------------<< End of Source >>----------------------------

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

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

Option Explicit
Public g_xlAPP As Application
Private lngWindowState As Long

Sub TEST()
Set g_xlAPP = Application
lngWindowState = g_xlAPP.WindowState
UserForm1.Show
g_xlAPP.WindowState = lngWindowState
End Sub
ウィンドウ状態の保管、復旧をユーザーフォームの表示の前後に配置すれば問題なく動作します。また、サンプルには「最小化」させるものも追加してあります。 ここでは最後にExcelウィンドウを元に戻していますが、場合によってはそのまま終了させるなどの方が良いかも知れません。
サンプルブックは上の画像のところをクリックすると自動解凍圧縮ファイルがダウンロードできるので試してみて下さい。
例えば「最小化」のサンプルであれば、ユーザーフォームの表示中にタスクバーのExcelアイコンをクリックするとExcelウィンドウを元に戻ってしまうなど、 問題がないわけではありません。
そんな苦労するより、最初からVBで作れば... 目的がユーザーフォームだけのアプリケーションであるのなら、つまりワークシートを使わないアプリケーションなのであれば、なぜExcelを使うのでしょうか。 まあ、今でこそこんなことを書いていますが、その昔(このサイトを始めるより前)は私自身もExcelを使って、ほぼ「何でもできる」ものだから まるで「VBランタイム」のようにも利用していたこともありました。
ですが、フォーム(ユーザーフォーム)だけのアプリケーションを作るのであれば、こんな簡易的機能しかないOfficeのユーザーフォームより 本来の開発言語であるVisualBasic(.NET)での「Windowsフォーム」で作成した方が、 このような制御であったり、以前のページのような「閉じるボタン」を消してしまうとかもプロパティだけで設定できます。 さらにコントロールも多彩に揃っている上、配置を揃えるのも簡単です。
コードの記述癖が若干違う問題があるので、それをいやがるのか避けているのか解りませんが、トライした方が良いと思います。 また、VisualBasic(.NET)側からExcelワークブック、ワークシートを操作する件についても 本サイトにサンプルがあるので試してみて下さい。
Excel2013以降のバージョンではSDIになったため、ユーザーフォームを表示させるとそのユーザーフォームが所属するワークブックと他に開いたワークブックの表示順位が変えられないという問題もあるので、 このことはVisualBasic(.NET)に不慣れだとかでは片付けられない問題になってきています。