VBAにおける変数の使い方

かばくん

変数ってなんですか?使えたほうがいいですか??

へびせんせい

変数とは、文字や数値を入れておく箱のようなものです。
プログラミングでは、ほぼ必須で使われるので覚えましょう!

変数とは?

変数とは、文字・数値などを格納し、繰り返し利用することができる箱のようなものです。

変数を使うことで、次のような利点があります。

  • 同じ値を繰り返し利用できる
  • 変数にわかりやすい名前をつけることができる
  • 中身を上書きすることができる

変数の使い方

変数の使い方の手順は、「宣言 → 代入 → 参照」となります。

1.変数の宣言(定義)

まず、「変数を使いますよ!」という宣言を行う必要があります。変数を定義するともいいます。

変数の宣言の方法は次の通りです。

Dim 変数名 As データ型

例:Dim box As String

これで、文字列を代入することができるboxという名前の変数が定義されます。

変数名について

変数名は、自分の好きな名前をつけて構いません。ただし、変数の中にどんな値が入っているかが想像できる名前にしましょう。
たとえば、人の名前を入れる変数ならname、円の半径を入れる変数ならr、今日の日付を入れる変数ならtoday、といったように。
ここでは、箱をイメージできるようにboxという名前を付けてます。

VBAでは変数名を全角文字(日本語)で付けることもできますが、絶対にやめましょう。
プログラミングでは、不要な箇所に全角文字が入るとエラーになります。
さらに、全角のスペースが入ってもエラーになってしまい、見つけるのが困難なエラーの一つです。
原則、変数名は小文字の英数字でつけるようにしましょう。

データ型について

データ型はあらかじめ決められています。 変数の中に入れるデータの種類によって、変数の宣言のときに指定する必要があります。 下記の表にデータ型をどう表記するかを示します。

VBAでのデータ型の一覧表
データ型 表記 データの値の範囲
文字列型 String 文字
Bool型 Boolean True または False
整数型 Integer -32,768 から 32,767 の整数
長整数型 Long -2,147,483,648 から 2,147,483,647の整数
単精度浮動小数点型 Single -3.402823E38 から -1.401298E-45
1.401298E-45 から 3.402823E38
倍精度浮動小数点型 Double -1.79769313486231E308 から -4.94065645841247E-324
4.94065645841247E-324 から 1.79769313486232E308
通貨型 Currency -922,337,203,685,477.5808 から 922,337,203,685,477.5807
日付型 Date 西暦100年1月1日 から 西暦9999年12月31日 (日付と時刻)
オブジェクト型 Object オブジェクト参照するデータ型
バリアント型 Variant あらゆる種類の値を保存できる型
ユーザ定義型 任意 ユーザが自由に定義できる型

変数の中にどんな種類のデータを入れるかによって、データ型を使い分けます。 多くのデータ型が用意されていますが、すべて覚える必要はありません。
まずは、文字を扱える文字列型(String)と整数が扱える長整数型(Long)を覚えましょう。

かばくん

数値を扱うデータ型(Integer・Long・Single・Double)は
4つもあるけど、どう使いわければいいの??

ここからは少し細かい説明になるので、読み飛ばしても大丈夫です。
まず、プログラミングでは数値を扱うとき、「整数」と「実数(小数)」に分けて考える必要があります。
これはコンピュータ内部で数値を表現するときの計算過程が異なるからです。
整数・・・100 ・ 3100 ・ -50 など
実数・・・3.141592 ・ 172.5 ・ -0.0001 など

次に、扱える数値の大きさで分けられます。整数に関していうと、IntegerとLongでは扱える数値の大きさが異なるのです。
整数型(Integer)の扱える最大値は32767で、これを超えた数値を代入するとエラーを起こしてしまいます。
これは整数型(Integer)が2バイト領域のメモリを確保する変数だからです。
2バイトは、2の16乗=65536であり、これをプラスとマイナスに振り分けるので、-32768から32767の値が使えるということです。
同様に、長整数型(Long)は4バイトのメモリ領域を確保します。計算すると、2の32乗で表の通りの範囲の数値を扱えることになります。
扱う値の大きさを考慮して、データ型を選択するほうが良いですが、思っていたより数が大きくなって予期しないエラーが出ることもあるので、整数と実数だけは使い分けて扱えるデータが大きい方(Long・Double)を使えば良いです。

2.変数にデータを代入する

変数にデータを入れるには次のように書きます。

変数名 = データ

例:box = "こんにちは"

プログラミングでは、文字をあらわすとき、""(ダブルクォーテーション)でその文字を囲う必要があります。
数値を表すときは、""(ダブルクォーテーション)は不要です。

文字列を代入するサンプルコード

Sub 文字列を代入()
  Dim box As String   
  box = "こんにちは"
End Sub

数値を代入するサンプルコード

Sub 数値を代入()
  Dim number As Long   
  number = 100
End Sub

3.変数を参照する

変数を参照するのは、簡単で、そのまま変数名を指定すればよいです。
例えば、文字列を代入した変数をA1セルに入れるならば、

例:Range("A1").Value = box

では、実際にマクロを作成して、変数を使ってみます。

変数の使い方の流れ サンプルコード

Sub variable1()
  '変数の定義'
  Dim msg As String
  Dim year As Long
  '変数に値を代入'
  msg = "hello"
  year = 2020
  '変数をセルに表示'
  Range("A1").Value = msg
  Range("A2").Value = year
