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

締切り済みの質問

StringのVariant型とは?

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

宜しくお願い致します。

投稿日時 - 2018-06-07 17:00:32

QNo.9506027

暇なときに回答ください

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

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

回答(5)

ANo.5

専門の方には「違う」と怒られそうですが、こう考えるとわかりやすいんじゃないでしょうか。

「StringのVariant型」とは、「Variant型」の変数に「Stringの値」が入ってるということだと。

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

投稿日時 - 2018-06-11 07:50:59

お礼

有難う御座います。
chie65535さんの説明と貴方の説明と合わせて見ると、自信はないが、納得出来る気がします。

他お二人が少し違った説明をされている様なので、それも理解しないと、答えは出せませんが。
もう少し頑張ります。

投稿日時 - 2018-06-29 15:14:43

ANo.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関数等では文字列操作しかしないので
バリアント型(文字を使用) を与える必要があります

投稿日時 - 2018-06-08 12:44:56

お礼

御回答に感謝致します。

投稿日時 - 2018-06-29 14:50:38

ANo.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クラスと同じ挙動のクラスを書くことは出来ません。あくまで考え方としてとらえてください。
 

投稿日時 - 2018-06-08 00:23:22

ANo.2

left関数の戻り値がVariant型になっているのは「Null文字列を指定した時にNullが返ってくるから」です。

Varriant型になっていれば「StringやNullを返す事が出来る」のです。

StringとNullは「並列」ですからね。

逆に言うと「Nullを返す必要があるから、戻り値がVariant型になっている」のです。

因みに「Left$(~~~,~~~)」のように、関数名に$を付けると、明示的に戻り値がString型になります(Nullを与えてもLeft$関数はNullを返せません)

正確に言うと「Left関数はVariant型の戻り値を返し、戻り値の内容はStringまたはNullになる」なのです。

それを簡潔に「StringのVariant型で返す」と表記しているのです。

投稿日時 - 2018-06-07 23:39:51

お礼

有難う御座います。
簡潔で分かり易い説明でした。

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

投稿日時 - 2018-06-29 15:01:46

ANo.1

 StringもVariantも、型という意味では、構文上は並列な言葉です。
 ただ、Variant型は、非常に特殊な型です。この型には、いかなる型のデータでも代入できます。普通の型は、Stringであれば、文字列しか代入できません。

 とっても便利に使えることが多いですが、この特殊性故に困ることがあります。数字と文字列の解釈です。Variant型に、12345というデータを入れたとします。これが、数値なのか文字列なのかで、+演算子の挙動が変わります。(足し算か、文字列連結か?)システムには、プログラマの「意図」はわかりませんから、このような場合、文字列で代入されていれば文字列として、数値として代入されていれば数値として実行します。
 つまり、Variant型にどんな型として代入されたかをシステムは知っておく必要がありますし、関数の定義でもちゃんと区分をしておく必要があります。そのため、Variant型は、varType関数で中に入っているデータがどんな型かを識別することが出来ます。

 今回のLeft関数の戻り値は、型はVariantで、中に入っているデータはStringとして扱うと規定されています。(つまり、二つのLeft関数の戻り値が、1と2だったとすると、+の結果は、12になると言うことです。3ではありません。)
 これを称して、StringのVariant型とか、Variant(内部表現はString)とか表記します。

投稿日時 - 2018-06-07 19:27:02

補足

御回答感謝致します。

投稿日時 - 2018-06-07 19:44:59

お礼

>つまり、二つのLeft関数の戻り値が、1と2だったとすると、+の結果は、12になると言うことです。3ではありません。
Range("A1").Value = Left("1あ", 1) + Left("2あ", 1)
仰っているのは、こういう事ですか。

>型はVariantで、中に入っているデータはStringとして扱うと規定されています。
この文がどうも理解出来ている気がしない。
数字も文字列と認識させれば計算出来ない等は解るのですが。。。
Left関数自体はVariant,関数内の文字列式はStringとして返されるという事でしょうか。。。

投稿日時 - 2018-06-07 19:44:30

あなたにオススメの質問