こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルVBA、テイストボックス&ラベル

いつもお世話になります。

エクセルのセルをcells(n,1)としてfor文を使うように、VBAのフォームのテイストボックスやラベル(10個ぐらい)に番号をつけてfor文を使いたいのですが、可能でしょうか?

またfor文以外に順繰りに変数に代入できるでしょうか?

現状
a1=textbox1
・・・
a10=textbox10と全部書かなければならないのを何とかしたいのです。

宜しくお願いします。

投稿日時 - 2004-09-23 16:15:36

QNo.1013587

すぐに回答ほしいです

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

えー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だけで判断させるのも問題でしょうが。


あとまぁ質問者さんの仰るとおり、こういう形でコードに美しさを求めてしまうと、後で見直す時やデバックする際に何をしているのかパッと見で分かりにくくなったりしますので、最初にあげた通り、多少泥臭くても最初に宣言させている方が結果的には分かりやすくなったりします。

投稿日時 - 2004-09-23 20:14:45

お礼

度々の回答有難うございます。

できました(^^)/
Controlsの意味がいまいち分かりませんが(正確に言うと全部よう分からん)、こんなもんかという事で使わせて頂きます。

>こういう形でコードに美しさを求めてしまうと、後で見直す時やデバックする際に何をしているのかパッと見で分かりにくくなったりしますので

’つけて分かりやすくしたいと思います。

有難うございました。

投稿日時 - 2004-09-24 11:52:01

ANo.5

このQ&Aは役に立ちましたか?

6人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

 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を掲載しておきます。同じ回答だから参考にならないかもしれませんが(笑)。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1007663

投稿日時 - 2004-09-23 21:03:58

お礼

回答有難うございます。

素晴らしいです。
今まで一個ずつ書いてたのが・・・です。

>Controls("textbox" & i)

意味分からんけどカッコよろしいな~、っていうことで使わせて頂きます。

投稿日時 - 2004-09-24 11:56:08

ANo.4

>セルにテキストボックスの値を入れているのですが、
入れるセルがセル上のある文字(値)に対応しているので、行挿入等でマクロが対応できなくなってしまうのを避けたかったのです。


私には、セルに直接入力せずにテキストボックスに入れなければならない場面が想像できませんが、確かに、そういうことを考えると、配列にしたいですね。

簡単にはできない、というだけで、詳しい方だったら、方法をご存じかもしれません。お役に立てず、ゴメンナサイ。

投稿日時 - 2004-09-23 19:43:42

お礼

何度もすいません。

>私には、セルに直接入力せずにテキストボックスに入れなければならない場面が想像できませんが、確かに、そういうことを考えると、配列にしたいですね。

確かにそうなんですけど、セルの入力場所を探す手間を省けないかなと思ったしだいです。

後は知識的に今後役立ちそうなんで。。。

有難うございました。

投稿日時 - 2004-09-23 19:52:42

ANo.3

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*"とか

投稿日時 - 2004-09-23 19:35:10

お礼

再度の回答有難うございます。

ヴゥ、色々あるんですね~。
知ってる人には簡単なんでしょうね~。
一度試してみます。

>まぁ上の例文だと全てのコントロールがCに入ってしまうので条件でtextboxだけ抽出したりの工夫が必要でしょうが。
分かりやすい方法だったら例えば
if C.name like "TextBox*"とか

は、さっぱりです。

有難うございました。

投稿日時 - 2004-09-23 19:46:17

ANo.2

VisualBasicでは、テキストボックスやラベルを配列にして、textbox(i)などという事ができますが、

VBAでは出来なかったと思います。マクロ作成時だけなので、諦めて全部書くのが早いと思います。(面倒ですが)

投稿日時 - 2004-09-23 19:12:09

お礼

回答有難うございます。

セルにテキストボックスの値を入れているのですが、
入れるセルがセル上のある文字(値)に対応しているので、行挿入等でマクロが対応できなくなってしまうのを避けたかったのです。

投稿日時 - 2004-09-23 19:25:55

ANo.1

簡単な方法としては配列を使う。

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高度に処理する方法もありますが、最初のうちはこんな感じの方法からやっていけば良いんでないかと。

投稿日時 - 2004-09-23 18:46:36

お礼

回答有難うございます。

最初に宣言しておけばいいわけですね。了解です。
ただ、やはり宣言時に手間がかかるわけですね。


>もっと美しくw高度に処理する方法も

教えてほしいのですが、出来ますでしょうか?
宜しくお願いします。

投稿日時 - 2004-09-23 19:13:42

あなたにオススメの質問