過去ログ

                                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と機能一覧を作成する」を応用するのかな?ってところまでは気付いたのですが・・・。

できれば,オブジェクト名,キャプションの他に,どのユーザーフォーム上にあるとか,マルチページのどのページとか,どのフレーム内にあるとかまで分かるとウレシイのですが・・・。(欲張りすぎでしょうか? 笑)

よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:コントロールのリストを取得したいのですが  ■名前 : ひで  ■日付 : 02/10/12(土) 18:34  -------------------------------------------------------------------------
   ▼みんと さん こんばんは

>はじめて投稿します。
>もしかして同様の質問が既に・・・と思い,検索してみましたが,うまくヒットしませんでした。もし,既出でしたら,ご指摘ください。

[#31] が参考になるのでは・・・
まとはずれだったらごめんなさい。
 ───────────────────────────────────────  ■題名 : Re:コントロールのリストを取得したいので...  ■名前 : みんと <kool_mint@anet.ne.jp>  ■日付 : 02/10/12(土) 19:03  -------------------------------------------------------------------------
   ▼ひで さん:

>[#31] が参考になるのでは・・・

なんかソレっぽい感じがします。
とにかく#31を研究してみます。
が,見慣れないコードがたくさん・・・。(>_<)

どーなるのか分からないので,まだ,
ありがとうございます!・・・とは言えないのですが,
コメントありがとうございました。

※その他にも情報があればよろしくお願いします!!
 ───────────────────────────────────────  ■題名 : スゴイ! ・・・でも  ■名前 : みんと  ■日付 : 02/10/12(土) 20:26  -------------------------------------------------------------------------
   ▼ひで さん

#31を試してみました!
ほとんど,オレの考えてたとおりの結果でした!
コードはまだ,よく分かってませんが・・・。(^^;)

ところが,captionを表示させようと思うとキチンと動きません。
コンボボックスのようにcaptionが無いものあるので,
エラートラップもしているのですが・・・。

注意点あるいは具体的な変更箇所など,教えていただけると
助かります。

よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:スゴイ! ・・・でも  ■名前 : ひで  ■日付 : 02/10/12(土) 20:34  -------------------------------------------------------------------------
   ▼みんと さん

>#31を試してみました!
>ほとんど,オレの考えてたとおりの結果でした!
>コードはまだ,よく分かってませんが・・・。(^^;)

>ところが,captionを表示させようと思うとキチンと動きません。
>コンボボックスのようにcaptionが無いものあるので,
>エラートラップもしているのですが・・・。

>注意点あるいは具体的な変更箇所など,教えていただけると
>助かります。

すいません、私もわかりませーん
ごめんなさい。

具体的なコードをのせると他の方々の回答が
つきやすくなると思うのですが。
 ───────────────────────────────────────  ■題名 : Re:スゴイ! ・・・でも  ■名前 : みんと  ■日付 : 02/10/12(土) 20:49  -------------------------------------------------------------------------
   ▼ひで さん

>具体的なコードをのせると他の方々の回答が
>つきやすくなると思うのですが。

アドバイスありがとうございます。
ここでの作法(?)がよくわからないので,#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までを読み込んで終了してしまいます。

どなたかよろしくご教授ください。
 ───────────────────────────────────────  ■題名 : Re:スゴイ! ・・・でも  ■名前 : ichinose  ■日付 : 02/10/12(土) 22:02  -------------------------------------------------------------------------
   ▼みんと さん:
▼ひで さん
こんばんは。
>>具体的なコードをのせると他の方々の回答が
>>つきやすくなると思うのですが。
>
>アドバイスありがとうございます。
>ここでの作法(?)がよくわからないので,#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さん談より)。
 ───────────────────────────────────────  ■題名 : ちょっと一言  ■名前 : ぴかる  ■日付 : 02/10/12(土) 22:08  -------------------------------------------------------------------------
   みんとさん、こんばんは。

ごめんなさい。回答じゃないです。
他サイトでも、質問されていましたね。このようなことをマルチポストと言います。
一般的にダメよって感じになってます。こちらのサイトで色々と論議がありました。
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なので気を付けて下さいね。
先日、ある所で怒られてへこんでしまった私です。ルールを守っていないから、当たり前ですけどね。
 ───────────────────────────────────────  ■題名 : 知りませんでした・・・。  ■名前 : みんと  ■日付 : 02/10/12(土) 23:42  -------------------------------------------------------------------------
   ▼ぴかる さん
ご指摘ありがとうございます。
「マルチポスト」なる言葉さえ,知りませんでした。(滝汗)
ほんとにありがとうございました。
過去ログも拝見しました。いろいろご意見があるんですね。
初心者だから知らないのか,知らないから初心者なのか・・・。
いずれにしても勉強不足でした。
個人的には「荒らしじゃないときは,許して!」という
感じですなんですが。(やっぱ,ダメですよね・・・。)

管理者さんをはじめ,不愉快な思いをさせてしまった方にはお詫びします。
申し訳ありません。

それで,私としては先に投稿したコチラに一本化したいと考えています。
どうか引き続きよろしくお願いいたします。

▼ichinoseさん
私はエラーがでる行(caption取得の行)の次の行に「’(空白行)」を
入れるとうまくいきました。
正攻法ではないような気もしますが。

ところで,ユーザーフォームについても同様の処理をしたいのですが,
やはりよく分かりません。
オンラインライブラリも,いまひとつ目的にたどり着けないし。
こちらもよろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:知りませんでした・・・。  ■名前 : ichinose  ■日付 : 02/10/12(土) 23:50  -------------------------------------------------------------------------
   ▼みんと さん
こんばんは。
>ところで,ユーザーフォームについても同様の処理をしたいのですが,
先の私の投稿やひでさんのリンクは、ユーザーフォームのコントロールリストですよ。
「ユーザーフォームについても同様の処理」って何でしょう?
 ───────────────────────────────────────  ■題名 : 説明不足でした。  ■名前 : みんと  ■日付 : 02/10/13(日) 0:20  -------------------------------------------------------------------------
   ▼ichinose さん

えーっと,#31のコードだと,コントロールの一覧は取得できました。
でも,ユーザーフォームそのもの(たとえば,userform1のキャプションとか)は
取得できませんでした。
ユーザーフォームについても・・・ってのは,そういう意味だったんです。
言葉足らずでした。

ここまでできれば十分かもしれませんが,ユーザーフォームのキャプションも
拾えれば,一覧表もより見やすくなるかと。
1個や2個なら迷わないんですけど,4,5個ってユーザーフォームが増えると
やっぱし,userform1では分かりにくいかも・・・と思ってます。

よろしくお願いします。
 ───────────────────────────────────────  ■題名 : Re:説明不足でした。  ■名前 : ichinose  ■日付 : 02/10/13(日) 7:13  -------------------------------------------------------------------------
   ▼みんと さん:
おはようございます。

>えーっと,#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

これでどうでしょうか?
 ───────────────────────────────────────  ■題名 : 動きません・・・。  ■名前 : みんと  ■日付 : 02/10/13(日) 13:06  -------------------------------------------------------------------------
   >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」が何を意味するのかが
分かりませんです。)
オンラインのライブラリでも,たどり着けませんでした。
(たぶん,探し方の問題とは思いますが。)

もう少しだけお付き合いいただけるとウレシイです。
 ───────────────────────────────────────  ■題名 : Re:動きません・・・。  ■名前 : ichinose  ■日付 : 02/10/13(日) 14:23  -------------------------------------------------------------------------
   ▼みんと さん:
こんにちは。
>早朝からありがとうございます。
>基本的な構造は#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」という組み込み定数を使っているだけです。
 ───────────────────────────────────────  ■題名 : ヤタッ!  ■名前 : みんと  ■日付 : 02/10/13(日) 17:30  -------------------------------------------------------------------------
   ▼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さんのコーディング
+オレの勝手なアレンジ(ちょこっとだけ)となりました。
自分で考えたコーディングならよかったのですが,人様のフンドシで・・・状態なので,
どーなのかなぁ・・・と。
 ───────────────────────────────────────  ■題名 : Re:ヤタッ!  ■名前 : ichinose  ■日付 : 02/10/13(日) 18:21  -------------------------------------------------------------------------
   ▼みんと さん:

>ついに,オレの考えてたとおりの結果を得ることが出来ましたっ!
>ありがとうございますっ!
>
>最終的には参照設定で「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さんのコーディング
>+オレの勝手なアレンジ(ちょこっとだけ)となりました。
>自分で考えたコーディングならよかったのですが,人様のフンドシで・・・状態なので,
>どーなのかなぁ・・・と。
他の方のコードを読むのが一番面倒?で勉強になりますから、是非、お願いします。
私の考えですが・・・。
 ───────────────────────────────────────  ■題名 : ありがとうございましたっ!  ■名前 : みんと  ■日付 : 02/10/14(月) 1:43  -------------------------------------------------------------------------
   ひでさん,ぴかるさん,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

とこんな感じになりました。
今後もいろいろとお世話になると思います。よろしくお願いします。
(早く回答する方に回りたいなぁ・・・。)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 200