• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:現在開いている全てのフォームを閉じるVBA)

VBAで全てのフォームを閉じる方法

30246kikuの回答

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.7

#5です なぜエラーとなるかは、#1さんが2段目で説明されていたので、 質問者さんの置かれている状況 ・新規で1から作っている ・既存のものを手直ししようとしている がわからなかったもので、削除する際の他の方法についてをメインに回答してみました。 私の提示した方法でも、Step -1 での方法でも対処できないものもあります。 例えば、 ・フォームAは自分では閉じれない状況で表示されている ・フォームAがフォームBを起動 ・フォームAがフォームCを起動 ・フォームCを閉じた時、フォームAを閉じる 簡単に言えば、起動されたフォームが閉じられる時、起動元も閉じる。 あまりこういう構成は取らないですかね。 起動された方は、自分の処理が終わったら情報を起動元に返すとかして、自分だけを閉じる・・ この動きが前提でありました。 Forms 内の情報ですが、私は以下の様に考えてます。 「フォームA」「フォームB」を順に表示した時は、 (左側がIndexで、右側がフォーム名) 0 フォームA 1 フォームB ここで、「フォームC」を表示した時は 0 フォームA 1 フォームB 2 フォームC となり 0 フォームC 1 フォームA 2 フォームB とか 0 フォームA 1 フォームC 2 フォームB ではないと思ってました。 また、サンプル2で何故エラーになるかの説明になると思いますが 0 フォームA 1 フォームB 2 フォームC の状況下で、フォームAを閉じたら 0 フォームB 1 フォームC になり 0 フォームC 1 フォームB にはならないと思ってました。 そこで、For のループを進んで Index = 2 を参照したところでエラーになる・・・・ Step - 1 でIndex の大きい方から閉じるのであれば、その Index 部分が消えるだけで、 前にある Index 部分に影響はないので、全部処理することが出来ます。 フォームを表示していくと ・現在の Index + 1 した所に情報が置かれる ・途中がなくなれば、0 スタートで順に繰り上がる と思ってます。なので、 インデックスが変わる可能性については、閉じた時の話であると私は解釈しています。 これを前提とするならば、 Index の小さい方に「親」と呼ばれるフォームが存在することになります。 「親」から処理するか「子」から処理するか、大きな違いがあるように私は思います。 (#5で紹介したように親が子を管理している場合もあるので) 前述した > 起動された方は、自分の処理が終わったら情報を起動元に返すとかして、自分だけを閉じる・・ を前提としたら、Step - 1 の方法であった方が少しは安全かと私は思います。 「親」も一緒に閉じる様な事をしていたら、On Error Resume Next でエラーを無視すれば・・・ 以上 私が思っていた事を前提とした内容になっているので、真偽は確かめてください。

usictyhb
質問者

お礼

ありがとうございました。

