Page 200 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼コントロールのリストを取得したいのですが みんと 02/10/12(土) 15:25 ┣Re:コントロールのリストを取得したいのですが ひで 02/10/12(土) 18:34 ┃ ┣Re:コントロールのリストを取得したいので... みんと 02/10/12(土) 19:03 ┃ ┗スゴイ! ・・・でも みんと 02/10/12(土) 20:26 ┃ ┗Re:スゴイ! ・・・でも ひで 02/10/12(土) 20:34 ┃ ┗Re:スゴイ! ・・・でも みんと 02/10/12(土) 20:49 ┃ ┣Re:スゴイ! ・・・でも ichinose 02/10/12(土) 22:02 ┃ ┗ちょっと一言 ぴかる 02/10/12(土) 22:08 ┃ ┗知りませんでした・・・。 みんと 02/10/12(土) 23:42 ┃ ┗Re:知りませんでした・・・。 ichinose 02/10/12(土) 23:50 ┃ ┗説明不足でした。 みんと 02/10/13(日) 0:20 ┃ ┗Re:説明不足でした。 ichinose 02/10/13(日) 7:13 ┃ ┗動きません・・・。 みんと 02/10/13(日) 13:06 ┃ ┗Re:動きません・・・。 ichinose 02/10/13(日) 14:23 ┃ ┗ヤタッ! みんと 02/10/13(日) 17:30 ┃ ┗Re:ヤタッ! ichinose 02/10/13(日) 18:21 ┗ありがとうございましたっ! みんと 02/10/14(月) 1:43 ─────────────────────────────────────── ■題名 : コントロールのリストを取得したいのですが ■名前 : みんと <kool_mint@anet.ne.jp> ■日付 : 02/10/12(土) 15:25 -------------------------------------------------------------------------
はじめて投稿します。 もしかして同様の質問が既に・・・と思い,検索してみましたが,うまくヒットしませんでした。もし,既出でしたら,ご指摘ください。 で,質問ですが,自分で作ったユーザーフォームのコントロール(けっこうたくさんある)の一覧表を作りたいのですが,いまいちうまくいきません。 よろしくご教授くだい。 ちなみに,某「かんたんプログラミング〜応用編」に掲載されていた「コマンドIDと機能一覧を作成する」を応用するのかな?ってところまでは気付いたのですが・・・。 できれば,オブジェクト名,キャプションの他に,どのユーザーフォーム上にあるとか,マルチページのどのページとか,どのフレーム内にあるとかまで分かるとウレシイのですが・・・。(欲張りすぎでしょうか? 笑) よろしくお願いします。 |
▼みんと さん こんばんは >はじめて投稿します。 >もしかして同様の質問が既に・・・と思い,検索してみましたが,うまくヒットしませんでした。もし,既出でしたら,ご指摘ください。 [#31] が参考になるのでは・・・ まとはずれだったらごめんなさい。 |
▼ひで さん: >[#31] が参考になるのでは・・・ なんかソレっぽい感じがします。 とにかく#31を研究してみます。 が,見慣れないコードがたくさん・・・。(>_<) どーなるのか分からないので,まだ, ありがとうございます!・・・とは言えないのですが, コメントありがとうございました。 ※その他にも情報があればよろしくお願いします!! |
▼ひで さん #31を試してみました! ほとんど,オレの考えてたとおりの結果でした! コードはまだ,よく分かってませんが・・・。(^^;) ところが,captionを表示させようと思うとキチンと動きません。 コンボボックスのようにcaptionが無いものあるので, エラートラップもしているのですが・・・。 注意点あるいは具体的な変更箇所など,教えていただけると 助かります。 よろしくお願いします。 |
▼みんと さん >#31を試してみました! >ほとんど,オレの考えてたとおりの結果でした! >コードはまだ,よく分かってませんが・・・。(^^;) >ところが,captionを表示させようと思うとキチンと動きません。 >コンボボックスのようにcaptionが無いものあるので, >エラートラップもしているのですが・・・。 >注意点あるいは具体的な変更箇所など,教えていただけると >助かります。 すいません、私もわかりませーん ごめんなさい。 具体的なコードをのせると他の方々の回答が つきやすくなると思うのですが。 |
▼ひで さん >具体的なコードをのせると他の方々の回答が >つきやすくなると思うのですが。 アドバイスありがとうございます。 ここでの作法(?)がよくわからないので,#31の書き足した部分のみ 以下に示します。 For Each ctl In vbc.Designer.Controls RR& = RR& + 1 On Error Resume Next←ココ!! ws.Cells(RR&, 1).Value = ctl.Name ws.Cells(RR&, 2).Value = ctl.Parent.Name ws.Cells(RR&, 3).Value = vbc.Name ws.Cells(RR&, 4).Value = ctl.Caption←ココ!! Next これだと,エラー時(キャプションのない時)にはループを抜けちゃう みたいなんですけど・・・。 オレの場合では,たまたまcomboboxを最初に読みにいっているらしく, vbc.Nameまでを読み込んで終了してしまいます。 どなたかよろしくご教授ください。 |
▼みんと さん: ▼ひで さん こんばんは。 >>具体的なコードをのせると他の方々の回答が >>つきやすくなると思うのですが。 > >アドバイスありがとうございます。 >ここでの作法(?)がよくわからないので,#31の書き足した部分のみ >以下に示します。 > > For Each ctl In vbc.Designer.Controls > RR& = RR& + 1 > On Error Resume Next←ココ!! > ws.Cells(RR&, 1).Value = ctl.Name > ws.Cells(RR&, 2).Value = ctl.Parent.Name > ws.Cells(RR&, 3).Value = vbc.Name > ws.Cells(RR&, 4).Value = ctl.Caption←ココ!! > Next > >これだと,エラー時(キャプションのない時)にはループを抜けちゃう >みたいなんですけど・・・。 >オレの場合では,たまたまcomboboxを最初に読みにいっているらしく, >vbc.Nameまでを読み込んで終了してしまいます。 以下のコードで動作していますが・・・。 '================================================================ Sub test() Dim compo As VBComponent Dim ctl Dim ws As Worksheet On Error Resume Next Set ws = ThisWorkbook.Worksheets(1) rr& = 0 For Each comp In ThisWorkbook.VBProject.VBComponents If comp.Type = vbext_ct_MSForm Then For Each ctl In comp.Designer.Controls rr& = rr& + 1 ws.Cells(rr&, 1).Value = ctl.Name ws.Cells(rr&, 2).Value = ctl.Parent.Name ws.Cells(rr&, 3).Value = comp.Name ws.Cells(rr&, 4).Value = ctl.Caption Next ctl End If Next comp On Error GoTo 0 End Sub 但し、このコード、参照設定で「Microsoft Visual Basic For Application Extesibility xx」にチェックが必要です(jujuさん談より)。 |
みんとさん、こんばんは。 ごめんなさい。回答じゃないです。 他サイトでも、質問されていましたね。このようなことをマルチポストと言います。 一般的にダメよって感じになってます。こちらのサイトで色々と論議がありました。 http://www21.tok2.com/home/vbalab/bbs/c-board.cgi?cmd=one;no=879;id= http://www21.tok2.com/home/vbalab/bbs/c-board.cgi?cmd=ntr;tree=196;id= 参考までにこっちはOKになってますが、あっちはNGなので気を付けて下さいね。 先日、ある所で怒られてへこんでしまった私です。ルールを守っていないから、当たり前ですけどね。 |
▼ぴかる さん ご指摘ありがとうございます。 「マルチポスト」なる言葉さえ,知りませんでした。(滝汗) ほんとにありがとうございました。 過去ログも拝見しました。いろいろご意見があるんですね。 初心者だから知らないのか,知らないから初心者なのか・・・。 いずれにしても勉強不足でした。 個人的には「荒らしじゃないときは,許して!」という 感じですなんですが。(やっぱ,ダメですよね・・・。) 管理者さんをはじめ,不愉快な思いをさせてしまった方にはお詫びします。 申し訳ありません。 それで,私としては先に投稿したコチラに一本化したいと考えています。 どうか引き続きよろしくお願いいたします。 ▼ichinoseさん 私はエラーがでる行(caption取得の行)の次の行に「’(空白行)」を 入れるとうまくいきました。 正攻法ではないような気もしますが。 ところで,ユーザーフォームについても同様の処理をしたいのですが, やはりよく分かりません。 オンラインライブラリも,いまひとつ目的にたどり着けないし。 こちらもよろしくお願いします。 |
▼みんと さん こんばんは。 >ところで,ユーザーフォームについても同様の処理をしたいのですが, 先の私の投稿やひでさんのリンクは、ユーザーフォームのコントロールリストですよ。 「ユーザーフォームについても同様の処理」って何でしょう? |
▼ichinose さん えーっと,#31のコードだと,コントロールの一覧は取得できました。 でも,ユーザーフォームそのもの(たとえば,userform1のキャプションとか)は 取得できませんでした。 ユーザーフォームについても・・・ってのは,そういう意味だったんです。 言葉足らずでした。 ここまでできれば十分かもしれませんが,ユーザーフォームのキャプションも 拾えれば,一覧表もより見やすくなるかと。 1個や2個なら迷わないんですけど,4,5個ってユーザーフォームが増えると やっぱし,userform1では分かりにくいかも・・・と思ってます。 よろしくお願いします。 |
▼みんと さん: おはようございます。 >えーっと,#31のコードだと,コントロールの一覧は取得できました。 >でも,ユーザーフォームそのもの(たとえば,userform1のキャプションとか)は >取得できませんでした。 >ユーザーフォームについても・・・ってのは,そういう意味だったんです。 >言葉足らずでした。 > >ここまでできれば十分かもしれませんが,ユーザーフォームのキャプションも >拾えれば,一覧表もより見やすくなるかと。 >1個や2個なら迷わないんですけど,4,5個ってユーザーフォームが増えると >やっぱし,userform1では分かりにくいかも・・・と思ってます。 > >よろしくお願いします。 そういう意味でしたか。すみません、読解力ないもので・・・。 コンポーネントのプロパティにPropertiesというのがあります。 '==================================================================== Sub test() Dim compo As VBComponent Dim ctl Dim ws As Worksheet On Error Resume Next Set ws = ThisWorkbook.Worksheets(1) rr& = 0 For Each compo In ThisWorkbook.VBProject.VBComponents If compo.Type = vbext_ct_MSForm Then rr& = rr& + 1 ws.Cells(rr&, 1).Value = compo.Name ws.Cells(rr&, 2).Value = "" ws.Cells(rr&, 3).Value = "" ' ↑上2行は、空白を埋めときました ws.Cells(rr&, 4).Value = compo.Properties("caption") For Each ctl In compo.Designer.Controls rr& = rr& + 1 ws.Cells(rr&, 1).Value = ctl.Name ws.Cells(rr&, 2).Value = ctl.Parent.Name ws.Cells(rr&, 3).Value = compo.Name ws.Cells(rr&, 4).Value = ctl.Caption Next ctl End If Next compo On Error GoTo 0 End Sub これでどうでしょうか? |
>ichinoseさん 早朝からありがとうございます。 基本的な構造は#31と一緒なんですね。 Form毎に入れ子にするわけですよね? ところが,早速実施してみたところ, コンパイルエラー「ユーザー定義型は定義されていません。」 がでて,止まっちゃいます。 ココ→ Dim compo As VBComponent ちなみに当方,Excel2002,VBA6.0です。 なぜなんでしょう? 事前にさらに定義が必要なんでしょうか?? あと, If compo.Type = vbext_ct_MSForm Then とか,#31では If vbc.Type = 3 Then などで,Typeを確認してますよね。ichinoseさんのコードでは, Formかどうかのチェックをしてるというのはなんとなく分かるんですが, #31のほうは,検索しきれませんでした。(「3」が何を意味するのかが 分かりませんです。) オンラインのライブラリでも,たどり着けませんでした。 (たぶん,探し方の問題とは思いますが。) もう少しだけお付き合いいただけるとウレシイです。 |
▼みんと さん: こんにちは。 >早朝からありがとうございます。 >基本的な構造は#31と一緒なんですね。 >Form毎に入れ子にするわけですよね? > >ところが,早速実施してみたところ, >コンパイルエラー「ユーザー定義型は定義されていません。」 >がでて,止まっちゃいます。 >ココ→ Dim compo As VBComponent > >ちなみに当方,Excel2002,VBA6.0です。 >なぜなんでしょう? 事前にさらに定義が必要なんでしょうか?? >あと, > If compo.Type = vbext_ct_MSForm Then >とか,#31では > If vbc.Type = 3 Then >などで,Typeを確認してますよね。ichinoseさんのコードでは, >Formかどうかのチェックをしてるというのはなんとなく分かるんですが, >#31のほうは,検索しきれませんでした。(「3」が何を意味するのかが >分かりませんです。) >オンラインのライブラリでも,たどり着けませんでした。 >(たぶん,探し方の問題とは思いますが。) > >もう少しだけお付き合いいただけるとウレシイです。 この投稿での最初の私の投稿に入れておいたのですが、 但し、このコード、参照設定で「Microsoft Visual Basic For Application Extesibility xx」にチェックが必要です(jujuさん談より)。 ↑これを参照設定していないと、 >ココ→ Dim compo As VBComponent > If compo.Type = vbext_ct_MSForm Then でエラーになります。 参照設定しなくても、compoをObjectか、Variantで宣言したり、 「If compo.Type = 3 Then」 とすれば、大丈夫だと思いますが、しといた方がコードがはっきりするし、 "compo."と入力したときにメンバリストが表示されるので、便利です。 >3が何を意味するのかが分かりませんです 一緒ですよ。参照設定しているから、「vbext_ct_MSForm」という組み込み定数を使っているだけです。 |
▼ichinose さん: ついに,オレの考えてたとおりの結果を得ることが出来ましたっ! ありがとうございますっ! 最終的には参照設定で「Microsoft Visual Basic For Application Extesibility xx」にチェックをしなくても良いように,compo(vbc)をObjectで宣言することにしました。(最初,なぜか「参照設定」がグレイ表示になっていて,見つけられなかった!) 最後にもう少しだけ。 (1) 参照設定について 今回はチェックなしでも動くようにしましたが,「Microsoft Visual Basic For Application Extesibility xx」をチェックしてコーディングした場合に,そのファイルを他のPCで利用する場合には,ファイルを利用する他のPCでも,[ツール]→[参照設定]で設定する必要があるのでしょうか?(デフォルトではチェックされていませんよね? たぶん。) (2) VBComponent.Type = 3またはvbext_ct_MSForm VBComponent.Typeについてですが,詳しい解説はドコにあるのでしょう? HELPやオンラインライブラリではうまくひっかけられませんでした。 (VBComponent.Typeは1〜3までの整数で,3のときはuserformを意味して・・・云々というような解説があるとウレシイっす。) とりあえず,ちゃんと動くので分かんないままでもいいんですが,どうもスッキリしないので。(笑) ご存じでしたらよろしくお願いします。 (3) 最終的なコードについて おかげさまで狙ったとおりの結果を得るコーディングが出来ました。 丁寧にアドバイスしていただいた皆様には大変感謝しています。 それで,最終的なコードは,全文をココに掲載させていただいた方がよいのでしょうか? 基本的には#31(りんさん)のコーディングですが,+ichinoseさんのコーディング +オレの勝手なアレンジ(ちょこっとだけ)となりました。 自分で考えたコーディングならよかったのですが,人様のフンドシで・・・状態なので, どーなのかなぁ・・・と。 |
▼みんと さん: >ついに,オレの考えてたとおりの結果を得ることが出来ましたっ! >ありがとうございますっ! > >最終的には参照設定で「Microsoft Visual Basic For Application Extesibility xx」にチェックをしなくても良いように,compo(vbc)をObjectで宣言することにしました。(最初,なぜか「参照設定」がグレイ表示になっていて,見つけられなかった!) > >最後にもう少しだけ。 > >(1) 参照設定について >今回はチェックなしでも動くようにしましたが,「Microsoft Visual Basic For Application Extesibility xx」をチェックしてコーディングした場合に,そのファイルを他のPCで利用する場合には,ファイルを利用する他のPCでも,[ツール]→[参照設定]で設定する必要があるのでしょうか?(デフォルトではチェックされていませんよね? たぶん。) 完成されたマクロを含むブックで「Microsoft Visual Basic For Application Extesibility xx」を参照して保存した場合、他のPCで同じように「Microsoft Visual Basic For Application Extesibility xx」が用意されていれば、毎回設定を行う必要はありませんよ。 >(2) VBComponent.Type = 3またはvbext_ct_MSForm >VBComponent.Typeについてですが,詳しい解説はドコにあるのでしょう? >HELPやオンラインライブラリではうまくひっかけられませんでした。 >(VBComponent.Typeは1〜3までの整数で,3のときはuserformを意味して・・・云々というような解説があるとウレシイっす。) >とりあえず,ちゃんと動くので分かんないままでもいいんですが,どうもスッキリしないので。(笑) ご存じでしたらよろしくお願いします。 普通にインストールしていれば、 C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\1041\Vbob6.chm にVbprojectの解説があります。 > >(3) 最終的なコードについて >おかげさまで狙ったとおりの結果を得るコーディングが出来ました。 >丁寧にアドバイスしていただいた皆様には大変感謝しています。 >それで,最終的なコードは,全文をココに掲載させていただいた方がよいのでしょうか? >基本的には#31(りんさん)のコーディングですが,+ichinoseさんのコーディング >+オレの勝手なアレンジ(ちょこっとだけ)となりました。 >自分で考えたコーディングならよかったのですが,人様のフンドシで・・・状態なので, >どーなのかなぁ・・・と。 他の方のコードを読むのが一番面倒?で勉強になりますから、是非、お願いします。 私の考えですが・・・。 |
ひでさん,ぴかるさん,ichinoseさん,りんさん,管理者さん, ありがとうございました。 おかげで,問題は解決しました。 特にichinoseさん,丁寧なコメントありがとうございました。 んもう,飛んで行って,ちゅーしたいくらい感謝です。(爆) で,今回の最終的なコードを紹介させていただきます。 元ネタは#31のりんさんのコードです。 それにichinoseさんからいただいたアドバイスを加えしました。 一週間後には忘れていそうなので,あちこちコメントを加えました。 (ハズしてるコメントがあれば指摘してください! お願いします。) 目的:workbook中のユーザーフォームおよびそれに含まれるコントロールの 所属するフォーム,親(所属),コントロール名,キャプションの 一覧表を新しいworkbookに書き出す。 コード: Sub DisplayObjects() 'ブック内のユーザーフォーム,コントロール一覧を取得する。 '取得した一覧を新しいブックに記録する。 Dim vbcs As Object, vbc As Object, ctl As Object Dim wb As Workbook Dim ws As Worksheet Dim RR& 'データを格納する行番号 ' Set wb = ActiveWorkbook 'チェックの対象は現在表示しているブック Set vbcs = wb.VBProject.VBComponents Set ws = Workbooks.Add.Worksheets(1) ws.Columns.ColumnWidth = 15 '見やすくするためセル幅を大きくする '抽出結果を表示するワークシートに項目名をつける RR& = 1 ws.Cells(RR&, 1).Value = "ブック名" ws.Cells(RR&, 2).Value = wb.Name RR& = RR& + 1 ws.Cells(RR&, 1).Value = "フォーム名" ws.Cells(RR&, 2).Value = "親(所属)" ws.Cells(RR&, 3).Value = "コントロール" ws.Cells(RR&, 4).Value = "キャプション" For Each vbc In vbcs If vbc.Type = 3 Then 'ユーザーフォームの情報を取得 RR& = RR& + 1 ws.Cells(RR&, 1).Value = vbc.Name ws.Cells(RR&, 4).Value = vbc.Properties("caption") For Each ctl In vbc.Designer.Controls 'ユーザーフォーム内のコントロールの情報を取得 RR& = RR& + 1 On Error Resume Next ws.Cells(RR&, 1).Value = vbc.Name ws.Cells(RR&, 2).Value = ctl.Parent.Name ws.Cells(RR&, 3).Value = ctl.Name ws.Cells(RR&, 4).Value = ctl.Caption Next End If Next ws.Parent.Saved = True Set ws = Nothing: Set wb = Nothing Set vbcs = Nothing End Sub とこんな感じになりました。 今後もいろいろとお世話になると思います。よろしくお願いします。 (早く回答する方に回りたいなぁ・・・。) |