本ページには広告が含まれています。

VBA Parent プロパティを使ってコンテナ単位にする

UserForm のコピーを作成する方法について勉強を継続しています。前回は、MultiPagePage プロパティ値を取得する方法がわかりました。今回は、FrameMultiPage などのコンテナ単位でコントロールを整理する方法を考えていきます。
そして、コントロールのプロパティー値をコンテナ単位で取得していけるようしたいと思います。

くるみこ
くるみこ

そういえば、.Parent プロパティというのを使うと親オブジェクトが何かがわかるのを思い出しました。これを使えばコンテナに配置されているコントロールを判別できるんじゃないかと思います。それではテストしてみましょう。

わかりました。よろしくお願いしますm(__)m

前回記事「VBA MultiPage の Pageプロパティ値を取得する」がこちらです。

【この記事でわかることは】
Parent プロパティでコンテナ内のコントロールを特定する方法

スポンサーリンク

Parent プロパティとは

はじめに、Parent プロパティについて少し解説。

Parent プロパティとは、指定されたオブジェクトの親オブジェクトを返すプロパティです。読み取り専用(値の取得のみ可能)です。

【構文】オブジェクト.Parent

MultiPage の階層関係

MultiPageのあるUserFormにおけるオブジェクトの階層構造を表現すると次のようになっています。
Excel の階層は、次のようになっています。

 Application
  ┗ Wokbook
    ┗ Worksheet
       ┗ Range

では、UserForm はどうでしょうか。単一のTreeで表すとこんな感じですね。

 UserForm1
  ┗ MultiPage1
    ┗ Page1
      ┗ Frame1
        ┗ OptioButton1

MultiPage の PageオブジェクトやFrameオブジェクトと階層関係になっているコントロールを把握すれば、コンテナ単位でまとめることができそうですね。

Parent プロパティをテストしてみます

Parent プロパティを次のサンプルで確認してみましょう。
TypeName 関数で種別、.Name でオブジェクトの名前を取得する設定です。

Sub Parent_Test()
  With UserForm1
    MsgBox "Type:" & TypeName(.MultiPage1.Page1.Frame1.OptionButton1.Parent)
    MsgBox "Name:" & .MultiPage1.Page1.Frame1.OptionButton1.Parent.Name
    MsgBox "Type:" & TypeName(.MultiPage1.Page1.Frame1.OptionButton1.Parent.Parent)
    MsgBox "Name:" & .MultiPage1.Page1.Frame1.OptionButton1.Parent.Parent.Name
    MsgBox "Type:" & TypeName(.MultiPage1.Page1.Frame1.OptionButton1.Parent.Parent.Parent)
    MsgBox "Name:" & .MultiPage1.Page1.Frame1.OptionButton1.Parent.Parent.Parent.Name
    MsgBox "Type:" & TypeName(.MultiPage1.Page1.Frame1.OptionButton1.Parent.Parent.Parent.Parent)
    MsgBox "Name:" & .MultiPage1.Page1.Frame1.OptionButton1.Parent.Parent.Parent.Parent.Name
  End With
End Sub

【実行結果】 メッセージボックスが次のように順次表示されました。
Type:Frame
  Name:Frame1
  Type:Page
  Name:Page1
Type:MultiPage
  Name:MultiPage1
Type:UserForm
  Name:UserForm1

Parent プロパティでしっかり親オブジェクトやもっと上の階層まで確認することができますね。

Parent プロパティを使ってコンテナ単位で取得するには

Parent プロパティを使えることがわかったので、コンテナ単位でコントロールを取得するにはどうすればよいのか考えていきます。

プロパティ値保存用のシートを変更

取得できたプロパティ値を保存するシートを少し変更します。

変更前のプロパティ値保存シート】

今までのプロパティ値保存シート

変更後のプロパティ値保存シート】

変更後のプロパティ値保存シート

取得した オブジェクト名:Parent: を保存する行の追加を行いました。

Parent がわかることで、同一の Parent は 同名のオブジェクトに属していることがわかるようになりました。

VBAでコンテナ単位にまとめる動作を検討

VBProject からの階層で表してみるとこんな感じです。

VBProject
 ┗VBComponents.Count でループ
   ┗VBComponent(Index)の Type=3(UserForm)だけ処理する
     ┗UserForm自身のプロパティー取得
     ┗配置Controlの全プロパティ取得(Controlsコレクションでループ)
       ┗MultiPage があった場合
        (Parent:UserForm)
         ┗Pagesコレクションから各Page数分をループ
          (Parent:MultiPage)
           ┗Pageプロパティ取得
           ┗Page内に配置している全Controlを取得
             ┗Frame だった場合
              (Parent:Page)
               ┗Frame内配置Controlを取得
                (Parent:Frame)

Parent をチェックしてまとめていくイメージは何となくつかめました。

ただ、このツリーをそのままコードにすると、とんでもなく長いコードになってしまいます。

次回、例えばプロシージャを分けるなどの効率化する方法を検討していきたいと思います。

まとめ(おわりに)

以上、Parent プロパティを使って階層構造を利用してコンテナ単位でまとめる方法のヒントがつかめました。VBAのコード設定については次回以降に継続していきます。

まとめと感想など

くるみこ
くるみこ

VBProject からの階層で表してみたけれど、本当に深い階層になっていることがわかりましたね。それでも、Parent プロパティで切り分けしていけば何とかできそうなこともわかりました。次回からは実際にコーディングして検証していきましょう。

Parent プロパティって面白いですね。次回が楽しみです(^^)

【今回わかったことは】
・Parent プロパティでUserFormの階層構造を見る方法がわかりました
・階層を使ってコンテナ単位でまとめることができそうなことがわかりました

★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★

【今後の記事について】

今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考える」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m

【検討中の今後の記事内容は・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思っています・・・・
・今後の記事にご期待ください(^^)/

スポンサーリンク
スポンサーリンク

過去記事のサンプルファイルをダウンロードできます

今回記事はサンプルファイルの登録はありません!

過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください