[[20160324235800]] 『Variant型のメリットデメリット』(オレンジ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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.