VBA 変数の宣言や初期化する

はじめに

Excel VBA マクロで変数の宣言や初期化する方法を紹介します。

変数とは、値の入れ物です。何度でも値を代入して変更でき、いつでも取得できます。

Dim 変数名 As 型名 のようにして、変数を宣言できます。

宣言と同時に初期値を設定できません。2 行に分けて初期値を代入します。

Public や Private の変数はマクロが終了した後も値が残るため、マクロを実行したら最初に初期化する必要があります。クラスを使用すると簡単に初期化できます。

変数の型については「変数の型やデータ型」をご覧ください。
定数については「定数」をご覧ください。
  • 目次
    • 変数を宣言する
    • 変数に値を代入する
    • 変数の値を取得する
    • グローバル変数を宣言する
    • 変数の宣言を強制する

変数を宣言する

Dim 変数名 As 型名 のように入力します。Dim が変数を宣言するキーワードです。宣言とは変数を定義して使用できるようにすることです。

Dim 変数 As String
Dim tips As Integer
VBA では、変数の宣言と同時に初期化や初期値を設定することはできません。

通常は関数の中に変数を宣言します。そうすると、その関数だけで使用でき、別の関数からは参照できません。

Sub 実行1()
    Dim 変数 As String

End Sub

Sub 実行2()
    Dim 変数 As String ' 実行1 とは別の変数です

End Sub

関数の外に宣言する方法については下記の「グローバル変数を宣言する」をご覧ください。

変数はとてもよく使います。コードに値を直接入力するのではなく、変数に入れてから変数の値を使用するのが一般的です。

変数の名前に使用できない文字があります。詳しくは「命名規則」をご覧ください。

変数に値を代入する

変数に値を入れることを「代入」すると言います。

変数名 = 値 のように入力します。

Dim tips As Integer
tips = 10 ' tips は 10 になる 

変数の値は何度も変更できます。このため「変数」と言います。

Dim tips As Integer
tips = 10 ' tips は 10 になる 
tips = 20 ' tips は 20 になる
値を変更できない変数のことを「定数」と言います。詳しくは「定数」をご覧ください。

変数の初期化

変数の宣言と初期化を同時にはできません。2 行に分ける必要があります。

Dim 変数 As Integer = 10 ' これはできません

Dim 変数 As Integer ' 2 行に分ける必要がある
変数 = 10

ただし、コロン : を使って複数行を 1 行に書くことができます。

Dim 変数 As Integer: 変数 = 10

変数の型

変数の型によって代入できる値が決まります。数値や文字列や日付など、代入したい値によって変数の型を決めます。

数値を扱うなら Integer 型を使用します。Integer は数値専用で、それ以外の文字列などは代入できません。文字列を代入するとエラーになります。

Dim 数値型 As Integer
数値型 = 10       ' 数値なので代入できる
数値型 = "あいう" ' 文字なのでエラー

文字列を扱うなら String 型を使用します。

Dim 文字列型 As String
文字列型 = "あいう"
文字列型 = "10"     ' 数字の 10 なので文字列にも代入できる

このように変数に設定する値によって、型を決める必要があります。

型について詳しくは「変数の型やデータ型」をご覧ください。

オブジェクトを代入する

型の中には Object 型 (参照型) があります。Sheet1 などのシートや、クラスで作成されたものがオブジェクトです。

Set 変数名 = 値 のように、オブジェクトを代入するには頭に Set を付ける必要があります。

Dim 変数1 As Range
Set 変数1 = Range("A1") ' Object 型には Set を付けて代入する

Dim 変数2 As Object
変数2 = Range("A1") ' エラー、Set がない

Set を忘れると「エラー 91 オブジェクト変数または With ブロック変数が設定されていません。」が発生します。

オブジェクトを扱うときの特徴として オブジェクト.関数オブジェクト.プロパティ のように入力します。そういうものを変数に代入するときは Set を付けるのを忘れないようにします。

変数の値を取得する

変数の値を取得するには 変数名 のように、そのまま変数名を入力します。値を入力するところに変数名を入力すると、その変数の値が使用されます。

Dim tips As Integer
tips = 10

Dim found As Integer
found = tips 
' found = 10 と同じ

関数の引数に変数の値を渡すときも同様に 関数名(変数名) のように入力します。

Dim tips As Integer
tips = 10

Debug.Print(tips)
' Debug.Print(10) と同じ

変数に値を設定する前の初期値は、Integer などの数値型では 0、String では空文字になっています。ただし、値を設定する前に取得するのはバグの原因になります。必ず変数を宣言した直後に初期化するようにします。

