変数について
それでは、今回は変数について学びましょう。
重要なことは「なぜ変数が必要なのか?」を理解することです。
変数が必要な理由を理解してから、その使い方について学んでいきましょう。
変数とはなにか
変数とは、よく箱という表現で説明されることが多いです。
数字や文字などを入れる箱をイメージしてくださいという説明です。
入れ物といったほうがいいかもしれません。
その入れ物に数字や文字を入れておいて、後で使うというイメージです。
そして、その入れ物はラベル(名前)を付けて区別します。
それを変数名と呼びます。

箱の説明をすると、変数を使っても箱の中のものはなくなるわけではないので、箱で説明するのは適切ではないという意見もあります。
変数は、その名の通り「中身が変わる/変えることができる」ものです。
それに対して、定数という「中身が変えられない」ものがあることも覚えておきましょう。
【変数】中身が変わる/変えることができる
【定数】中身が変えられない
Excelのセルも考えようによっては変数みたいなものです。
セルには、数字や文字列、日付など、さまざまなデータを入れられます。
そしてセルにはA1、A2といったように名前が付いています。
つまりA1セルに数字の100を入れるということは、
A1という名前が付いている変数(セル)に、数字の100を入れる
ということと同じような感覚なのです。
なので、変数を考えるときは、箱をイメージするよりも、
Excelのセルをイメージしたほうがわかりやすいかもしれません。
変数が必要な理由
では、VBAでマクロを作成していく中で、変数が必要な理由は何でしょうか?
例えば、繰り返しの時に使った、カウンター変数は、一つのわかりやすい例です。
カウンター変数がなければ、繰り返しの回数がわからず、繰り返し処理ができません。
そのためにカウンターとして使う変数が必要になるのです。
つまり、
変数があることで、データを記憶しておき、必要になったときに使うことができる
というのが変数を使う理由です。
そして変数を使うことで
「プログラムが読みやすく、理解しやすくなる」
という効果もあるのです。
変数の使い方
例として、商品購入時のポイント付与の計算で説明してみます。
ここでは、購入価格の10%のポイントを与えるものとして、その計算をしてみます。
まずは、簡単なExcelの表を作ります。
Noには「1」、商品名には「商品A」、価格には「1,000」を入力します。

次に、マクロを動かして付与ポイントを計算、表示してみましょう。
Sub calcPoint()
Range("E3").Value = Range("D3").Value * 0.1
End Sub

例1では、価格に0.1(10%)をかけて付与ポイントを求めています。
ここでの問題は、このマクロのプログラムだけを見ても「0.1」の意味はわからないということです。
後でこのプログラムを見た時に、
「0.1ってなんだろう?」
となり、Excelの表を見て初めて理解することになるのではないでしょうか。
なので、最低でも、以下のようにコメントを付ける必要があります。
Sub calcPoint()
'付与ポイントを計算
Range("E3").Value = Range("D3").Value * 0.1
End Sub
でも、これだけのことにいちいちコメント付けるのも面倒ですよね。。。
VBAでコメントを書くには、行の先頭に「’」を入力します。
変数を使ってみる
次に、変数を使ってみましょう。
Sub calcPoint()
pointRate = 0.1
Range("E3").Value = Range("D3").Value * pointRate
End Sub
pointRate = 0.1
で「pointRateという名前の変数に0.1を入れる」という意味になります。
pointRate = 0.1
と書くことで、pointRateという名前の変数が生まれて、その変数を利用することができるようになります。
そして次の行で「 * pointRate」と書くことで、変数pointRateの中身(値)である 0.1をかけています。
pointRateの中身(値)である、0.1をかけている
pointRateは日本語で「ポイント率」なので、ポイント付与率をかけていることがわかる
ということが、わかるようになります。
そして、ポイント付与率に変更があった場合には、pointRateに代入する値を変えればいいのです(この例の場合、付与率を20%にするときには0.1を0.2に変更する)。
このように変数を使って書くことで、
プログラムを見ただけで、
何をしようとしているのかがわかるようになるのです。
ここで、
pointRate = 0.1
といきなり変数名を書いて、数値を入力していますが、
変数にはきちんとした書き方(宣言の仕方)があります。
次にそれを説明します。
変数の宣言
それでは、変数の宣言方法をみてみましょう。
Sub calcPoint()
Dim pointRate
pointRate = 0.1
Range("E3").Value = Range("D3").Value * pointRate
End Sub
という書き方で、変数を宣言することができます。
※ ここでは「pointRate」という名前の変数名を使いますよという宣言を追加しました
ここで宣言するのに使われている、
Dim
というのは、Dimensionの略で「領域(場所)を確保」といった意味になります。
まずは場所を確保して、そこにものを入れる、といった意味で使います。
変数の型
次に説明しておきたいことは、変数には名前だけではなく、「型」があるということです。
型というのは、「数値」や「文字列」といった、変数の中身のデータがどんな内容(型)なのかということを表します。
型はいくつか種類があるのですが、まずは次の3つを覚えて使ってみましょう。
Long:長整数型(整数のとき)
Double:倍精度浮動小数点数型(小数点を含む数値のとき)
String:文字列型(文字列のとき)
型の指定の仕方は
Dim 変数名 as 型
という書き方になります。
あまり難しく考える必要はなくて、変数名を決めて、3つの型のどれかを書くだけです。
Double型
先程の例で言うと
Sub calcPoint()
Dim pointRate as Double
pointRate = 0.1
Range("E3").Value = Range("D3").Value * pointRate
End Sub
と書いて、pointRateは小数を含む数値であることを宣言しています。
そしてpointRateに0.1という少数を含む数値を入れているということになります。
String型
次にString型を使ってみましょう。
マクロの実行が完了した時にメッセージボックスを表示する、別のマクロの例に書き換えて説明してみます。
Sub calcPoint()
Dim boxMessage as String
boxMessage = "完了!"
msgBox boxMessage
End Sub
実行すると「完了!」とメッセージボックスが表示されます。

