UserForm のコピーを作成する方法について勉強を継続しています。前回は、MultiPage の Page プロパティ値を取得する方法がわかりました。今回は、Frame や MultiPage などのコンテナ単位でコントロールを整理する方法を考えていきます。
そして、コントロールのプロパティー値をコンテナ単位で取得していけるようしたいと思います。
そういえば、.Parent プロパティというのを使うと親オブジェクトが何かがわかるのを思い出しました。これを使えばコンテナに配置されているコントロールを判別できるんじゃないかと思います。それではテストしてみましょう。
わかりました。よろしくお願いしますm(__)m
前回記事「VBA MultiPage の Pageプロパティ値を取得する」がこちらです。
【この記事でわかることは】
・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 プロパティって面白いですね。次回が楽しみです(^^)
★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★
【今後の記事について】
今回の記事はいかがだったでしょうか。皆さまのお役に立てたなら幸いです(^^;
「汎用でだれでも使えて活用できるように考える」というポリシーで、記事を継続して書いていきたいと思っています。どうぞよろしくお願いしますm(_ _)m
【検討中の今後の記事内容は・・・・】
・実務に役立つものを提供できるよう常に検討しています(^^ゞ
・その他雑記的に「プチネタなど」もいろいろ考えていきたいと思っています・・・・
・今後の記事にご期待ください(^^)/
過去記事のサンプルファイルをダウンロードできます
今回記事はサンプルファイルの登録はありません!
過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください
【今回わかったことは】
・Parent プロパティでUserFormの階層構造を見る方法がわかりました
・階層を使ってコンテナ単位でまとめることができそうなことがわかりました