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

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

30246kikuの回答

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

Access で良かったでしょうか。 #1さんと被る部分があると思いますが、説明の練習と思って頂ければと・・・ 全フォームを閉じたいのですよね。 以下を実行してみて、動きはどうなりますか Public Sub Sample3()   Dim iCnt As Integer   On Error GoTo ERR_HND   iCnt = 0   While (Forms.Count > iCnt)     DoCmd.Close acForm, Forms(iCnt).Name, acSaveNo   Wend   Exit Sub ERR_HND:   iCnt = iCnt + 1   Resume Next End Sub 上記はチョッとわかりにくいですか。エラー処理を省いた以下ではどうでしょう。 Public Sub Sample3Kai()   While (Forms.Count > 0)     DoCmd.Close acForm, Forms(0).Name, acSaveNo   Wend End Sub これは、Forms.Count が 0 になるまで、Forms(0).Name で閉じていくものになります。 Forms(0) が閉じられたと同時に、Forms(0) で見えていたものが消えます。 ですが、すぐにまた 0 ~ 参照できるように作り直されます。 開いているフォームの個数は、Forms.Count で知ることが出来ます。 For i = 0 to Forms.Count - 1 と記述すると、記述した時点の Forms.Count 分ループします。 なので、ループ途中で閉じて、Forms.Count が減っても、その値は参照されません。 フォームを開いていない時に For i = Forms.Count - 1 to 0 Step -1 とした場合、 For i = -1 to 0 Step -1 と記述したことと同じになり、1度もループ内を処理することはありません。 また、For i = 1 to 0 の記述でもループ内を処理することはありません。 Forms.Count の変化を見ながら処理したい場合は、冒頭で示した Sample3 の様に 都度判別するような記述が必要になります。 また、Sample3 の処理では、フォームを閉じようとしたけど閉じれなかった・・・ ・何らかのエラー ・「読み込み解除時」 Form_Unload(Cancel As Integer) で Cancel = True していた これらの時は、閉じるのはあきらめて次を閉じましょう・・・ というものになっています。

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