
AというフォームからBというフォームを開く際、AフォームのVisibleをFalseにし、Bのフォームを閉じる際、AというフォームのVisibleをTrueにするようにしました。
そうしたところ、Bというフォームを開いた状態でAccessの右上の×ボタンをクリックすると、エラーが出るようになりました。
エラー内容より、上記手順の場合、すでにAフォームが閉じている状態で、AフォームのVisibleをTrueにしようとしているためだと思いました。
そのため、Aフォームが開いている場合のみ、AフォームのVisibleをTrueにしたいと思ったのですが、どのように記述すれば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。
以上、宜しくお願いします。
No.1ベストアンサー
- 回答日時:
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
ご回答ありがとうございます。
ご教示いただいたソースで意図した動作となりました。
【フォーム: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
このたびはどうもありがとうございました。
以上、よろしくお願いします。
No.2
- 回答日時:
現在、『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
このたびはどうもありがとうございました。
以上、よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
Access「レコードが削除されました」のエラー
Access(アクセス)
-
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
ACCESS VBA ウィンドウを閉じる
Visual Basic(VBA)
-
-
4
accessでイベントを中止するようなコマンドはあるのでしょうか?
その他(データベース)
-
5
Access終了時にマクロまたはVBAの実行したい
その他(Microsoft Office)
-
6
サブフォームに対してGoToRecordするには?
その他(Microsoft Office)
-
7
前のレコードの値を自動で入れたい
PowerPoint(パワーポイント)
-
8
accessVBA 「フォームが見つかりません」
その他(データベース)
-
9
dbFailOnError とは?
その他(データベース)
-
10
MS Accessでフォームの「開く時」と「読込み時」のイベントの違い
Access(アクセス)
-
11
Accessのフォーム上にレコード数とレコード番号の表示
その他(データベース)
-
12
Access サブフォームでの選択行の取得
その他(データベース)
-
13
アクセスで入力したデータの順番が変わってしまいます
その他(ビジネス・キャリア)
-
14
アクセスのフォームで、文字を中央揃えにしたい
Access(アクセス)
-
15
アクセスで数値型のフィールドにNullをいれたい
その他(データベース)
-
16
Accessで、1つの項目に複数の置換えを1度でするには?
Access(アクセス)
-
17
access テキストボックスの値取得
Access(アクセス)
-
18
Accessで数値型にNULLをInsertするとエラー
その他(データベース)
-
19
Access2010 「演算子がありません」エラー
その他(データベース)
-
20
なぜエラーになるのでしょう?アクティブコントロール
その他(Microsoft Office)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
【VBA】ワークブックを開く時に...
-
実行時エラー 438 の解決策をお...
-
ApplicationとWorksheetFunctio...
-
Filter関数を用いた結果、何も...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
【Access】Excelインポート時に...
-
VBAでfunctionを利用しようとし...
-
レコード登録時に「演算子があ...
-
String""から型'Double'への変...
-
VBA データ(特定値)のある最...
-
【VBAエラー】Nextに対するFor...
-
2回目からはLoadLibrary()が"cn...
-
ACCESSで値を代入できないとは?
-
On ErrorでエラーNoが0
-
実行時エラー´5854´ 文字列型パ...
-
Selenium のエラーがでます。
-
インポート時のエラー「データ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
マクロで"#N/A"のエラー行を削...
-
文字列内で括弧を使うには
-
String""から型'Double'への変...
-
【Access】Excelインポート時に...
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
インポート時のエラー「データ...
-
ACCESSで値を代入できないとは?
-
VBA エクセル で FIND でのエラ...
-
Filter関数を用いた結果、何も...
-
レコード登録時に「演算子があ...
-
ApplicationとWorksheetFunctio...
-
Excel vbaについての質問
-
【VBAエラー】Nextに対するFor...
-
実行時エラー 438 の解決策をお...
-
「実行時エラー '3167' レコー...
おすすめ情報