- 締切済み
VBAで変数の値をセルに表示させる
VBAで変数の値をセルに表示させる プログラム初級者です。 配列変数を使わずに 例えば、変数a1,a2・・・a10 の10個の変数を使ってセルにその値を表示する場合に a1,a2・・・a10をfor next を使って、省略化するにはどうすればよいでしょうか? 具体的には例えば、(私が書いたのは) Sub aaa() Dim a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 as Integer Dim i as Integer a1=1 a2=2 a3=3 a4=4 a5=5 a6=6 a7=7 a8=8 a9=9 a10=10 For i = 1 to 10 ax= "a" & str(i) Cells(i, 1).value = ax Next End sub() 結果は a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10 と表示されました。 a1と文字列をとってそれを変数と見なしさらにその変数の値を表示させたいのです。 ちなみにaxの値はa 1 とaと1の間に半角スペースが入ってしまいます。 どうすればいいか行き詰まっています。 解決方法はあるでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
>配列変数を使わずに >例えば、変数a1,a2・・・a10 基本的には、個別に変数をいれたものは、VBAだけの範疇では、名前の文字列を、変数自体に変換して取り出すことは、私の知っている範疇では不可能です。たぶん、メモリのアドレスが取れれば取れるは思いますが、VBAの範疇ではないと思います。 配列変数を知っていて、配列変数を使わないということですか?なぜ、配列変数を使わないのか、理由が分かりません。配列変数も初級の範疇です。 もし、実務で使うなら、もっと具体的なものでないと回答にはなりません。 外部オブジェクトで取るというなら別かもしれませんが、コレクションでも、オブジェクトでも、いわゆるIndex(添字)の構造を持ったのを用意すれば方法はあるけれども、改めて値を入れなおさないといけません。しかし、コレクションとかオブジェクト使うというのは、この程度ではわずかですが、結果的には、オーバーヘッドが掛かります。 >ax= "a" & str(i) 変数を文字列としても、それは別ものです。それに、"str 関数"は、Str 関数でしょうけれど、負の符号のスペースが用意されていますから、正の時は、符号分がワンスペースあきます。通常は、CStr関数を使います。 それに、 Dim a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 As Integer VBAでは、こういう書き方はしません。a1--a9 まで、Variant になります。 a10 だけが、Integer になります。このように個別に書かなくてはいけません。 Dim a1 As Integer, a2 As Integer, a3 As Integer, a4 As Integer, a5 As Integer ・・・・・ それに、最後の End Sub() という、()は不要です。 配列ですべきですね。動的配列にするのか、配列を固定にするかはどちらでもよいですが、型が決まっているなら、String型とか、Long型にしますが、あれこれ面倒なら、Dim (1000) As Long としてしまいます。しかし、代入されていないものを判別したりする場合は、Variant 型にして、代入されている場合と、Empty値を区分けします。 もう一度、最初から、変数の値の代入部分かから、考え直したほうが良いのではないでしょうか?
- 374649
- ベストアンサー率38% (203/527)
質問者は Dim a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 as Integer と定義しているのに ax= "a" & str(i) でわざわざ文字(string型)に変換しているのでaxには"a 1"という文字の値が代入されて結果,書き込みの表示になるのです、axを数値型に後で変換することは"a 1"という文字コードを数値で取り出すことになります。 失礼ですが、基本的なデータ型を学んでください。 ax=a+val(i) として数値型(Integer)を崩さなければ(ai)に代入された値をaxに入れる事が出来るのではないでしょうか。 Sub aaa() Dim a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 As Integer Dim i As Integer a1 = 1 a2 = 2 a3 = 3 a4 = 4 a5 = 5 a6 = 6 a7 = 7 a8 = 8 a9 = 9 a10 = 10 For i = 1 To 10 ax = a + Val(i) Cells(i, 1) = ax Next End Sub
配列を使う代わりに、コレクション(ここでは仮に「acol」という名にしています)を宣言すると、以下のようなプログラムになり、正しい実行結果が得られます。 Sub aaa() Dim a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 As Integer Dim i As Integer Dim acol As New Collection a1 = 1 a2 = 2 a3 = 3 a4 = 4 a5 = 5 a6 = 6 a7 = 7 a8 = 8 a9 = 9 a10 = 10 acol.Add (a1) acol.Add (a2) acol.Add (a3) acol.Add (a4) acol.Add (a5) acol.Add (a6) acol.Add (a7) acol.Add (a8) acol.Add (a9) acol.Add (a10) i = 1 For Each ax In acol Cells(i, 1).Value = ax i = i + 1 Next End Sub
- kmetu
- ベストアンサー率41% (562/1346)
配列変数を使わないと言うことなので 以下のような感じでいかがですか Dim a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 As Integer Dim mdic As Object, i As Long Set mdic = CreateObject("Scripting.Dictionary") mdic.CompareMode = vbTextCompare mdic("a1") = 1 mdic("a2") = 2 mdic("a3") = 3 mdic("a4") = 4 mdic("a5") = 5 mdic("a6") = 6 mdic("a7") = 7 mdic("a8") = 8 mdic("a9") = 9 mdic("a10") = 10 For i = 1 To 10 Cells(i, 1).Value = mdic("a" & i) 'Cells(i, 1).Value = mdic("a" & Format(i, "####"))'とか Next ただ配列を使うと以下のようにかなり短いコードに出来ますが… Dim a(10) As Integer Dim i As Long For i = 1 To 10 a(i) = i Next For i = 1 To 10 Cells(i, 1).Value = a(i) Next 多分例なので無意味な変数代入があるのだと思いますが、実際は For i = 1 To 10 Cells(i, 1).Value = i Next で終わるコードですよね。 > ちなみにaxの値はa 1 > とaと1の間に半角スペースが入ってしまいます。 これはstrのHELPを見てください理由が分かります。
- kybo
- ベストアンサー率53% (349/647)
そういうことがしたいなら、変数の宣言から変えないといけません。 以下のようにします。 Sub aaa() Dim a(1 To 10) As Integer Dim i As Integer a(1) = 1 a(2) = 2 a(3) = 3 a(4) = 4 a(5) = 5 a(6) = 6 a(7) = 7 a(8) = 8 a(9) = 9 a(10) = 10 For i = 1 To 10 Cells(i, 1).Value = a(i) Next End Sub