|
よっちゃん さん、inoue さん、おはようございます。
以下のコードを実行してみて下さい
'======================================================
Sub test1()
On Error Resume Next
Dim ans As Variant
'**************************************************
Err.Clear
MsgBox 32767 & " = " & TypeName(32767) & vbCrLf & _
1 & " = " & TypeName(1)
ans = 32767 + 1
If Err.Number <> 0 Then
MsgBox "32767+1= " & Err.Description
Else
MsgBox "32767+1= " & ans
End If
'**************************************************
Err.Clear
MsgBox 32767 & " = " & TypeName(32767) & vbCrLf & _
0.5 & " = " & TypeName(0.5)
ans = 32767 + 0.5
If Err.Number <> 0 Then
MsgBox "32767 + 0.5= " & Err.Description
Else
MsgBox "32767 + 0.5= " & ans
End If
'**************************************************
Err.Clear
MsgBox 32768 & " = " & TypeName(32768) & vbCrLf & _
1 & " = " & TypeName(1)
ans = 32768 + 1
If Err.Number <> 0 Then
MsgBox "32768 + 1= " & Err.Description
Else
MsgBox "32768 + 1= " & ans
End If
On Error GoTo 0
End Sub
ans=32767+1
で
32767----Integer
1--------Integer
よってこの場合は、計算結果もInteger型のメモリーに一度格納した後、
変数ansに代入されます。
このとき32768は、Integer型では、納まりきらないのでエラーが発生します。
ans=32768+1では
32768-----Long
1---------Integer
となります。
この場合は、計算結果はLong型のメモリーに一度格納した後、
変数ansに代入されます。
よってエラーにはなりません。
因みに
'=============================
Sub test2()
On Error Resume Next
Dim ans As Variant
MsgBox 32767 & " = " & TypeName(32767) & vbCrLf & _
1 & " = " & TypeName(1 / 1)
ans = 32767 + 1 / 1
If Err.Number <> 0 Then
MsgBox "32767 + 1/1= " & Err.Description
Else
MsgBox "32767 + 1/1= " & ans
End If
On Error GoTo 0
End Sub
これは、エラーになりません。
こういう場合,
'=======================
Sub test3()
Dim ans As Variant
ans = 32767 + 1&
ans = CLng(32767) + 1
End Sub
こんな方法をとります。
計算結果がどの範囲の値になる可能性があるかを
予測しないといけませんね!!
|
|