ACCESS VBA 親フォームの名前を取得する方法

親フォームの名前を取得する方法

ACCESSのVBAではフォームの名前を取得することが多々あります。

普通に現在利用しているフォームの名前を取得するのであれば、Me.Nameで問題ありません。
さらに、そのフォームにあるコントロールを指定するのであれば、Me!コントロール名で指定できます。

しかし、サブフォームを作っているときは勝手が異なります。

サブフォーム側でMe演算子を使っても、サブフォームの名前しか取得できず、親フォームの名前が取得できないのです。
こうなるとVBAで正しくフォームが指定できずに困ってしまいます。

今回はACCESS VBAで親フォームの名前を取得する方法をご紹介します。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは基本機能だけでも十分便利ですが、VBAを使うことで格段に使いやすいデータベースを作成可能です。
この記事ではACCESSでのVBAの使い方をご紹介していきます。

親フォーム名の取得

サブフォームから親フォーム名を取得する時は


 Me.Parent.Name
 

を使用します。
Meはサブフォームを指しており、Parnetで親フォームを指定、.Nameでフォーム名を取得しています。

以下のフォームをもとに具体例を示しましょう。
サブフォームに設置したボタンから、メインフォームの名称を取得します。

こちらのフォームはメインフォームとサブフォームから成っています。
デザインビューで見るとこんな形です。

メインフォームの「T_メインフォーム」の中に、サブフォームとして「T_サブフォーム」を入れてあります。
T_サブフォームのデザインビューは以下の通りです。

フッターに「親フォーム名取得」というボタンを設置してあります。
このボタンに設定したイベントプロシージャは以下の通りです。


 Private Sub 親フォーム名取得_ボタン_Click()

    MsgBox Me.Parent.Name

 End Sub
 

メッセージボックス関数を使って、親フォーム名を表示するようにしています。

では、実際にフォームビューで親フォーム名取得のボタンを押してみましょう。

このように、親フォーム名を表示することができました。

サブフォームの指定

また、VBAで標準モジュールからサブフォームを指定するためには記述に工夫が必要です。
サブフォームから自フォームを指定する時にはMeで指定できるのですが、標準モジュールからだと親フォームの名称も指定する必要があるのです。

例えば、以下はサブフォームを開いたときにサブフォーム内のコントロールを編集不可にするプロシージャです。

サブフォーム側のイベントプロシージャ


 Private Sub Form_Open(Cancel As Integer)
   
    Call form_detail_lock(Me.Parent.Name, Me.Name)
 
 End Sub
 

標準モジュール側のイベントプロシージャ


 Public ctl As Control
 '画面のロック処理をする際にコントールを識別するための変数。

 Public Sub form_detail_lock(oya_form_name As String, form_name As String)
 '■■フォームの詳細セクションのロックをする■■■

 For Each ctl In Forms(oya_form_name).Controls(form_name).Form.Section(acDetail).Controls
    
    Select Case ctl.ControlType
    
        Case 109, 110, 111
        '109:テキストボックス、110:リストボックス,111:コンボボックスの場合
        
            ctl.Enabled = False
            ctl.Locked = True
            ctl.BackColor = 15921906
        
        Case 106, 108, 112, 119, 122
        '106:チェックボックス、108:連結オブジェクトフレーム、112:サブフォーム、119:ActiveXコントロール、122:トグルボタンの場合

            ctl.Enabled = False
            ctl.Locked = True
            
        Case 104
        '104:コマンドボタンの場合
        
            ctl.Enabled = False
            
    End Select

 Next

 End Sub
 

サブフォームのコントロールをすべて指定する際に


 For Each ctl In Forms(oya_form_name).Controls(form_name).Form.Section(acDetail).Controls
 

という書き方をしているのが分かると思います。

以上、親フォームの名前を取得する方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。