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

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

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

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

Access

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

Q&A

解決済

2回答

4293閲覧

ACCESS VBAを用いて最上階層の親フォームを閉じたい。

m.kosuda

総合スコア153

VBA

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

Access

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

0グッド

0クリップ

投稿2016/09/14 08:00

閲覧頂きありがとうございます。

AccessでVBAを用いて最上階層の親フォーム(親がN)を閉じ方はありますか?
また、ある場合ヒントでよいのでご教示頂ければと思います。

VBA

1 2'// 親->子の場合は、以下でフォームを閉じる 3DoCmd.Close acFrom, Me.Parent.Name 4 5'// 親->親->子の場合は?

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

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

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

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

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

guest

回答2

0

ベストアンサー

すでに提案されてますが、
やはりParent がエラーになるまでループで遡るというのがシンプルだと思います。

VB

1 Dim pfrm As Form 2 3 Set pfrm = Me 4 5 On Error Resume Next 6 Do Until Err.Number <> 0 7 Set pfrm = pfrm.Parent 8 Loop 9 On Error GoTo 0 10 11 DoCmd.Close acForm, pfrm.Name

※コメントで指摘を受けた部分を修正しました。

投稿2016/09/18 07:00

編集2016/09/18 08:46
hatena19

総合スコア33715

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

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

nakit

2016/09/18 08:00

私も真っ先に思いついたのはエラーまで辿る方式でした。 ただ、On Error Resume Next を使用する場合、その後 On Error Goto 0 をするなど考慮しないと他のエラーを無視してしまう可能性があります。 特定のエラーのみトラップするという考え方は、そのような副作用の考慮が面倒であり個人的にはシンプルでないため、次善策をあげさせて頂いた次第です。 また動作には影響しませんが Err <> 0 は Err.Number <> 0 とした方が個人的には分かり易いです。 一見、型が異なるものを比較しているように見える人もいるかも知れませんし、Numberが既定のプロパティだと知らない人もいるかも知れませんので。
hatena19

2016/09/18 08:52

規定のプロパティを省略するかどうかは、プログラマーの好みですが、 確かに、厳密性、可読性を重視するなら省略しないほうがいいですね。 On Error Resume Next は使う場合は、最小限の範囲に止めて、最後に On Error Goto 0 でリセットしておくべきというのはそのとおりだと思います。 できれば、On Error Resume Next はさけて、Err.Number で場合分けしてエラー処理すべきですが、今回は、Set pfrm = pfrm.Parent の1行だけですのエラー無視しても、 悪影響はないかなと考えてます。
guest

0

Parentプロパティの値がエラーとなるまで判定する方法も考えられますが、
以下のようにApplication全体の最上位フォームに含まれているかで判定する方法はいかがでしょうか。

Dim frmTops As Forms '最上階層フォーム一覧 Dim frmTop As Form '最上階層フォーム候補 Set frmTops = Application.Forms Set frmTop = Me Do '候補のフォームが最上階層フォーム一覧に含まれていればループを抜ける For Each frmWatch In frmTops If frmTop Is frmWatch Then Exit Do End If Next '含まれていなければ親フォームを候補とする Set frmTop = frmTop.Parent Loop '最上階層フォームを閉じる DoCmd.Close AcObjectType.acForm, frmTop.Name

投稿2016/09/18 05:09

nakit

総合スコア410

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問