- ベストアンサー
Accessのフォームを閉じる際の制御について
- Accessのフォームを開く際に、別のフォームを閉じるための制御方法について質問です。
- 現在、AというフォームからBというフォームを開く際、AフォームのVisibleをFalseにし、Bのフォームを閉じる際、AというフォームのVisibleをTrueにする方法を使っています。
- しかし、Bフォームを開いた状態でAccessの右上の×ボタンをクリックするとエラーが出るようになりました。AフォームのVisibleをTrueにする際に、Aフォームがすでに閉じている場合にエラーが発生しているようです。どのように対処すれば良いか教えていただきたいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
OfficeのSamplesにあるNorthWindowのユーティリティ関数 のIsLoaded関数を使用します。 標準モジュールに以下の関数を貼り付け保存します。 Function funcIsLoaded(ByVal strFormName As String) As Boolean Const conObjStateClosed = 0 Const conDesignView = 0 If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then If Forms(strFormName).CurrentView <> conDesignView Then funcIsLoaded = True End If End If End Function Bを閉じるときのイベントを以下のように 設定します。 Private Sub Form_Close() If funcIsLoaded("A") = True Then Forms!A.Visible = True End If End Sub
その他の回答 (1)
- DexMachina
- ベストアンサー率73% (1287/1744)
現在、『A』フォームのVisibleをTrueにする処理を行っているイベントで、 他に、別フォームを参照した処理を行っていないようなら、エラー処理で 「'○○' フォームが見つかりません」エラーだけを無視するようにしまうのが 最も簡単かと思います。 但し、この方法を採ると、それ以外のエラーが発生した場合に、今まで エラー発生時に表示されていた、『終了/デバッグ/ヘルプ』の選択肢 つきのメッセージボックスは表示されなくなるので注意してください(汗) (下記コードの「On Error Goto エラー処理」の先頭に「'」をつけて 無効化した後に再度同じ処理を行えば、上記メッセージボックスは 再び表示されるので、必要に応じて「'」を追加/消去して切替) ※下記サンプルでは、その代わりにMsgBoxでエラー内容を表示させています。 (ボタンは「OK」のみ) 【現状】 'Closeイベントでの処理を想定 Private Sub Form_Close() Forms!A.Visible = True End Sub 【修正】 Private Sub Form_Close() 'エラー発生時に「エラー処理:」の行まで飛ばすための宣言 On Error Goto エラー処理 Forms!A.Visible = True 終了処理: 'エラー未発生時に「エラー処理」が行われるのを回避 Exit Sub エラー処理: If Err.Number = 2450 Then '「実行時エラー '2450'」は無視して処理を継続 Resume Next '即座に中断したい場合は以下を有効にして下さい 'Resume 終了処理 Else '上記以外のエラー発生時は、MsgBoxで内容を表示 '(『終了/デバッグ/ヘルプ』の選択肢つきMsgBoxの代わり) MsgBox Err.Number & ":" & Err.Description, vbCritical, Me.Name & " Close" Resume 終了処理 End If End Sub ・・・以上です。 1つのFunctionやSubの中で複雑な処理をやっている場合はお勧めできませんが、 そうでない場合は、覚えておくと他のエラーにも応用できますので、参考まで。
お礼
ご回答ありがとうございます。 ご教示いただいたソースで意図した動作となりました。 【フォーム:A】 Option Compare Database Option Explicit Private Sub command_form_open_b_Click() On Error GoTo Err_command_form_open_b_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "B" DoCmd.OpenForm stDocName, , , stLinkCriteria Me.Visible = False Exit_command_form_open_b_Click: Exit Sub Err_command_form_open_b_Click: MsgBox Err.Description Resume Exit_command_form_open_b_Click End Sub 【フォーム:B】 Option Compare Database Option Explicit Private Sub Form_Close() 'エラー発生時に「エラー処理:」の行まで飛ばすための宣言 On Error GoTo エラー処理 Forms!A.Visible = True 終了処理: 'エラー未発生時に「エラー処理」が行われるのを回避 Exit Sub エラー処理: If Err.Number = 2450 Then '「実行時エラー '2450'」は無視して処理を継続 Resume Next '即座に中断したい場合は以下を有効にして下さい 'Resume 終了処理 Else '上記以外のエラー発生時は、MsgBoxで内容を表示 '(『終了/デバッグ/ヘルプ』の選択肢つきMsgBoxの代わり) MsgBox Err.Number & ":" & Err.Description, vbCritical, Me.Name & " Close" Resume 終了処理 End If End Sub このたびはどうもありがとうございました。 以上、よろしくお願いします。
お礼
ご回答ありがとうございます。 ご教示いただいたソースで意図した動作となりました。 【フォーム:A】 Option Compare Database Option Explicit Private Sub command_form_open_b_Click() On Error GoTo Err_command_form_open_b_Click Dim stDocName As String Dim stLinkCriteria As String stDocName = "B" DoCmd.OpenForm stDocName, , , stLinkCriteria Me.Visible = False Exit_command_form_open_b_Click: Exit Sub Err_command_form_open_b_Click: MsgBox Err.Description Resume Exit_command_form_open_b_Click End Sub 【フォーム:B】 Option Compare Database Option Explicit Private Sub Form_Close() If funcIsLoaded("A") = True Then Forms!A.Visible = True End If End Sub 【標準モジュール:Module1】 Option Compare Database Option Explicit Function funcIsLoaded(ByVal strFormName As String) As Boolean Const conObjStateClosed = 0 Const conDesignView = 0 If SysCmd(acSysCmdGetObjectState, acForm, strFormName) <> conObjStateClosed Then If Forms(strFormName).CurrentView <> conDesignView Then funcIsLoaded = True End If End If End Function このたびはどうもありがとうございました。 以上、よろしくお願いします。