ExcelVBA Step_4 変数

変数とは

変数とは、取得したプロパティの値や計算結果などを格納しておくためのメモリ領域です。
もう少し分かりやい言葉にすると、変数とは値を代入する「箱」のようなものです。「箱」の中に収められた値は、随時取り出しが可能な状態にあります。「箱」はたくさん使うことができるので、それぞれに名前をつけて区別します。

変数に名前を付ける

変数につける名前(変数名)には、いくつかの決まりごとがあります。
・変数であることが分かる名前を付ける
・どうのような値を格納するのか連想できる名前をつける
・名前の先頭は文字でなければならない
・名前には、スペース、ピリオド、感嘆符、および @ & $ # などの文字は使えない
・名前は半角で数えて255文字以内とする
・Visual Basic の関数、ステートメント、メソッド と同じ名前を使うことはできない
・同じレベルの適用範囲内で同じ名前を使うことはできない

VBAでは日本語の変数名を付けることもできますが、プログラミングの世界では日本語を使わないのが一般です。 英単語が苦手な場合、ローマ字で変数名を付けるとよいでしょう。

明示的な変数の宣言

VBAは、プロシージャの中にキーワード以外の用語を見つけたら、すべてユーザーが独自に定義した変数と判断して処理を進めてしまいます。そのためにスペルミスをしても何のエラーも表示してはくれません。
このようなトラブルを避けるため、「この用語は私が定義する変数です」と、あらかじめ宣言することを義務付けています。宣言されてない用語はエラーとみなすように設定することを[変数の明示的な宣言]といいます。
明示的に宣言するためには、Dimステートメントを使います。 Dimステートメントで宣言しない変数を「暗黙に宣言された変数」と言いますが、これを使うことは好ましくありません。必ずDimで宣言しましょう。
モジュールの先頭にOption Explicitステートメントを記述すると、そのモジュール内では、 Dimステートメントで宣言した変数以外の用語が使えなくなります。
新規モジュールを作成するたびにOption Explicitステートメントが自動的に挿入されるようにするには、次のように操作します。

  1. 「ツール」→「オプション」→「編集」タブをクリックします。
  2. 「変数の宣言を強制する」チェックボックスをオンにします。
  3. 「OK」をクリックします。

変数のデータ型

変数にはデータ型があります。 プログラム中で使用する変数は、あらかじめどのようなデータ型で使用するのかを宣言する必要があります。 変数のデータ型は、Asキーワードを使った構文で変数と一緒に宣言します。
Dim 変数 As データ型

複数の変数を宣言するときに、カンマで区切って宣言することもできます。
Dim 変数1 As データ型,変数2 As データ型,....

《主なデータ型》
データ型 使用メモリ値の範囲
バイト型 (Byte) 1 バイト 0 〜 255
ブール型 (Boolean) 2 バイト 真 (True) または偽 (False)
整数型 (Integer) 2 バイト -32,768 〜 32,767
長整数型 (Long) 4 バイトIntegerより大きい整数( -2,147,483,648 〜 2,147,483,647)を扱う
単精度浮動小数点数型 (Single) 4 バイト小数点を含む数値
-3.402823E38 〜 -1.401298E-45 (負の値) 1.401298E-45 〜 3.402823E38 (正の値)
倍精度浮動小数点数型 (Double) 8 バイト Singleよりも桁の大きい実数
通貨型 (Currency) 8 バイトLongよりも桁の大きな小数点を含む数値を扱う
日付型 (Date) 8 バイト 西暦 100 年 1 月 1 日〜西暦 9999 年 12 月 31 日
文字列型 (String) (可変長) 10 バイト + 文字列の長さ 0 〜 2GB
オブジェクト型 (Object) 4 バイト オブジェクトを参照するデータ型
バリアント型 (Variant) (数値) 16 バイト 倍精度浮動小数点数型の範囲と同じ

《整数型のサンプルプログラム》

Sub シートの枚数()

    '整数型変数の宣言
    Dim sheetcount As Integer
    
    '変数にCountプロパティで数えたシート枚数を代入
    sheetcount = ActiveWorkbook.Worksheets.Count
    
    'メッセージボックスに表示
    MsgBox sheetcount
    
End Sub

《文字列型のサンプルプログラム》
Sub 文字型変数()

    'Dimステートメントで明示的に変数宣言(文字列型)する
     Dim firstbookname As String 

    '最初に開いたブックの名前を、変数に代入する
    firstbookname = Workbooks(1).Name 

    'メッセージボックスに変数の値を表示する。&は文字列を連結する演算子。
    MsgBox "最初に開いたブックは " & firstbookname & "です"

End Sub

《オブジェクト型のサンプルプログラム》
※こののプログラムを実行するには「売上集計」ブックが必要です。

Sub オブジェクトの操作()
 
    'オブジェクト変数の宣言です。
    Dim mysheet As Worksheet 
    
    'Setステートメント使って、オブジェクト変数「mysheet」に、
    'オブジェクトへの参照(売上集計ブックの売上集計シート)を代入しています。
    Set mysheet = Workbooks("売上集計.xls").Worksheets("売上集計") 
    
    'オブジェクト変数を使ってオブジェクトを操作しています。
    mysheet.Range("B3") = "半期売上集計表" 
    
End Sub

型宣言文字

データ型の中には、型を特定するための「型宣言文字」が用意されているものがあります。
次のサンプルプログラムをこのまま実行するとエラーになります。原因はIntegerの限界を超えているからです。
MsgBox a + 1 の部分を MsgBox a + 1&と書き換えて実行すればとエラーにはなりません。

《サンプルプログラム》
Sub 型宣言文字()

    Dim a As Integer
    
    a = 32767
    MsgBox a + 1

End Sub

データ型型宣言文字
整数型%
長整数型&
通貨型@
単精度浮動小数点型!
倍精度浮動小数点型#
文字列型$


変数の型宣言場所


変数の有効期間

変数の有効期間とは、変数が値を持ち続ける期間のことです。
例えば、ローカル変数(プロシージャレベルの変数)の場合、変数はプロシージャの終了時に自動的に消去されるので、有効期間はDimステートメント等で定義されてから、プロシージャが終了するまでです。ただし、プロシージャレベルの変数でも、Staticステートメントで定義するとプロシージャ終了時に消去されず、次にプロシージャを実行したときに前の値が残っています。
レベル 名 前 有効期間
プロシージャ Dimで定義したローカル変数 定義からプロシージャの終了まで
プロシージャ Staticで定義したローカル変数 (スタティック変数) プロジェクトの開始から終了またはリセットまで
プライベート プライベート変数 プロジェクトの開始から終了またはリセットまで
パブリック パブリック変数 プロジェクトの開始から終了またはリセットまで