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

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

ただいまの
回答率

90.37%

  • VBA

    2059questions

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

  • Access

    517questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,464

m.kosuda

score 70

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

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

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

'// 親->親->子の場合は?
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

Dim pfrm As Form

    Set pfrm = Me

    On Error Resume Next
    Do Until Err.Number <> 0
        Set pfrm = pfrm.Parent
    Loop
    On Error GoTo 0

    DoCmd.Close acForm, pfrm.Name

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/18 17:00

    私も真っ先に思いついたのはエラーまで辿る方式でした。
    ただ、On Error Resume Next を使用する場合、その後 On Error Goto 0 をするなど考慮しないと他のエラーを無視してしまう可能性があります。
    特定のエラーのみトラップするという考え方は、そのような副作用の考慮が面倒であり個人的にはシンプルでないため、次善策をあげさせて頂いた次第です。

    また動作には影響しませんが Err <> 0 は Err.Number <> 0 とした方が個人的には分かり易いです。
    一見、型が異なるものを比較しているように見える人もいるかも知れませんし、Numberが既定のプロパティだと知らない人もいるかも知れませんので。

    キャンセル

  • 2016/09/18 17:52

    規定のプロパティを省略するかどうかは、プログラマーの好みですが、
    確かに、厳密性、可読性を重視するなら省略しないほうがいいですね。

    On Error Resume Next は使う場合は、最小限の範囲に止めて、最後に
    On Error Goto 0 でリセットしておくべきというのはそのとおりだと思います。

    できれば、On Error Resume Next はさけて、Err.Number で場合分けしてエラー処理すべきですが、今回は、Set pfrm = pfrm.Parent の1行だけですのエラー無視しても、
    悪影響はないかなと考えてます。

    キャンセル

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • VBA

    2059questions

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

  • Access

    517questions

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