[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『Variant型のメリットデメリット』(オレンジ)
Excelの汎用型であるVariant型ですが、Webページ上で見かけるソースの解説では
配列のようにRangeデータを保持するために多用されています。
しかし、Variant型の使用をよいと思っていない解説も多数見受けられます。
実際にVariant型を使用している方にお尋ねしたいのですが、
Variant型はどのような場合に使用しますか。
また、どのような点に注意すればよいでしょうか。
使われてない方にはVariant型の不使用の理由。他の方法を教えてくださればうれしいです。
< 使用 Excel:Excel2007、使用 OS:Windows7 >
余り体系的に勉強したわけではないので、間違ってたらご容赦ください。
ちなみに >配列のようにRangeデータを保持するために多用されています。 これ、出典先のURLか使用例を提示頂けますか?
>Variant型はどのような場合に使用しますか。 Variant型出なければいけないときに、使用します。
Sub test1()
Dim r() As Range
Dim v() As Variant
'Variant型の動的配列なら、Arrayで指定できるが
v = Array(Range("A1"), Range("A2"))
'Range型の動的配列は、Arrayで指定できない。Arrayの戻り値がVariant型の為
On Error Resume Next
r = Array(Range("A1"), Range("A2"))
On Error GoTo 0
'Range型の動的配列に入れる場合は、ReDimで配列のサイズを変える必要がある
ReDim r(2)
Set r(1) = Range("A1")
Set r(2) = Range("A2")
End Sub
Sub test2()
'一見できそうですが
'コンパイルエラーになります
Dim Stxt As String
For Each Stxt In Split("a,b,c", ",")
Cells(2, Stxt).Value = "S" & [now()]
Next Stxt
End Sub
>使われてない方にはVariant型の不使用の理由。 エラーの原因を少なくする、また特定しやすくするためです。 あとは型を宣言することで、何に使うか明確にするため?
↓を実行すると、想定外の値が返ってくると思います。
Sub test3()
Dim v1 As Variant
Dim v2 As Variant
v1 = InputBox("一つ目の数字を入力", , 1)
v2 = InputBox("一つ目の数字を入力", , 2)
MsgBox v1 + v2
End Sub
(稲葉) 2016/03/25(金) 08:44
稲葉さんからも指摘がありますが、
>> 配列のようにRangeデータを保持するために多用されています。
もし、これが
Variant型変数 = セル領域.Value
こういうことを言っておられるなら(つまり、セル領域の値を一挙に配列に格納)逆に、左辺は Variant型変数でなければいけません。 「多用」という言葉遣いの意味が??? 多用ではなく必須です。
このテーマは、Variant型変数 云々 というより、それぞれの変数は そのデータに適したデータ型を明示して定義しましょうということでは? Variant型でも、実行に(若干実行効率はおちても)差しさわりはありませんが、きちんとデータ型を明示しておくほうが わかりやすい + 開発効率が格段に向上しますので。
ただ、セル領域の取り込み以外でも Variant型変数を使わなければいけない局面はありますよ。
Applicationクラスのシート関数を実行したとき、その戻り値としてVariant型変数で受けて エラーかどうかを判定する場合。 あるいは、単一セルでも、セルのデータ型が特定されていない場合の、セルデータの格納。(エラー値とか数値とか日付型とか文字列型とか様々ですから)
(β) 2016/03/25(金) 08:55
ちょっとテーマとは外れますが(実は、はずれていない?) データ型の明示が開発生産性向上に寄与するとコメントした部分、補足します。
たとえば
Dim n As Variant という変数定義があって
複雑で膨大なコード内の If分岐の、いたるところで、それぞれの条件の場合の値を n に格納したとします。
If なんたら Then n = hoge ElseIf なんたらかんたら Then n = hogehoge ElseIf こうだったら Then n = hogehogehoge ・ ・ ・ End If
n = n * 10
で、この n = n * 10 で「型が間違っている!」というエラーになりました。 デバッグすると n の値が、数値ではありません。 コードにバグがあるわけですね。そのバグは、どこだったのでしょうか?
n = n * 10
これそのものは 「正しいコード」、つまり犯人ではありません。 ここに至るまで多くの場所で n に値を入れている、その中のどこかが間違っているわけですね。 どこが間違っていたのか、真犯人は、とっくに逃亡していますので、いっしょうけんめい、ここはどうだろう、ここは、どうだろう・・と 刑事さんは足を棒にして捜査するわけですね。
もし、Dim n As Long と指定してあれば、コードのどこかで n = なにかの値 といれた瞬間に その値が数値でない場合にエラーになります。 つまり、現行犯逮捕が可能になるわけです。
(β) 2016/03/25(金) 16:54
>Variant型変数 = セル領域.Value
そうですね、この記述を一番よく見かけました。後はオブジェクトを入れたり
普通の変数を入れたりするコードもありましたね。
そのようなコードを見てVariant型が多用されていると思ったためそうコメントしました。
みなさまのコメントを見る限りだと基本的にはVariant型変数 = セル領域.Valueとかシート関数のような
シートのデータを受ける箇所の身に使用した方がいい印象を受けました。
(オレンジ) 2016/03/25(金) 21:33
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.