dポイントプレゼントキャンペーン実施中!

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の間に半角スペースが入ってしまいます。

どうすればいいか行き詰まっています。
解決方法はあるでしょうか?

A 回答 (5件)

>配列変数を使わずに


>例えば、変数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値を区分けします。

もう一度、最初から、変数の値の代入部分かから、考え直したほうが良いのではないでしょうか?
    • good
    • 0

質問者は


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
    • good
    • 0

配列を使う代わりに、コレクション(ここでは仮に「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
    • good
    • 0

配列変数を使わないと言うことなので


以下のような感じでいかがですか

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を見てください理由が分かります。
    • good
    • 0

そういうことがしたいなら、変数の宣言から変えないといけません。


以下のようにします。

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
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A