第4講 数字型変数を理解しよう

第5話 割り算の不思議な結果

第4話問題解答例
Private Sub CommandButton1_Click()
  Dim a As Byte, b As Byte
  a = 12
  b = 15
  Cells(6, 1) = "a="
  Cells(6, 2) = a
  Cells(7, 1) = "b="
  Cells(7, 2) = b
  Cells(8, 1) = "a+b="
  Cells(8, 2) = a + b
  Cells(9, 1) = "a-b="
  Cells(9, 2) = CInt(a) - CInt(b)
  Cells(10, 1) = "a×b="
  Cells(10, 2) = a * b
  Cells(11, 1) = "a÷b="
  Cells(11, 2) = a / b
End Sub
実行結果


皆さんの解答も同じでしたか。
ところで、この結果を見て不思議に感じませんか。
前々話でByte型同士の計算はByte型になると説明しました。
実際C言語やJavaなどで同様な計算をさせると、
a÷bの計算結果は、0になってしまいます。
整数型同士の計算結果も整数になることになっているので、
小数部分は切り捨てられて、
0.8は0になってしまうのです。
ところが、VBAは引き算については、
他の言語と同様にByte型同士の計算結果は、Byte型になったのに、
割り算については、Byte型同士の計算結果はByte型ではなく単精度浮動小数点型(後に学習)
になるのです。不思議なことに、
Cells(11, 2) = a / bは自動的にCells(11, 2) = CSng(a) / CSng(b)になるのです。
CSng(a)はaをByte型からSingle型=単精度浮動小数点型に型を変身させるものです。
実は、一部の例外を除いて基本的には、VBAの場合キャスト(型変更)を自動的にやってくれるのです。
C言語・C++・Java・パスカルでは、意識的にキャストをしない限り、自動的に型変更は起きずエラーするのですが、
VBAは結構融通が利くのです。
それならば、Byte型同士の引き算も融通を利かせて、自動的に型変身をしてくればよいのですが、
引き算についてはだめなのです。
VBAの場合基本的には、型変身を自動的にしてくれますが、
一部の計算では、型変身してくれない場合もあるわけです。
『どうしてそうなんですか。』の質問に対しては、
VBAの開発者が気まぐれであったとしか答えようがありません。
もし、あなたがVBAをスタートにして本格的にプログラミングの勉強したいと思っているのでしたら、
自動的な型変更には頼らないで、
Cells(11, 2) = CSng(a) / CSng(b)
と意識的に型をキャストするように心がけてください。
他のプログラム言語では、自動的な型変更はないからです。
キャストは、必要に応じて述べていきます。



4話へ 第6話へ



トップ


初心者のためのc++ vc++ c言語 入門 基礎から応用までへ
初心者のための excel 2007 2010 2013 vba 入門 基礎から応用まで
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義トップへ
VB講義基礎へ
専門用語なしのC++入門へ
専門用語なしのJava入門へ
専門用語なしのVBA入門

数独のページ
魔方陣のページ
数学研究室に戻る
本サイトトップへ