[VBA解説]変数とデータ型を理解しよう![#3]

記事
IT・テクノロジー
前回の記事はこちら

変数・データ型とは

前回の記事で、セルに入力されている値を計算式に組み込む方法を紹介しました。
(例)
Range("A3").Value = Range("A1").Value * Range("A2").Value

ただ、こんな風に何度もRange("").Valueを書くのは大変ですよね。
そんな時に使うのが、「変数」というものです。
実際に書くと以下の通りです。

Sub 合計金額計算()
    Dim cost As Long
    Dim quantity As Long

    cost = Range("A1").Value
    quantity = Range("A2").Value
    Range("A3").Value = cost * quantity
End Sub
※実行する時は、A1セルとA2セルに数字を入力しておいて下さいね。数字ではなく文字を入力すると…?

少し見た目が変わりましたね。
この記事の最初に出した例とやっている事自体は同じなのですが、より分かりやすく書くとこんな形になります。

一つひとつ説明していきますね。
まず、
Dim cost As Long
の部分。「Dim」は「これは変数ですよ」という意味になります。
変数を「定義する」もしくは「宣言する」という言い方をします。

その後の「cost」が、「変数名」です。今回は金額を計算するマクロをイメージしたので、「cost」としました。
もう一つの「quantity」は「個数」の意味です。

変数名は自由に決められますが、数字から始めることは出来ないなどのいくつかの決まりはあります。

そしてそのあとの「As Long」は、「この変数はLong型ですよ」という意味になります。
Long型とは、VBAで整数を扱う時に使うデータ型です。金額も個数も、同様に整数を想定しているので、両方Long型ですね。
要するに冒頭の2行は、
「costっていう、整数を扱うための変数をこのコードで使うよ」
「quantityっていう、整数を扱うための変数をこのコードで使うよ」
という意味になります。

データ型は他にもありますが、一旦コードの説明を続けますね。

次の1行はこうなっています。
cost = Range("A1").Value

ここまで読んでくださった方なら、「=」の意味は分かりますよね。
「等しい」ではなく、「右を左に代入」ですね。

つまり、Range("A1").Valueを、costという変数に代入しているんです。
イメージとしては、セルに値を代入したのと全く同じで大丈夫です。

「全く同じ」ということは、「代入した値を計算にも利用出来る」ということですね!
というわけで、
Range("A3").Value = cost * quantity
は、
Range("A3").Value = Range("A1").Value * Range("A2").Value

と、書き方が違うだけで、やっていることは変わらない、ということが分かると思います。


何のために変数を使うの?

ここまでで変数のイメージは分かったと思います。
ただ、この例だけだと「なぜ変数を使うのか」と考えてしまいますよね。

変数のメリットは以下のようなものがあります。
・変数名を付けることで、「何を意味するものなのか」が分かりやすい
・繰り返し同じ値を使いやすくなる
・コードを修正しやすくなる

まず、今回例でお見せしたマクロは、「合計金額を計算する」という目的のために作ったものでした。
その「金額」としてcostやquantityという名前の変数を使うことで、
「あ、この値が金額なのね」
と、読んだ人に伝わりやすくなります。
ということは、「a」とか「b」のような変数名だと、「何を意味する変数なのかが分からない」となるので、避けるべきと言えます。

次に、「繰り返し同じ値を使いやすくなる」ということですが、例えば金額を計算する際に税率も追加で計算するとして、

Range("A3").Value = costA * quantityA * 1.08
Range("B3").Value = costB * quantityB * 1.08
Range("C3").Value = costC * quantityC * 1.08

こんな風に、毎回「1.08」と書かなければいけないのは面倒ですよね。
そうではなく、taxという税率を代入しておく変数を宣言しておけば、

tax = 1.08
Range("A3").Value = costA * quantityA * tax
Range("B3").Value = costB * quantityB * tax
Range("C3").Value = costC * quantityC * tax

こんな風に、taxと書けばOKになります。

そして最後に、「コードを修正しやすくなる」というメリットですが、これも上記の消費税の計算でイメージすると伝わりやすいと思います。

すべて「1.08」と書いていたものを、「1.1」に変えようと思うと、3箇所書き換える必要がありますね。

でも、taxという変数を使っている方は、
tax = 1.08
の部分を
tax = 1.1
に書き換えるだけで修正が完了します。

以上のような理由から、変数をうまく活用してVBAを書いていくことをオススメします。

コードのミスを探す「ステップイン」

ここまで読んだ人で、消費税込みの計算をしようとして、以下のようなコードを書いた人がいるかもしれません。

Sub 合計金額の計算()
    Dim cost As Long
    Dim quantity As Long
    Dim tax As Long
    tax = 1.08
    cost = Range("A1").Value
    quantity = Range("A2").Value
    Range("A3").Value = cost * quantity * tax
End Sub

もし上記のようなコードをまだ書いていない人は、これをコピペして実行してみてください。
A1セル、A2セルには数字を入れておいて下さいね。

…さて、正しい結果は得られたでしょうか?
例えば僕は、A1セルに1000を、A2セルに5を入力して、マクロを実行しました。すると…
計算ミス.png

「あれ?」と思いますよね。
1000*5で5000になり、消費税8%を加えると、5400が正しいはずなのに、答えは5000になっています。

はい、何かが間違っていたんですね。決して、コンピューターが計算ミスをした訳ではありませんよ。

このように、エラーが出ない場合でも、想定していた結果と違う結果が出ることはよくあります。

エラーメッセージをヒントにミスを探すことが出来ないので、エラーが出るよりも厄介な状況と言えます。

こんな時「どこで間違っているのか」を探すために便利なのが、「ステップイン」というVBEの機能です。

ステップイン.png
VBEの「デバッグ」というメニューをクリックすると、その中に「ステップイン」があります。
これをクリックしても良いのですが、今後よく使う機能になるので、ショートカットキーで「F8キー」と覚えておいてください。

F8キーを押すと、F5キーを押すのとは違い、プログラムが1処理ずつ実行されていきます。
ステップイン実行.png
上記のように、色が変わっている行が、「次に実行される行」です。
この状態でF8キーを押すと、
tax = 1.08
が実行されます。
tax = 1.08が実行されたあとに、マウスカーソルをtaxに合わせると…
スクリーンショット 2021-04-29 213815.png
こんな風に、taxの中身を見ることが出来ます。
なんと、1.08ではなく、「1」になっていますね!

それもそのはずで、僕は「taxはLong型(整数)の変数だよ」と宣言しています。
そこに小数を突っ込むという、コンピュータからすれば「は?」となるようなことを書いていたので、コンピュータは約束通り、「taxは整数」として、「1.08」の整数部分のみ(つまり1)を受け取った、というイメージですね。

こういう風に、ステップイン機能を使うと、変数の中身を確認したり、1処理ずつ動作を確認出来るので、「あれ?」と思った時は、F8キーを押してみてください。
エラーが表示された場合も、この方法を使うと、どの処理でエラーが起きているかを確認できるので、プログラムの修正がスムーズになります。


色々なデータ型

さて、ここまでデータ型はLong型しか紹介していませんが、VBAには以下のようなデータ型が存在します。
String:文字列型
Long:(長)整数型
Double:(倍精度浮動)小数点型
Boolean:ブール型
Variant:バリアント型

他にも色々ありますが、とりあえず上記5つくらい覚えておけば大丈夫です。
今回は、String、Long、Doubleだけ覚えて下さい。

先述した、消費税込みの計算をするマクロであれば、taxはDouble型で宣言しておく必要があった、ということになります。

Sub 合計金額の計算()
    Dim cost As Long
    Dim quantity As Long
Dim tax As Double
    tax = 1.08
    cost = Range("A1").Value
    quantity = Range("A2").Value
    Range("A3").Value = cost * quantity * tax
End Sub

これを実行すると…
小数反映.png
はい、ちゃんと消費税込みの計算結果になっていますね!

他にも、String型として変数を宣言すると、その変数には文字列を代入することが出来るようになります。

さて、それでは今回は、次の練習問題が解けたら終わりにしましょう!

練習問題.コードを修正してみよう!
くぼくんは、「あいさつ」という変数に、「おはよう」という文字列を代入し、その変数を使ってC1セルに「おはよう」と表示させよう!という何がしたいのかよく分からないマクロを作ろうとしました。
その際に書いたコードが以下の通りですが、どのように修正する必要があるでしょうか?

Sub あいさつを入力する謎マクロ() 
    Dim あいさつ As String
    あいさつ = おはよう
    Range("C1").Value = あいさつ
End Sub

ちなみにですが、変数名に日本語(ひらがなやカタカナ、漢字など)を使うことは可能です。

この問題の解説は次の記事でしますので、頑張って解答に辿り着いて下さい!
それでは!

今回の記事の内容で、個別に質問したい場合は以下の有料サポートをご利用下さい。出来るだけ迅速に、丁寧に対応致します。
次の記事はこちら

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す