- ベストアンサー
エクセルVBA、テイストボックス&ラベル
いつもお世話になります。 エクセルのセルをcells(n,1)としてfor文を使うように、VBAのフォームのテイストボックスやラベル(10個ぐらい)に番号をつけてfor文を使いたいのですが、可能でしょうか? またfor文以外に順繰りに変数に代入できるでしょうか? 現状 a1=textbox1 ・・・ a10=textbox10と全部書かなければならないのを何とかしたいのです。 宜しくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
えー3番の補足ですが、 先に示したコードだとUserForm上のコントロール全てを取り込んでしまうので、例えばIF文でコントロール一つ一つについてそれがTextBoxなのかどうかの判別をさせる必要があるということです。 例えば下記コードだと For Each C In UserForm1.Controls If C.Name Like "TextBox*" Then Set a(i) = C i = i + 1 End If Next C そのコントロールのNameが"TextBox*"だったらTextBoxと見なします。 ※Nameだけで判断させるのも問題でしょうが。 あとまぁ質問者さんの仰るとおり、こういう形でコードに美しさを求めてしまうと、後で見直す時やデバックする際に何をしているのかパッと見で分かりにくくなったりしますので、最初にあげた通り、多少泥臭くても最初に宣言させている方が結果的には分かりやすくなったりします。
その他の回答 (5)
- mach999
- ベストアンサー率75% (36/48)
Excel VBAではコントロール配列はサポートされていませんが、テキストボックスの名前をtextbox1, textbox2,・・・ textbox10とすると、以下のコードでほぼ同じことを実現できます。 Sub テキストボックスの値をセルに入力() For i = 1 To 10 With UserForm1.Controls("textbox" & i) 'ここに各textboxに行いたい処理を書く。 '例えばtextboxの値をセルに入力したければ以下のような感じ。 Cells(1, i) = .Text End With Next i End Sub 以前にも同じような質問がありましたので参考としてURLを掲載しておきます。同じ回答だから参考にならないかもしれませんが(笑)。
お礼
回答有難うございます。 素晴らしいです。 今まで一個ずつ書いてたのが・・・です。 >Controls("textbox" & i) 意味分からんけどカッコよろしいな~、っていうことで使わせて頂きます。
>セルにテキストボックスの値を入れているのですが、 入れるセルがセル上のある文字(値)に対応しているので、行挿入等でマクロが対応できなくなってしまうのを避けたかったのです。 私には、セルに直接入力せずにテキストボックスに入れなければならない場面が想像できませんが、確かに、そういうことを考えると、配列にしたいですね。 簡単にはできない、というだけで、詳しい方だったら、方法をご存じかもしれません。お役に立てず、ゴメンナサイ。
お礼
何度もすいません。 >私には、セルに直接入力せずにテキストボックスに入れなければならない場面が想像できませんが、確かに、そういうことを考えると、配列にしたいですね。 確かにそうなんですけど、セルの入力場所を探す手間を省けないかなと思ったしだいです。 後は知識的に今後役立ちそうなんで。。。 有難うございました。
- popesyu
- ベストアンサー率36% (1782/4883)
1番です。 先のコードは dim a(1) as textbox dim a(1) as Object でないと動かないですね。 で例えばもう少し高度にやるとするなら Dim C As Object Dim a(1) As Object Dim i As Integer i = 0 For Each C In UserForm1.Controls Set a(i) = C i = i + 1 Next C 宣言の部分だってこんな感じでまとめたりできます。 まぁ上の例文だと全てのコントロールがCに入ってしまうので条件でtextboxだけ抽出したりの工夫が必要でしょうが。 分かりやすい方法だったら例えば if C.name like "TextBox*"とか
お礼
再度の回答有難うございます。 ヴゥ、色々あるんですね~。 知ってる人には簡単なんでしょうね~。 一度試してみます。 >まぁ上の例文だと全てのコントロールがCに入ってしまうので条件でtextboxだけ抽出したりの工夫が必要でしょうが。 分かりやすい方法だったら例えば if C.name like "TextBox*"とか は、さっぱりです。 有難うございました。
VisualBasicでは、テキストボックスやラベルを配列にして、textbox(i)などという事ができますが、 VBAでは出来なかったと思います。マクロ作成時だけなので、諦めて全部書くのが早いと思います。(面倒ですが)
お礼
回答有難うございます。 セルにテキストボックスの値を入れているのですが、 入れるセルがセル上のある文字(値)に対応しているので、行挿入等でマクロが対応できなくなってしまうのを避けたかったのです。
- popesyu
- ベストアンサー率36% (1782/4883)
簡単な方法としては配列を使う。 dim a(1) as textbox set a(0)=textbox1 set a(1)=textbox2 と最初に宣言しておいて for i=1 to 2 a(i-1).value=cells(i,1) next i もっと美しくw高度に処理する方法もありますが、最初のうちはこんな感じの方法からやっていけば良いんでないかと。
お礼
回答有難うございます。 最初に宣言しておけばいいわけですね。了解です。 ただ、やはり宣言時に手間がかかるわけですね。 >もっと美しくw高度に処理する方法も 教えてほしいのですが、出来ますでしょうか? 宜しくお願いします。
お礼
度々の回答有難うございます。 できました(^^)/ Controlsの意味がいまいち分かりませんが(正確に言うと全部よう分からん)、こんなもんかという事で使わせて頂きます。 >こういう形でコードに美しさを求めてしまうと、後で見直す時やデバックする際に何をしているのかパッと見で分かりにくくなったりしますので ’つけて分かりやすくしたいと思います。 有難うございました。