- ベストアンサー
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="~~" ・・・・
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
通常、Excelのユーザーフォームのコントロールは、全体が、Controls コレクションですから、そこから、Index を取る方法もありますが、私などは、 For i =1 to 3 Me.Controls("Label" & i).Caption = "~~" Next としていますね。 ただ、Lable自体のカウントは、その中からでは出来ないはずで、Controls全体のカウントになってしまうので、その中で、 If Me.Controls(i).Name Like "Label*" Then などと、無駄なコードを使ってしまいますね。
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 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 コレクションのまま使うのが良いと、私は思っています。
お礼
なるほど、とても丁寧に説明していただきありがとうございます!
- rio_d
- ベストアンサー率47% (71/149)
こんばんは。 では、簡単な方法で。 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 ダメだったらごめんなさい。
お礼
回答ありがとうございます。 教えていただいた方法でうまくいきました。 As Objectという定義は初めて知りました。 結構使えそうですね。
- GreatDragon
- ベストアンサー率46% (186/402)
下のURLに「擬似コントロール配列の作成」について説明がありますので、ご覧になってください。
お礼
回答ありがとうございます。 そう簡単には対応できないみたいですね。 じっくり読んでみます。
お礼
回答ありがとうございます。 こちらの方法でもうまくいきました。 こちらの場合は特に定義する必要も無いので 簡単でいいですね。 ただ最後の4行がちょっと意味が分からないのですが。