• ベストアンサー

VBAでコントロール配列を持つことは可能ですか?

Excel2002、OSはXPです。 VBではコントロールに配列を持つことが出来ましたが、 VBAでコントロール配列を持つことは可能でしょうか? やりたいことはユーザーフォームにラベルを100個ぐらい貼り付けて、 テキストボックス入力した値がCell(i,1)と等しければ、 i番目のラベルのCaptionに文字を入力したい。という感じです。 もしVBのようにコントロール配列を持てれば、 If TextBox1.text=Cells(i,1) Then Label(i).Caption="~~" という風に出来るのですが、どうも配列の設定がVBのようにできません。 プロパティにINDEXが無いですし、オブジェクト名を同じにしたら エラーとなってしまいますし。。 もし出来ないのであれば、何か回避策のようなものはないでしょうか? 力技で100個IFを書けば出来ることは出来るのですが・・ If TextBox1.text=Cells(i,1) Then If i = 1 Then Label1.Caption="~~" ElseIf i=2 then Label2.Caption="~~" ・・・・

質問者が選んだベストアンサー

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

通常、Excelのユーザーフォームのコントロールは、全体が、Controls コレクションですから、そこから、Index を取る方法もありますが、私などは、 For i =1 to 3   Me.Controls("Label" & i).Caption = "~~" Next としていますね。 ただ、Lable自体のカウントは、その中からでは出来ないはずで、Controls全体のカウントになってしまうので、その中で、  If Me.Controls(i).Name Like "Label*" Then などと、無駄なコードを使ってしまいますね。

kikei
質問者

お礼

回答ありがとうございます。 こちらの方法でもうまくいきました。 こちらの場合は特に定義する必要も無いので 簡単でいいですね。 ただ最後の4行がちょっと意味が分からないのですが。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんばんは。 Controls は、1つのコレクションですから、その中から検索するということになってしまいますね。 自分で作成したのだから、Label の数がわかってはいるものの、そこには、VBのような、Labelコントロール配列はできないので、Label.Count みたいなことが出来ませんね。 もしも、Controls のコレクションから、Labelだけを抜き出すのだったら、 Controls 全体からでしか出来ません。 For i =1 To Me.Controls(i).Count  If Me.Controls(i).Name Like "Label*" Then    Me.Controls(i).Caption = i  End if Next i なんていう、区分けしなければならない余計なコードが必要になってしまうって、いうことです。そのループの中で、Labelを、特別抜き出して、Collectionオブジェクトで別のコレクション化させることは可能ですが、CommandButton, Label等それぞれをグループ化するほどExcelのVBAの作業は要求されません。 VBAでは、あまり手を加えずに、そのまま、Controls コレクションのまま使うのが良いと、私は思っています。

kikei
質問者

お礼

なるほど、とても丁寧に説明していただきありがとうございます!

  • rio_d
  • ベストアンサー率47% (71/149)
回答No.2

こんばんは。 では、簡単な方法で。 Sub なんちゃら()   Dim ctlLabel(100) As Object   Set ctlLabel(1) = Me.Label1   Set ctlLabel(2) = Me.Label2     :        :     :        :   If TextBox1.text=Cells(i,1) Then     ctlLabel(i).Caption="~~"   End If End Sub Subがたくさんある場合は、Globalで宣言してもいいとは思います。メモリ食いそうですがw ダメだったらごめんなさい。

kikei
質問者

お礼

回答ありがとうございます。 教えていただいた方法でうまくいきました。 As Objectという定義は初めて知りました。 結構使えそうですね。

回答No.1

下のURLに「擬似コントロール配列の作成」について説明がありますので、ご覧になってください。

参考URL:
http://www.moug.net/skillup/opm/opm08-01.htm
kikei
質問者

お礼

回答ありがとうございます。 そう簡単には対応できないみたいですね。 じっくり読んでみます。