関連するQ&A

  • アクセスVBA現在開いている全てのテーブルを閉じる

    現在開いている全てのテーブルを閉じるってことをしたいのですが Sub 現在開いている全てのテーブルを閉じる() Dim intCnt As Integer For intCnt = Tables.Count - 1 To 0 Step -1 DoCmd.Close acTable, Tables(intCnt).Name Next intCnt End Sub これだとエラーになります。 フォームならうまくいくのですが・・・。 フォームとテーブルでは構成が違うのでしょうか?

  • 全てのフォームを閉じるには?

    かなり昔の質問を引っ張り出しますがご容赦ください http://oshiete1.goo.ne.jp/qa4158345.html のように 今度はフォームを閉じたいのですが Sub 全てのフォームを閉じる() Dim フォーム As DAO.QueryDef For Each フォーム In CurrentDb().FormDefs DoCmd.Close acForm, フォーム.Name Next End Sub で、デバッグすると 「.FormDefs」の部分が ”コンパイルエラー メソッドまたはデータ メンバが見つかりません。 (Error 461)” になってしまいます。 Sub QueryAllClose() Dim Q As DAO.QueryDef For Each Q In CurrentDb().QueryDefs DoCmd.Close acQuery, Q.Name Next End Sub は問題なく行なえます。 フォームは不可能なのでしょうか?

  • 全てのフォームを削除したい アクセス2010

    フォーム1とフォーム2がありまして、どちらもvbaで削除したいのですが Sub Sample() Dim obj As AccessObject For Each obj In CurrentProject.AllForms Debug.Print obj.Name & "を削除します" DoCmd.DeleteObject acForm, obj.Name Debug.Print obj.Name & "を削除しました" Next End Sub これを実行すると、フォーム2は削除できるのですが、 Nextの部分で、 実行時エラー'-2147467259(80004005)' オートメーションエラーです。エラーを特定できません。 と出て、 デバッグを押して再度実行すると、 実行時エラー92 for ループが初期化されていません にかわります。 デバッグウインドウには フォーム2を削除します フォーム2を削除しました が出力されます。 DoCmd.DeleteObject acForm, obj.Nameをなしにして、コードを実行すると、 フォーム2を削除します フォーム2を削除しました フォーム1を削除します フォーム1を削除しました が出力されます。 フォームを削除することによって順番が狂いエラーが発生するようですが、 そうであれば、どうすればすべてのフォームを削除することができるのでしょうか?

  • {アクセス}全てのフォームの名前を取得したい

    ひとつのMDBファイルに入っている全てのフォームの名前を取得したいのですが Sub 全てのフォームの名前を取得() Dim i As Integer For i = 1 To Forms.Count Debug.Print Forms.Name Next End Sub このコードだと オブジェクトは、このプロパティまたはメソッドをサポートしていません。(Error 438) となってしまいます。 どうすればいいでしょうか よろしくお願い致します。

  • アクセス2002 VBA

    フォームを保存せずに閉じたいのですが、 当該フォームの「閉じる時」プロパティーにイベントプロシージャを設定し、 Private Sub Form_Close() DoCmd.Close acForm, "フォーム1", acSaveNo End Sub と記述しました。  ところが、実行すると 「Close アクションの実行はキャンセルされました。」とエラーになってしまいました。  間違いの指摘をお願いします。

  • access フォームについて

    access2003にて登録フォームを作成しています。 このフォーム内に入力したデータを登録ボタンを押し、「登録しますか」のメッセージに 「いいえ」とすれば保存せずにこのフォームを閉じる。 「キャンセル」とすれば保存せずにフォームに戻る。 「はい」とすれば保存して閉じたいです。 しかし、以下の式を実行すると 「いいえ」はバッチリ希望通りに動くのですが、 「キャンセル」をすると保存されてフォームに戻り、 「はい」とすると保存されずにフォームが閉じられてしまいます。 何がまずいのでしょうか・・・。 ----- Private Sub Form_BeforeUpdate(Cancel As Integer) Dim Ret As Integer Ret = MsgBox("登録しますか?" & vbCrLf & " " & vbCrLf & "「いいえ」を選択すると保存せず閉じます", vbYesNoCancel) '「いいえ」を選択したら、保存せずに閉じる If Ret = vbNo Then DoCmd.Close acForm, "振返りデータ", acSaveNo '「キャンセル」を選択したら、保存せずにフォームに戻る Else If Ret = vbCancel Then Else DoCmd.Close acForm, "振返りデータ", acSaveYes End If End If End Sub

  • エクセル フォーム上の全てのコントロールを取得した

    エクセル フォーム上の全てのコントロールを取得したい http://okwave.jp/qa/q4879853.html のNo.1さんの回答を参考に、 Sub try() Dim i As Integer Dim StrFormName As String StrFormName = "フォーム1" For i = 0 To Forms(StrFormName).Controls.Count - 1 Debug.Print Forms(StrFormName).Controls.Item(i).Name Next End Sub を作ったのですが、 「Forms」の部分が、 「Sub、Function、または Property が定義されていません。(Error 35)」 というコンパイルエラーになってしまいます。 上記のコードをアクセスVBAにつけると、全てのコントロール名が取得できます。 同じようにエクセルで使うにはどこを修正すればいいでしょうか? フォーム名は、変数に入れて使いたいです。

  • フォームを作成すると同時にイベントを作成する方法は

    フォームを作成すると同時にイベントを作成する方法は? アクセスなのですが 標準モジュールで Sub フォームを作成() Dim myForm As Form Set myForm = CreateForm DoCmd.Close acForm, myForm.Name, acSaveYes End Sub をしたと同時に、 そのフォーム内に Private Sub Form_Open(Cancel As Integer) MsgBox "開きました" End Sub のようなイベントを同時に生成するにはどうすればいいでしょうか? クラスモジュールを使うのですか? クラスモジュールの使い方がまったくわからないのですが サンプルコードを頂けないですか?

  • なぜエラーになるのでしょうか? アクセス フォーム

    全てのフォームを一気に削除したく、ググってみたら http://okwave.jp/qa/q8093271.htmlが見つかって Sub test() Dim i As Integer For i = CurrentProject.AllForms.Count - 1 To 0 Step -1 DoCmd.DeleteObject acForm, CurrentProject.AllForms(i).Name Next i End Sub のコードを実行してみたのですが、途中で 実行時エラー2467 指定した式で、閉じているかまたは存在しないオブジェクトを参照しています。 という、エラーになってしまいます。 ググってみたらこのエラーはフォームが存在しない時に発生するエラーのようですが、 全てのフォームをループしているのに存在しないフォームを参照する事なんてあるのでしょうか? フォームはすべて閉じている状態で実行しました。 あと、発見したのが、 実行時エラー2467の前に、 実行時エラー29068 この再差を完了することができません。コードを中断し、再度実行してください。 と言うエラーが出るようです。そのままデバッグボタンを押すと、実行時エラー2467になるようです。

  • ACCESSでフォームのUnloadでデータベースを閉じる様にしたら・・・

    ACCESS97でフォームのUnloadを使ってフォームを閉じた後、データベースも閉じるプログラムを作って実行させました。思った通りに動いたのですが、フォームをデザインビューにしようとすると、おそらく上記のプログラムが実行される為、データベースが閉じてしまうので編集できなくなってしまいました。 Pribate Sub cmdClose_Click() DoCmd.Close acForm,Me.Name End Sub -------------------------------- Private Sub Form_Unload(Cancel As Integer) Application.CloseCurrentDatabase End Sub 多分この様なプログラムでした。 解決方法を教えてください。 宜しくお願いします。