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

解決済みの質問

vbaで配列に値を格納する場合

vbaで配列に値を格納する場合
変数の宣言はどちらを使った方が良いのでしょうか?

Sub Sample1()
Dim i As Long
Dim myStr As String
Dim tmp() As String

myStr = "a,i,u,e,o"
tmp = Split(myStr, ",")
End Sub


Sub Sample1()
Dim i As Long
Dim myStr As String
Dim tmp As Variant

myStr = "a,i,u,e,o"
tmp = Split(myStr, ",")
End Sub

でも問題なく動くのですが、
Variant型での宣言はあまりしない方が良いですか?

あと
Dim tmp() As String
ならエラーにならないのですが
Dim tmp As String
だとエラーになってしまう理由がよくわからないので教えて頂けますか?

投稿日時 - 2013-03-08 20:39:09

QNo.7983309

困ってます

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

>Variant型での宣言はあまりしない方が良いですか?

配列の場合は、Variant型で構わないですね。
数値で、Long型とかは決めておいたほうが、若干スピードが速いです。
概ね、データ型を決めておく理由は、省メモリからの理由です。Variant型は、String型から、Object型まだ何でも入るので、それだけ器が大きいわけです。初心者は、あまり、データ型にこだわると、まともなコードが書けなくなってしまいますから、ある程度上達してからのほうがよいです。何も考えないで、Integer型を変数に付けるほうが、エラーの度合いが高くなることもあります。

Dim tmp() As String
大量のデータを入れて、省メモリを考えるなら、最初に、データ型を決めればよいのですが、今どき、そこまで気を回す必要は今はないと思います。

Variant 型というのは、受け皿は何でもよいという意味です。

例えば、こんなスタイルなら、Variant 型のみのはずです。
この場合、内部が全部文字型とは限らないのです。
Split関数と同じように、Array関数も同じように配列を生成するのに使用します。

Sub Sample2()
Dim tmp As Variant
tmp = Array("a", "i", "u", "e", "o")
End Sub

>Dim tmp() As String
>ならエラーにならないのですが
>Dim tmp As String
>だとエラーになってしまう理由

String型と決まっている場合で、配列なら、配列の文字列型で、「tmp() As String」と表しますが、「tmp As String」は、単なる文字列という意味ですから、入れ物が違います。

投稿日時 - 2013-03-08 23:55:00

お礼

どうもありがとうございました。

投稿日時 - 2013-03-09 08:18:26

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

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

回答(3)

ANo.2

一応VBでプログラミングしていますが、ほかに回答してる方が居ないので
分る範囲で答えます。
Variant型での宣言はあまりしない方が良いですか?
 これは文字列でも、数値でも受け入れる変数だったっと思います。
 ですから、この変数にどんな書式の物が入っているか、区別できるほうが良いと思います。
 
Dim tmp As String
 tmpは文字を扱う宣言ですね

Splitは使ったことないし、今ヘルプに繋がらない状態なので良く分りませんが、
  入力していくと「vbBinaryCompare」が出てきます、バイナリー書式との比較と言うことらしいです。
 だとすれば Dim tmp As String とは書式が一致しないのでエラーになると思います。

Dim tmp() As String
 これは使ったことがないので分りませんが、エラーにならないと言うことは、Variant型と同様なのかもしれません。

良く分らないのに、こんな回答で申し訳ありません。

投稿日時 - 2013-03-08 22:17:43

お礼

どうもありがとうございました。

投稿日時 - 2013-03-09 08:18:23

ANo.1

Variant型は代入の際に型を自動的に判断して処理してくれる(その分パフォーマンスは落ちます)ので便利な反面、
あいまいさが仇となってバグの原因になりやすく、
型がわかりにくくなるのでデバッグするのにも苦労します。
ですから扱う型がわかっているのであれば、
Variantを使わずにきちんと適切な型を指定した方がよいでしょう。


宣言の際、変数名の後ろにかっこをつけると配列として扱われます。
 Dim tmp() As String 'String型の配列
 Dim tmp As String 'String型の変数

SplitはString型の配列を返す関数なので、
戻り値はString型の配列(一応Variant型の変数も可)に格納する必要があります。
そのため、
 Dim tmp As String 'String型の変数
 tmp = Split(myStr, ",") '「String型の変数」に「String型の配列」を代入?
とするとエラーになります。

投稿日時 - 2013-03-08 21:46:37

お礼

ありがとうございました。

投稿日時 - 2013-03-15 23:06:47

あなたにオススメの質問