End Sub

実行すると、A1セルにhello、A2セルに2020が表示されたと思います。

まとめると、次の図のようになります。

VBAにおける変数の使い方のまとめ

4.変数の上書き(更新)

プログラムの途中で変数の中のデータを上書きすることもできます。
もう一度、他の値を代入を行うだけです。 ただし、データ型は変えることができません。

box = "みかん"
box = "りんご"   '←変数の更新

変数でのエラー

変数を使ったときによくやってしまう間違いを見てみましょう。

エラーが出る場合

Sub 変数エラー()
  Dim num As Long
  num = "hello"
  MsgBox num
End Sub

長整数型(Long)で定義したnumという変数に、文字列を代入したためエラーとなります。
エラーが生じると、エラーの原因がメッセージボックスにでます。

VBAのエラーメッセージ

デバッグを押すと、おおよそのエラーの位置が色つきで示されます。
デバッグから抜けるには、画面上部の□マークのリセットを押します。

デバッグ(debug)・・・バグ(プログラムのエラーのこと)を取り除く、という意味
VBAのデバッグ画面

エラーが出ない場合

型が違ってもエラーがでないケースもあります。 整数型に実数を代入した場合です。
この場合、小数点以下が省かれて、整数として代入されます。(四捨五入ではありません)

Sub 変数エラーでない()
  Dim pi As Long
  pi = 3.14
  Range("C2").Value = pi
End Sub

実行しても、エラーにはなりません。
では、C2セルをみてください。値は3が表示されていると思います。
このように、整数型に実数を代入したときは、エラーにはならず値が丸められて整数として表示されます。
エラーがでないため、表示するまで気づきにくいので注意が必要です。

【豆知識】 プログラミングで四捨五入をするには
プログラミングでの四捨五入は、実数を整数の変数に故意に代入することで実現されます。
173.8という実数の小数点以下を四捨五入したいときは、+0.5して整数として表示します。
例:seisu = jissu + 0.5
→seisuには、174の整数が入る

変数の宣言(定義)は省略できるけど・・・

変数の宣言を強制する、の意味合い

最初の環境構築のセクションで、VBEのオプションの変数の宣言を強制するにチェックを入れたのを覚えていますか?
チェックを入れていれば、VBEの一番上の行に「Option Explicit」の表記があるはずです。
実は、このチェックを入れなければ、変数の宣言は省略できるのです。
しかし、宣言を省略すると、データ型が分からないうえに、突然、見たことない変数名が登場するので、プログラムの可読性が悪くなります。
プログラミングに慣れた上級者なら良いかもしれませんが、最初のうちは変数の宣言は必ず行うようにしましょう。

試しにOption Exiplicitを消して、次のマクロを実行してみてください。正常に動作するはずです。

Sub 変数エラーでない()
  myheight = 173.5
  MsgBox myheight
End Sub

消したOption Exiplicitは戻しておきましょう。

あらゆるデータを格納できる便利なVariant型

データ型の一覧表にバリアント型というあらゆる種類の値を保存できる型というものに気づいた方もいるのでは。
実は、VBAにはとても便利ななんでもOKな型が用意されているのです。
使い方は、データ型を省略して、変数名までを記述するだけ。(As VariantとしてVariant型を指定しても良い)

Dim 変数名
Sub Variant型()
  Dim myname
  myname = "へびせんせい"
  MsgBox myname
End Sub

mynameはデータ型が指定されていませんが、マクロは正常に動作します。
これは、mynameがVariant型で定義されているからで、仮に数値を代入しても問題ありません。
Variant型に関しては、データ型について理解した上で使うのであれば、問題ないでしょう。
ただし、変数名はどんなデータが入るか予想できる名前にすることを推奨します。

Point!
・変数の宣言は必ずすべき
・データ型の指定は省略してもOK!便利なVariant型を使う

変数を使ったサンプルコード

よく使う変数を使った例です。

整数を扱うLong型

Sub hensu_sample()
Dim num1 As Long
Dim num2 As Long

num1 = 10
num2 = 50

MsgBox (num1 + num2)
End Sub

Long型は整数を扱うときの変数です。
サンプルコードのように、2つの変数の加算を行っています。

文字列を扱うString型

Sub hensu_sample()
  Dim msg1 As String
  Dim msg2 As String
  
  msg1 = "Hello"
  msg2 = " world."
  
  MsgBox (msg1 & msg2)
End Sub

String型は文字列を扱うときの変数です。
サンプルコードでは、2つの文字列の結合を行っています。
文字列の結合は&で行います。(文字列同士の結合なら、+でも可能)

日付を扱うDate型

Sub hensu_sample()
  Dim day1 As Date
  Dim day2 As Date
  
  day1 = "2020/4/1"
  day2 = day1 + 1
  
  MsgBox day2
End Sub

Date型は日付を扱うときの変数です。
日付は前述の文字列として扱うこともできるのですが、Date型の方が便利な点が多くあります。
その一つが、Date型の変数に1を加算すると、翌日を表すことができる点。
サンプルコードでは、day2の変数には、"2020/4/2"が格納されます。


変数の練習問題

へびせんせい

変数nowyearを長整数型で、変数msgを文字列型で定義し、
メッセージボックスに「今年の西暦は2020」のように変数を使って表示しなさい
*メッセージボックスの表示は次のとおりである: MsgBox (msg & nowyear)

解答はコチラ

Excelを開いて、コードを確認してください

Download