【第7講】Excelマクロで電卓を自作しよう④(変数の型)

型の相違によるエラー
スポンサーリンク

こんにちは!かいけつマクロです。

全5回に渡って連載してきた電卓の作成も、残り2回となりました。

結構あっという間だったねー

今回と、次回は、前回までに作成した電卓に、入力規制を追加していきます。

前回の電卓で、こんなことを思われた方はいらっしゃらないでしょうか?

もし数字や四則演算以外を入力したらどうなるんだろう??

1桁の整数同士の計算しかしてないけど、小数点が出てきてもいいのかな??

実は、数字や四則演算以外を入力すると、こんな感じで、エラーになってしまいますし、(;・∀・)

数字を入れるところで文字を入れると、エラーが発生する

小数点が出てくると、こんな感じで計算結果が間違ってしまいます。

小数点を含む計算は、計算結果が誤ってしまう

今回と、次回のブログを通して、こんな「イマイチ」なところを改善するため、適切な値しか入力させない仕組み(=入力規制)を実装していきます。

より素晴らしい電卓に仕上げるため、今回も張り切っていきましょう!

スポンサーリンク

変数の型を理解する

上で見た、2つのイマイチな例ですが、どちらも共通点があります。

それは、、、変数の型が誤っている、という点です。

例えばこちらの図をご覧ください。変数a、b、operatorを定義している箇所ですが、この「Long」や「String」というのが、「変数の型」です。

変数の型を定義している箇所

そして、「変数の型」を定義すると、その型にあったもの以外は、代入できなくなります

第2項で出てきた、「代入」のイメージでいうと、

  • 果物用のダンボール箱 ⇒ 果物しか入れられない
  • 洋服用のダンボール箱 ⇒ 洋服しか入れられない

ということになります。

少々余談ではありますが、、、

現実世界で考えると、決まった型の箱にしかものを入れられないって、少し不便な感じがしますよね。ただ、今回作っている電卓もそうなのですが、システムの世界では、「ここには絶対に、数字を入力してほしい!」とか、「これは当然文字列だよね」といったことが、とてもよくあります。

そのような場合に、「なんでもござれ!」みたいな箱を用意してしまうと、VBA(システム)が求めていない「型」が入力されてしまい、全く意味のない計算・処理を行うことになってしまいます。(最悪の場合、システムが壊れます。)

そういったことを防ぐため、この「変数の型」を定義しておくことは、非常ーーーに重要になります。

さて、ここでは、代表的な変数の型を見ておきましょう。これだけ知っていれば、ほぼ困ることありません!(忘れても全然OK。ここに戻ってきてください。)

正確な定義ここを覚えよう!
BooleanTrueまたはFalseTrueまたはFalse
Long-2,147,483,648~2,147,483,647の整数整数
Double負の値:約-1.8×10(308乗)~-4.0×10(-324乗)
正の値:約4.9×10(-324乗)~1.8×10(308乗)
小数点を含む数字
String任意の長さの文字列文字列
Date西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻日付と時刻
Variantすべてのデータなんでもござれ
Workbookエクセルのブックエクセルのブック
Worksheetエクセルのシートエクセルのシート
「Long」型を指定することで「整数」しか代入できなくなる

変数a、bの型をDouble型に変更する

それでは、具体的に、VBAを修正していきましょう。まずは、変数a、bです。

上で見てきたように、小数点以下を含むような数字を扱いたい場合は、「Double型」を使います。

それでは、変数a、bの定義を、以下の通り書き換えていきましょう。

Dim a As Double
Dim b As Double
変数a、bの型を「Double型」に変更

また、変数operatorは、元々、String型(文字列)になっていたので、修正は不要です。

インプットボックスで入力した値を、Variant型の変数に代入する

ここからは、インプットボックスで入力した値の、変数への代入方法を変更していきます。

元々は、インプットボックスで入力した値は、変数a、b、operetorに直接代入していました。ただ、この場合、1つ大きな問題があります。それは、

「インプットボックスで入力された型」と「変数a、b、operetorの型」が一致していない場合、エラーが発生してしまう、ということです。(こちらの図ですね。)

そこで、エラーが発生しないように、以下のようにして、VBAを作り替えていきます。(変数aの場合)

  • インプットボックスで入力した値を、Variant型(なんでもござれ)の変数buf_aに代入する
  • buf_aの中身が数値であれば、buf_aの中身をaに代入する
  • buf_aの中身が数値でなければ、buf_aの中身はaに代入せず、もう一度入力してもらうよう、インプットボックスを再度表示する

この2点目、3点目は、次回のブログで記述方法を解説していきますので、今回は、1点目「インプットボックスで入力した値を、Variant型の変数buf_aに代入する」の部分について、実装していきましょう!

といっても、ここまで読んでいただいている皆さんなら、きっと何も解説無くても、できてるかもしれません。もし、

忘れちゃったなー

という方は、こちらの「3.セルの内容を、変数に代入する」を参考にしてください。

さて、実際の記述はこんな感じです。

'変数定義--------------
Dim a As Double
Dim b As Double
Dim operator As String

Dim buf_a As Variant
Dim buf_b As Variant
Dim buf_operator As Variant


'インプットボックスの入力値をVariant型変数に代入--------------
buf_a = InputBox("1つ目の数字を入力")
buf_b = InputBox("やりたい計算の種類(+、-、×、÷)を入力")
buf_operator = InputBox("2つ目の数字を入力")
bufの変数定義と、インプットボックスの入力値の代入処理

お疲れさまでした!これで、インプットボックスで入力した値を、bufに代入できるようになりました。

本日のまとめ

今回は、「変数の型」というものを中心に見てきました。

実は、この「変数の型」、VBAだけでなく、結構多くの開発言語で使われている概念であり、多くのITエンジニア達を苦しめている、超憎いヤツなのです。(私もその苦しめられている一人です笑)

ただ、途中の余談にも書きましたが、この「型」という概念があることによって、へんてこりんな処理をしてしまうリスクを最小限に抑えてくれる、という、大きな大きなメリットがあります。なので、

いちいち型の定義なんて面倒くさいよー

と思われるかもしれませんが、少しだけガマンして、「変数の型」に慣れていってもらえればうれしいです!

次回はいよいよ、電卓の作成、最終回です。ぜひ最終回もお楽しみにしてください!それでは!

本日の学びポイント
  • 「変数の型」を定義すると、その型にあったもの以外は、代入できなくなる
  • おかしな処理をしないようにするため、「変数の型」を定義するのは、非常に重要
  • インプットボックスで入力した値は、Variant型(なんでもござれ)の変数に代入する

コメント

タイトルとURLをコピーしました