• 締切済み

StringのVariant型とは?

Left関数等StringのVariant型で返すと有りました。 StringとVariantはデータ型として並列な物だと思っていましたが、違うのですか。 StringのVariant型とは何ですか。 宜しくお願い致します。

みんなの回答

回答No.5

専門の方には「違う」と怒られそうですが、こう考えるとわかりやすいんじゃないでしょうか。 「StringのVariant型」とは、「Variant型」の変数に「Stringの値」が入ってるということだと。 IntegerやSingle、あるいはString型の変数は、もちろんその型の値しかとれませんけど、Variant型だけは、あらゆる「値」をとることができ、この場合は「型」としてはVariant型だけど、「値」としてはStringだってことですね。 釈迦に説法とは思いますが、型が箱、値が中身という初心者向けのアナロジーの応用です。自分、基本初心者なので、そういう理解をしてます。で、いつも専門の人に怒られる、と。(^。^;)

noname#233045
質問者

お礼

有難う御座います。 chie65535さんの説明と貴方の説明と合わせて見ると、自信はないが、納得出来る気がします。 他お二人が少し違った説明をされている様なので、それも理解しないと、答えは出せませんが。 もう少し頑張ります。

  • hahaha8635
  • ベストアンサー率22% (800/3610)
回答No.4

データ型の概要 https://msdn.microsoft.com/ja-jp/vba/language-reference-vba/articles/data-type-summary int では2バイト longでは4バイト 文字列型(可変長)では10バイト+文字列の長さ Variant型は中に何を入れるかで必要バイト数が変わり バリアント型(数値を使用)  では 16バイト バリアント型(文字を使用)  では 22 バイト + 文字列長 のメモリが必要です バリアント型(数値を使用)  では 16バイト では 16バイトで 俺は数値だ中身の数値 を表します バリアント型(文字を使用)  では 22 バイト + 文字列長 22バイトで俺は文字列だ文字列はこんだけだ としめし あとは文字列 が格納されます 演算子があった場合 俺は○○だをバリアントだと認識して内部で型変換してくれるので http://excelmath.atelierkobato.com/variant/ 文字列 + 数値 の足し算 をしてくれます Left関数等では文字列操作しかしないので バリアント型(文字を使用) を与える必要があります

noname#233045
質問者

お礼

御回答に感謝致します。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.3

>Left関数自体はVariant,関数内の文字列式はStringとして返されるという事でしょうか。。。  じゃ、あくまで考え方としてですが・・・  Variantは、クラスだと考えてください。  メンバーとして、各種の基本型毎に値が入るフィールドが用意されています。(例えば、_valueString as Srtingとか、_valueInt as Integerとか・・・)  そして、どのフィールドが利用されているかを表す、つまり、どの型の値が入っているかを示すフラグ _varTypeも用意されています。  varTypeという関数が有り、このフィールドを調べることが出来ます。  さて、この_varTypeですが、Variantに値が代入された時に、内容が決定されます。  Stringが代入されれば_varTypeもStringとなりますし、integerが代入されれば_varTypeもintegerになります。何も代入されていないと特殊な値NULLとなります。  そして、Variantに対する全ての演算(内容の参照も含みます。)はオーバーライドされていまして、その挙動は、_varTypeの値に従い、その型としての挙動をとります。Variant変数に代入された場合は、_varTypeの値も一緒にコピーされます。  だから、使う時も、実は、中身に何が入っているのか?何を入れたのかを意識して使う必要があると言うことです。あまりに、無茶な使い方をすると型が違うと文句を言われる羽目になります。数学関数のsinの引数に文字列"abc"の入ったVariantを渡しちゃいけませんよね?極端に言えばそういうことです。  今回のLeft関数の戻り値は、_varTypeがStringになっているVariantですよと、そういう意味です。  実際に、自分で作るプログラム上でも、このvarType関数を利用して、Variantの中身の型に応じてプログラムの挙動を変更することも可能です。  現実には、Variantは基本型として実装されています。実際にVariantクラスと同じ挙動のクラスを書くことは出来ません。あくまで考え方としてとらえてください。  

回答No.2

left関数の戻り値がVariant型になっているのは「Null文字列を指定した時にNullが返ってくるから」です。 Varriant型になっていれば「StringやNullを返す事が出来る」のです。 StringとNullは「並列」ですからね。 逆に言うと「Nullを返す必要があるから、戻り値がVariant型になっている」のです。 因みに「Left$(~~~,~~~)」のように、関数名に$を付けると、明示的に戻り値がString型になります(Nullを与えてもLeft$関数はNullを返せません) 正確に言うと「Left関数はVariant型の戻り値を返し、戻り値の内容はStringまたはNullになる」なのです。 それを簡潔に「StringのVariant型で返す」と表記しているのです。

noname#233045
質問者

お礼

有難う御座います。 簡潔で分かり易い説明でした。 理解に当り、String型の戻り値を復習したかったのですが、、、 おそらく、StringはNullでなく空の文字列しか返せなかったと思うのですが、、、 参考となる情報源が見つかりませんでした。少し、悔しいです。

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 StringもVariantも、型という意味では、構文上は並列な言葉です。  ただ、Variant型は、非常に特殊な型です。この型には、いかなる型のデータでも代入できます。普通の型は、Stringであれば、文字列しか代入できません。  とっても便利に使えることが多いですが、この特殊性故に困ることがあります。数字と文字列の解釈です。Variant型に、12345というデータを入れたとします。これが、数値なのか文字列なのかで、+演算子の挙動が変わります。(足し算か、文字列連結か?)システムには、プログラマの「意図」はわかりませんから、このような場合、文字列で代入されていれば文字列として、数値として代入されていれば数値として実行します。  つまり、Variant型にどんな型として代入されたかをシステムは知っておく必要がありますし、関数の定義でもちゃんと区分をしておく必要があります。そのため、Variant型は、varType関数で中に入っているデータがどんな型かを識別することが出来ます。  今回のLeft関数の戻り値は、型はVariantで、中に入っているデータはStringとして扱うと規定されています。(つまり、二つのLeft関数の戻り値が、1と2だったとすると、+の結果は、12になると言うことです。3ではありません。)  これを称して、StringのVariant型とか、Variant(内部表現はString)とか表記します。

noname#233045
質問者

お礼

>つまり、二つのLeft関数の戻り値が、1と2だったとすると、+の結果は、12になると言うことです。3ではありません。 Range("A1").Value = Left("1あ", 1) + Left("2あ", 1) 仰っているのは、こういう事ですか。 >型はVariantで、中に入っているデータはStringとして扱うと規定されています。 この文がどうも理解出来ている気がしない。 数字も文字列と認識させれば計算出来ない等は解るのですが。。。 Left関数自体はVariant,関数内の文字列式はStringとして返されるという事でしょうか。。。

noname#233045
質問者

補足

御回答感謝致します。

関連するQ&A