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

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

DexMachinaの回答

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

【要旨】 Formsコレクションの最小Indexは「0」なので、ループ内での 最小値も「0」とする必要があります。 【詳細】 > どうして、サンプル2じゃダメなのか教えていただけますか? FormsコレクションのIndexは、  最小値は「0」  最大値は「開いているフォームの数-1」 です。 http://technet.microsoft.com/ja-jp/subscriptions/dd589727%28v=office.11%29.aspx なので、2つのフォームが開いているときに存在するのは  Forms(0)、Forms(1) になります。 ここで、サンプル1・サンプル2でのintCntを確認すると、  サンプル1: Forms.Count-1~0 → 1~0  サンプル2: 1~Forms.Count → 1~2 となり、サンプル2では、存在しない「Forms(2)」に対して Nameプロパティを参照してしまいます。 これが、エラーの原因です。 (なお、DoCmd.Close自体は、現在開いていないフォーム  を指定しても、エラーにはなりません。今回ご質問の  エラーは、あくまで「Forms(2)」を参照しようとした  ところで発生します) では、サンプル2のintCntの範囲が「0~1」となるように Sub サンプル2()   Dim intCnt As Integer   For intCnt = 1 To Forms.Count     DoCmd.Close acForm, Forms(intCnt).Name   Next End Sub とすればOkかというと、これもエラーとなります。 これは、(既にnicotinismさんからも説明がありますが) 1つ目のフォームが閉じられたところで、Formsコレクションの Indexは連番になるように割り当て直されてしまうためです。 (この再割当をせず、閉じた番号分が欠番のままとされて  しまうと、今度はForms.CountでIndexの最大値を取得  できない、という問題が発生するため、再割当は必須、と) ですので、サンプル2のパターンで正常動作をさせるには、 ループ内でのIndexを「0」で固定(=Formsコレクションで 管理されている先頭のフォームを常に対象)としてやれば Ok、となります。 Sub サンプル2()   Dim intCnt As Integer   For intCnt = 1 To Forms.Count     DoCmd.Close acForm, Forms(0).Name   Next End Sub

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 多分この様なプログラムでした。 解決方法を教えてください。 宜しくお願いします。