表示しているフォームを一度に閉じる
                                                        玄関へお回り下さい。
閉じる又は×をクリックしたら開いているフォームをすべて閉じる   (029)
     使用例

次のサブルーチンを標準モジュールに作成する
Public Sub sAllEnd()
   
Dim myObject As Object
   
For Each myObject In Forms
        Unload myObject
       
Set myObject = Nothing
   
Next
End Sub

各フォームの Unload イベント からサブルーチンを呼ぶ
Private Sub Form_Unload(Cancel As Integer)
   
Call sAllEnd
    Unload Me
End Sub

又はForm1だけに書く
Private Sub Form_Unload(Cancel As Integer)
   
Dim myObject As Object
   
For Each myObject In Forms
        Unload myObject
       
Set myObject = Nothing
   
Next
    Unload Me
End Sub

     マイクロソフト推奨のやり方(FAQ集より)     (029)

Private Sub Form_Unload(Cancel As Integer)
   
Dim i As Integer
   
While Forms.Count > 1 '自分以外のフォームを探します
        i = 2
   
While Forms(i) Is Me
        i = i + 1
   
Wend
        Unload Forms(i)
   
Wend
   
'自分自身もアンロードし、アプリケーションは終了します
    Unload Me
   
'End  消しておく(使用しない方が良い)
End Sub

        ゆう(U)さんに投稿頂いた分             (029)

'==========================================================
'全てのフォームを解放する sFormAllUnload
'==========================================================
' Call sFormAllUnload
' 引数 なし
'----------------------------------------------------------
'MDI親・子フォームのUnload順を考慮しています。
'しかしSDIフォームの親子は考慮していないので、その辺は
'不安ですが・・・(frmXXX.Show vbModeless, Me などの場合
'親が消されるとUnloadMode=5で子もUnloadされます)
'(Forms.Count - 1 To 0)でUnloadの方が良いかも?
'----------------------------------------------------------

Public Sub sFormAllUnload()
   
Dim myForm As Form
   
' フォームの解放
   
For Each myForm In Forms
       
If Not (TypeOf myForm Is MDIForm) Then
            Unload myForm
       
End If
   
Next myForm
   
' MDIフォームの解放(MDI親フォーム以外はないはず)
   
For Each myForm In Forms
        Unload myForm
   
Next myForm
End Sub
一部使い方が間違っておりました。    99.02.20 訂正

上記のような終了処理は、Command ボタン等に記述しておりましたが、フォームの Unload イベントに記述し、メニュー等の終了には Unload Me と記述して下さい

又、私もそうでしたが、マイクロソフトや書籍の多くに終了に End ステートメントを使用していますが、End を書くとそれ以降の処理を一切しなくなりUnload としても Unload イベントなども動作しなくなり、ファイルクローズやメモリ解放が正常に行われ るかは疑問です・・・単体のEXEでは問題はあまり見えないでしょうが今後を考えると End は使用しない方が良いと思います。
と ゆう(U)さんに教えて頂きました。

私のように旧のBasicからVisual Basicに移行したものは特に注意したい記述かと思います。

終了イベント発生順序は次のようになっています。

1.QueryUnload このイベントは終了の原因が取得できます。そこでUnloadするかCancel
  するかを記述するような時に使用します。
2.Unload 通常の終了処理を記入します。
3.Terminate Unload イベントの後に発生しますが!!!!Help参照




02/01/01