質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

1回答

3137閲覧

[Access VBA]スタックせずに次フォームに遷移したい

imprezza

総合スコア61

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

1クリップ

投稿2020/08/19 08:56

前提・実現したいこと

Accessで複数フォームを使用したシステムを作っています

各フォームにはコマンドボタンを配置して

  • Form_メニュー01
    コマンドボタン [メニュー02呼出]
    コマンドボタン [メニュー03呼出]
    コマンドボタン [業務終了] - Accessを終了

  • Form_メニュー02
    コマンドボタン [入力画面02_01呼出]
    コマンドボタン [入力画面02_02呼出]
    コマンドボタン [メニュー01呼出]

  • Form_入力画面02_01
    コマンドボタン [メニュー02呼出]

  • Form_入力画面02_02
    コマンドボタン [メニュー02呼出]

  • Form_メニュー03
    コマンドボタン [入力画面03_01呼出]
    コマンドボタン [入力画面03_02呼出]

  • Form_入力画面03_01
    コマンドボタン [メニュー03呼出]

  • Form_入力画面03_02
    コマンドボタン [メニュー03呼出]

このような構成にしています

それぞれのコマンドボタンには

VBA

1DoCmd.OpenForm "呼び出したいフォーム名", , , "", , acDialog 2DoCmd.Close acForm, Me.Name, acSaveNo

と記載しています

発生している問題・エラーメッセージ

この方法だと
下図のように元フォームから次フォームを呼び出してもsubを終了せずどんどんネストしていってしまいます
イメージ説明
(呼び出し履歴のハードコピー)

Accessを閉じずにフォーム移動を繰り返していると、スタック領域を占有していき、じきに

スタック領域が不足しています。

のエラーとなってしまいます
イメージ説明

試したこと

ネストしていく作りであることを前提に

  • フォームを呼び出す際は従来の方法を踏襲(フォーム開きっぱなし)
  • 戻る際には元フォームを開くのではなく自分を閉じるのみ(元フォームに戻る)

実際のシステムではもっと深く階層化していき改修量がかなり多くなるため、前フォームをしっかり閉じて遷移していく方法が無いかと思案しています

前フォームを閉じる方法、こうしないと実現できない等のアドバイスがあればぜひ教えてください

補足情報

使用しているAccessのバージョン

  • Microsoft Access 2010(32bit)
  • Microsoft Access 2019(64bit)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

コードの順序を入れ替えればいいでしょう。

vba

1DoCmd.Close acForm, Me.Name, acSaveNo 2DoCmd.OpenForm "呼び出したいフォーム名", , , "", , acDialog

acDialogを設定(ダイアログモード)するとフォームがモーダルで開きます。
モーダルとはフォームが閉じるまで、次のコードが実行されないということです。

質問のコードだと、
呼び出したフォームを閉じない限り(あるいは非表示にするまで)次のコード DoCmd.Close は実行されないということです。


別案
呼び出したいフォームの「ポップアップ」プロパティを「はい」、「作業ウィンドウ固定」を「はい」、「境界線スタイル」を「ダイアログ」に設定しておく。acDialogを設定しない。これで動作的にはダイアログウィンドウだか、モーダルにはならない。

vba

1DoCmd.OpenForm "呼び出したいフォーム名" 2DoCmd.Close acForm, Me.Name, acSaveNo

こちらの方が確実に End Sub まで行くので、スタック領域を占有しないと思います。

投稿2020/08/19 13:05

編集2020/08/19 14:39
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

imprezza

2020/08/20 06:29

アドバイスありがとうございます 別案のモーダルではないダイアログウィンドウの方式を試して、スタック領域を使い潰さないフォーム遷移を実現できました 今まで20往復のフォーム遷移でエラーとなっていたものが50往復を複数フォームで遷移してもびくともしません 長い事原因不明のままだましだまし先延ばしにしていた現象を根治出来そうです ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問