VB6:変数宣言の罠

posted on 2005年10月24日 22:23 投稿者 Elfaria

VB6とか、VBAで、こんな変数宣言をよく目にします。

   Dim i, j, k As Double

きっと、ループ変数にでも使いたいのでしょう。(ループ変数でDouble宣言とはこれまた微妙ですが)
しかし、ここで罠です。

実は、上記の場合、変数 k しかDouble型になりません。
他はVariant型です。変数に値を入れると、値に該当した型になります。
該当する変数を、VarType 関数で調べてみるとわかります。

ちなみに、VB.NETの場合は、上記のコードの場合、すべてDouble(System.Double)型になります。

VB6 確認コード
本当はもうちょっとスマートにしたかったんだけど、適当に作った確認用のものなので。

Dim i, j, k As Double
Dim s As String

i = 1
j = 70000
k = 3

s = CheckType(i)
MsgBox ("i = " & s)

s = CheckType(j)
MsgBox ("j = " & s)

s = CheckType(k)
MsgBox ("k = " & s)

Function CheckType(var As Variant) As String

Select Case VarType(var)
   
    Case vbEmpty
        CheckType = "Empty"
   
    Case vbNull
        CheckType = "Null"
   
    Case vbInteger
        CheckType = "Integer"
   
    Case vbLong
        CheckType = "Long"
   
    Case vbSingle
        CheckType = "Single"
   
    Case vbDouble
        CheckType = "Double"
   
    Case vbCurrency
        CheckType = "Currency"
   
    Case vbDate
        CheckType = "Date"
   
    Case vbString
        CheckType = "String"
   
    Case vbObject
        CheckType = "Object"
   
    Case vbError
        CheckType = "Error"
   
    Case vbBoolean
        CheckType = "Boolern"
   
    Case vbVariant
        CheckType = "Variant"
   
    Case vbDataObject
        CheckType = "DataObject"
   
    Case vbDecimal
        CheckType = "Decimal"
   
    Case vbByte
        CheckType = "Byte"
   
    Case vbArray
        CheckType = "Array"

End Select

End Function

i  は Integer型、 j は Long型、k は Double型になっているはずです。


対してVB.NETはどうかというと。

VB.NET 確認コード。

        Dim i, j, k As Double

        MessageBox.Show("i = " & i.GetType.ToString)
        MessageBox.Show("j = " & j.GetType.ToString)
        MessageBox.Show("k = " & k.GetType.ToString)

全部Double(System.Double)になってます。

VB.NETだと、コードもスマートに。

移植とかマイグレーションの時、気をつけましょうね。

コメント