グローバル変数を宣言する

関数の中に宣言した変数は、その関数でしか使えません。その関数を抜けると、その変数が削除されます。

関数を抜けた後や他の関数から変数を参照するには、すべての関数より上に Private 変数名 As 型名 のように Private で宣言します。シートや標準モジュールに宣言したら、マクロの実行が終了した後も値が残ります。

Private プライベート変数 As Integer

Sub 実行()
    Call サブ ' 1、再び実行したら 3
    Call サブ ' 2、再び実行したら 4
End Sub

Sub サブ()
    プライベート変数 = プライベート変数 + 1 ' 呼ばれるたびにカウントアップ
    Debug.Print(プライベート変数)
End Sub

Private で宣言した変数は、それを宣言したシートや標準モジュールから使用できます。別ファイルからは参照できません。

別ファイルから変数を参照するには Public 変数名 As 型名 のように Public で宣言します。Public 変数のことを「グローバル変数」と言います。Private と同様に、マクロが終了しても値が残ります。

別ファイルの Public 変数を参照するには ファイル名.変数名 のように、変数の前にそのファイル名を入力して参照できます。標準モジュールの変数は、ファイル名を付けなくても参照できます。

定数や固定長文字列や配列や構造体を Public で宣言するには、標準モジュールにする必要があります。

Sheet1 のコード

Public パブリックシート変数 As Integer

Sub 実行サブ()
    Module1.パブリック標準変数 = 10 ' 標準モジュールの変数を参照する
    パブリック標準変数 = 10         ' 標準モジュールの変数は、変数名だけでも参照できる
End Sub

標準モジュール1 のコード

Public パブリック標準変数 As Integer

Sub 実行モジュール()
    Sheet1.パブリックシート変数 = 10 ' Sheet1 の変数を参照する
End Sub
詳しくは「スコープ」をご覧ください。

変数の初期化

Public や Private の変数はマクロが終了しても値が残ります。続けてマクロを実行すると正常に動作しないことがあります。

このため、マクロを実行したら最初にすべての Public や Private の変数を初期化する必要があります。

Private プライベート変数 As Integer

Sub 実行()
    Call 初期化 ' すべての変数を初期化
    Call サブ   ' 1、再び実行しても 1
    Call サブ   ' 2、再び実行しても 2
End Sub

Sub 初期化()
    プライベート変数 = 0 ' 変数の数だけ初期化
End Sub

Sub サブ()
    プライベート変数 = プライベート変数 + 1 ' 呼ばれるたびにカウントアップ
    Debug.Print(プライベート変数)
End Sub

変数の数が多くなると初期化も大変になります。初期化を忘れることもあるかもしれません。簡単に初期化するには変数をクラスにまとめることです。

Private c As Class1

Sub 実行()
    Call 初期化 ' すべての変数を初期化
    Call サブ   ' 1、再び実行しても 1
    Call サブ   ' 2、再び実行しても 2
End Sub

Sub 初期化()
    Set c = New Class1 ' クラスの変数をすべて初期化
End Sub

Sub サブ()
    c.クラス変数 = c.クラス変数 + 1 ' 呼ばれるたびにカウントアップ
    Debug.Print(c.クラス変数)
End Sub

どれだけ変数が増えてもクラスをインスタンス化 Set c = New Class1 するだけで、その中の変数がすべて初期化されます。クラスは VBA 初心者には難しいので、慣れるまではクラスを使用しない方が簡単です。

変数の宣言を強制する

変数は宣言しなくても使えます。ただし入力ミスで tips が tlps になっていても気づかないで実行されるのでバグの原因になります。

Dim tips As Integer
tips = 10
tlps = 20 ' tlps になっていても気づかずに実行されてしまう
tips = 30

VBA の初期設定では変数を宣言しなくても使える状態です。必ず変数の宣言を強制するのをオススメします。

[ツール] から [オプション] をクリックします。

option

[変数の宣言を強制する] をチェックして [OK] をクリックします。

6

この後に新しいコードを表示すると、コードの先頭に Option Explicit が追加されます。この一行があると、このファイルのコードで変数の宣言が強制されます。既存のコードに勝手に追加されたりはしないので、そのときは手入力します。

Option Explicit の一行を削除すると強制されなくなります。上記の設定はこの一行を追加する設定です。

7

宣言していない変数を使用していると、実行時に「エラー 変数が定義されていません。」が発生してわかるようになります。

79