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だと、コードもスマートに。
移植とかマイグレーションの時、気をつけましょうね。