boxMessage = “完了!”
の“”で囲まれた箇所を変更して表示が変わるのを確認してみてください。
ちなみにVBAでは文字列は“”で囲みます。
Dim boxMessage as String
でboxMessageは文字列(String)であると宣言しています。
boxMessage = “完了!”
次にboxMessageに “” で囲んで文字列を入れています。
msgBox boxMessage
最後にメッセージボックスで文字列を表示しています。
「msgBox 文字列」という書き方で画面にメッセージボックスを表示できます。



VBAでの文字列の扱い方については、これから実践を通して学んでいきましょう。
Long型
最後にLong型を使ってみましょう。
Long型というのは、整数を扱うときに使います。
整数には、Integerという型もあるのですが、最初のうちは、入れられる数値の範囲が広いLong型だけを使えばいいと思います。
大は小を兼ねるということです。
整数型 Integer -32,768~32,767の整数
長整数型 Long -2,147,483,648~2,147,483,647の整数
他にも、バイト型、通貨型、なんてものもあります
ここでLong型を使うために、先ほどの付与ポイントの例を少し変更してみましょう。
Sub calcPoint()
'価格
Dim price as Long
price = Range("D3").Value 'D3セルの値を変数priceに代入する
'ポイント付与率
Dim pointRate as Double
pointRate = 0.1
Range("E3").Value = price * pointRate
End Sub

価格をpriceという名前を付けた変数に入れて計算しています。
ちなみにpriceは整数なので、Long型で宣言しています。
Range(“E3”).Value = price * pointRate
を見れば、価格にポイント率をかけて、E3セルに入力しているとわかります。
変数はどのように使えば正解ということもなく、人それぞれです。
使い方によって、マクロが見やすくなったり、見にくくなったりもします。
また、変数は、「宣言をする / しない」で論争になったりするのですが、
私個人の考えとしては、個人で使うマクロであれば、どちらでもいいかなと思っています。
それに対して、他の人と共有して使うようなマクロや、仕事として請け負ったマクロについては、宣言すべきだと思います。
ようは、状況に応じてどちらにするかを決めればいいのではというのが私の考えです。
Option Explicit宣言
ちなみに、変数を宣言しないとエラーとなるように設定もできます。
それが
Option Explicit
という宣言です。


ツール⇒オプション⇒編集
で「変数の宣言を強制する」をチェックすることで、
チェック後に作成したモジュールには、
自動的にモジュールの先頭に「Option Explicit」が書き込まれます。


これが宣言されていると、変数をDimで宣言しないで使おうとするとエラーになります。
変数を宣言すると決めたときには、チェックしておくといいでしょう。
変数のバリアント型
変数については、バリアント型という万能タイプのものがあります。


Dim taxRate
と宣言して、型を指定しなかった場合は、バリアント型となります。
Dim taxRate as Valiant
と書いても、バリアント型になります。
バリアント型というのは、何を入れてもいい、というデータ型なのです。
変数を宣言しないといけないけど、型がわからないというときには、
とりあえずバリアント型で宣言しておけば大丈夫です。
バリアント型でも実行すれば同じ結果が得られます。


変数を宣言する意味
変数を宣言しておくと何がいいかというと、コードを書いている時に自動補完してくれる点です。
Dim pointRate
「p」と入力した後に、
Ctrl + space
を入力すると、選択候補リストが表示され、その中に pointRate が出てきます。


変数を宣言していたことで、その変数が存在することが認識されているのです。
そして、宣言した変数の頭1文字「p」を入力するだけで残りが自動補完され、
そのリストの中から選択できるという動きをします。
変数のオブジェクト型
変数については、もう一つオブジェクト型というのがあります。
オブジェクトを型に指定するということです。
このオブジェクト型を使いこなすには、もう少し実践をこなす必要があります。
ここでは、オブジェクト型と呼ばれるものがあるということを知識として持っておきましょう。
どんなものかというと、
Thisworkbook.Sheets(“価格表”)
こういう書き方をもっと簡単に書いたりできます。
例えば、
Dim priceSheet as Worksheet
といった宣言をします。
そして以下のように使います。
Dim priceSheet as Worksheet
Set priceSheet = Thisworkbook.Sheets(“価格表”)


オブジェクトを型に指定した場合、Setと書いて、変数に入れます。
この場合は、価格表というシートを変数priceSheetに入れることで、
priceSheet.Range(“A1”).Value
といった書き方ができるようになります。


これは、
Thisworkbook.Sheets(“価格表”).Range(“A1”).Value
と同じです。


同じ書き方を何回も繰り返すといったことや、
Workbookからの指定が長くて見にくい、
といった場合によくつかいます。
絶対に使わないと駄目ということもないので、まずは使わないで書いてみましょう。
きっと使いたくなる場面に遭遇すると思います。
そのときに覚えても遅くはありません。
変数は使ってみて覚えていくものだと思います。
まずは気軽に使ってみて、動きを確かめてみましょう。
変数について宣言や型といったことを書いてきましたが、実際の使う時には変数名の付け方に悩むことになると思います。
できるだけわかりやすくできるといいのですが、これがなかなか難しい。
実は変数名には日本語も使えるので日本語を使う人もいます。
英語、ローマ字、日本語、入り交じりのマクロもあったりするのです。。。
この変数名の付け方については、改めてじっくりと説明をしたいと思っています。今のところは、自分のわかるように、好きに付けて使ってみてください。


