Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


47603 / 76732 ←次へ | 前へ→

【34080】Re:バリアントでもオーバーフロー
発言  ichinose  - 06/1/26(木) 7:56 -

引用なし
パスワード
   よっちゃん さん、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

こんな方法をとります。

計算結果がどの範囲の値になる可能性があるかを
予測しないといけませんね!!

0 hits

【34060】バリアントでもオーバーフロー よっちゃん 06/1/25(水) 18:21 質問
【34064】Re:バリアントでもオーバーフロー inoue 06/1/25(水) 18:44 発言
【34078】Re:バリアントでもオーバーフロー よっちゃん 06/1/26(木) 4:07 質問
【34080】Re:バリアントでもオーバーフロー ichinose 06/1/26(木) 7:56 発言
【34082】Re:バリアントでもオーバーフロー やっちん 06/1/26(木) 8:06 回答
【34084】Re:バリアントでもオーバーフロー よっちゃん 06/1/26(木) 9:33 質問
【34089】Re:バリアントでもオーバーフロー やっちん 06/1/26(木) 10:50 発言
【34125】Re:バリアントでもオーバーフロー よっちゃん 06/1/27(金) 8:35 お礼

47603 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free