第3講 数字を入れる箱を活用しよう
第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)
と意識的に型を変身するように心がけてください。
他のプログラム言語では、自動的な型変身はないからです。
型変身は、必要に応じて述べていきます。
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
vb講義へ
VB講義基礎へ
初心者のためのJava 入門 基礎から応用まで
数学研究室に戻る