プロが教えるわが家の防犯対策術!

AというフォームからBというフォームを開く際、AフォームのVisibleをFalseにし、Bのフォームを閉じる際、AというフォームのVisibleをTrueにするようにしました。

そうしたところ、Bというフォームを開いた状態でAccessの右上の×ボタンをクリックすると、エラーが出るようになりました。
エラー内容より、上記手順の場合、すでにAフォームが閉じている状態で、AフォームのVisibleをTrueにしようとしているためだと思いました。

そのため、Aフォームが開いている場合のみ、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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご教示いただいたソースで意図した動作となりました。


【フォーム: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


このたびはどうもありがとうございました。
以上、よろしくお願いします。

お礼日時:2011/06/05 15:16

現在、『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の中で複雑な処理をやっている場合はお勧めできませんが、
そうでない場合は、覚えておくと他のエラーにも応用できますので、参考まで。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

ご教示いただいたソースで意図した動作となりました。


【フォーム: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


このたびはどうもありがとうございました。
以上、よろしくお願いします。

お礼日時:2011/06/05 15:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています