6-1.変数

今回は、プログラミングで非常に重要な変数について説明します。
変数を使えるようになると、プログラミングでできることが大幅に増えます。

変数とは

変数とは、データを格納・使用することができる、データの箱のようなものです。
VBAでは、変数の宣言(定義)⇒変数にデータを格納⇒変数内のデータを使用、といった手順で変数を使用します

定数との違いは、定数は一度格納したデータを変更できませんが、変数は処理の中で適宜データを変更することができます。

変数の宣言

変数の宣言は、Dimステートメントを使用します。
ステートメント内で、変数名と変数のデータ型を定義します。

○構文
Dim 変数名 as データ型

データ型の指定を省略すると、すべてのデータ型に対応するVariant型になります。
特に、複数の変数を1行で宣言する場合、1つ1つの変数にデータ型を指定しないと、データ型を省略した変数がVariant型になってしまいます。(サンプルコードの例をご覧ください)

変数名のルール

変数名は、ある程度自由に独自の名前を付けることができますが、いくつかルールがあります。

  • 変数名で使える文字は、英字(大文字・小文字)、数字、ひらがな、カタカナ、漢字、_(アンダーバー)※記号は、アンダーバー以外使えません
  • 先頭に数字を使用することはできない
  • VBAの予約語と同じ名前は使用できない
    予約語:オブジェクト名や関数、ステートメントなど、VBAで既に使用されている名前
  • 変数名は重複できない(同じ変数名は使用できない)
  • 変数名の長さは半角255字以内

変数名の付け方

前述のルール内であれば、変数名は自由に付けれますが、よく使われている命名方法があります。

  • ハンガリアン記法:変数のデータ型を先頭か最後に付ける記法
    例)strName、lngNumber(str:文字列、lng:長整数)
  • スネーク記法:単語の間にアンダーバーを用いる記法
    例)target_sheet、book_name
  • キャメル記法:単語の先頭を大文字にする記法
    例)TargetSheet、BookName
  • ローワーキャメル記法:先頭の単語のみ小文字にするキャメル記法
    例)targetSheet、bookName

上記以外で、iやjなど、アルファベット1文字の変数をよく見かけます。
これは繰り返し処理などでよく使われますが、1から順に数をカウントする際などに使用されます。

データ型

データ型とは、文字列や整数などのデータの種類のことを言います。

変数を定義する際に、その変数に格納するデータの種類ごとに、変数のデータ型を指定します。
指定したデータ型以外のデータを変数に格納しようとすると、エラーになります。

変数のデータ型の宣言は、データ型名称での指定、または、型宣言文字による指定が可能です。
ただし、データ型名称での指定の方が、解読性が良いです。

VBAで使用できるデータ型は、下表の通りです。

データ型型宣言文字内容
Variant全てのデータ型に対応
Objectオブジェクト
格納したオブジェクトそのものとして使用可能であり、
格納したオブジェクトのプロパティやメソッドを適用できる
String$文字列
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日付と時刻
BooleanTrue/False
Byte0~255の正の整数値

オブジェクト型変数の中には、下表の例のように、ブックやシート固有のデータ型が存在します。

オブジェクトデータ型
ワークブックWorkbook
ワークシートWorksheet
セルRange

オブジェクトを変数に格納する際は、Object型での指定で問題ありませんが、変数に格納するオブジェクトがブックのみ、シートのみなど、あらかじめ決まっている場合は、各オブジェクト固有のデータ型を指定する方が便利です。

固有のデータ型を使用することで、コードを記述する際に、各オブジェクトのプロパティやメソッドの入力候補を表示することができます。

サンプルコード

Sub 変数の定義()
    
    'データ型による宣言
    'Variant型の指定
    Dim var As Variant
    Dim var
    '文字列型や整数型の指定
    Dim str As String
    Dim lng As Long
    
    '宣言文字による宣言
    Dim str@
    Dim lng&
    
    '1文で複数の変数を宣言
    Dim str As String, lng As Long
    
    '※途中のデータ型を省略すると、str1はVariant型、str2はString型になります
    Dim str1, str2 As String
    
    'カウント用変数の宣言
    Dim i, j, k
    
End Sub

変数の適用範囲

ここからは、変数について、少し踏み込んだ話になります。
一旦飛ばしていただいても構いませんので、飛ばしたい方は、次にデータの格納をご覧ください。

変数は宣言をする場所で使用できる範囲が変わりますが、この範囲のことを適用範囲(スコープ)といいます。

例えば、あるプロシージャ内で宣言した変数は、そのプロシージャ内でのみ使用できます。
仮に、同じ名前・同じデータ型の変数を、別のプロシージャで宣言した場合、その変数は単に同じ名前・データ型というだけで、まったく別の変数になります。

変数の適用範囲は、主にモジュールレベルプロシージャレベルに分かれます。

  • モジュールレベル:同一モジュール内であれば、すべてのプロシージャで使用可能
    宣言セクション内で宣言
  • プロシージャレベル:宣言したプロシージャ内でのみ使用可能
    プロシージャ内で宣言
適用範囲(スコープ)

Dimステートメント以外の宣言方法

変数の宣言は、Dimステートメント以外に、Public、Private、Staticがあります。
それぞれ適用範囲や処理のされ方に違いがあります。

種類宣言場所構文適用範囲備考
Public宣言セクションPublic 変数 as データ型複数のモジュール
Private宣言セクションPrivate 変数 as データ型モジュール
Dim宣言セクション/
プロシージャ
Dim 変数 as データ型モジュール/プロシージャ
StaticプロシージャStatic 変数 as データ型プロシージャプロシージャの処理が終了しても、変数内のデータを保持

PrivateはDimとほぼ同じですが、Privateはモジュールレベルでしか使用できないという違いがあります。

また、変数は処理が終了するとデータが解放されますが、Staticで宣言すると、処理が終了しても変数内のデータを保持することができます。

データの格納

変数へデータを格納する際は、オブジェクト型かそれ以外かで違います。

  • オブジェクト型変数の場合:Set 変数 = データ
  • それ以外の場合:変数 = データ

変数にデータを格納すると、変数を宣言したプロシージャの処理が継続している間は、変数内にデータが保持された状態となります。処理が終了した時点で、変数内のデータが解放されます。

ただし、オブジェクト型変数は、処理の途中でNothingを格納することで、データを解放できます。

サンプルコード

Sub 変数への格納()
    
    'オブジェクト型変数への格納
    Dim obj As Object
    Set obj = Workbooks(1)
    
    Dim sh As Worksheet
    Set sh = obj.Worksheets(1)
    
    'オブジェクト型変数以外への格納
    Dim str As String
    str = "abc"
    
    Dim lng As Long
    lng = 1
    
    'オブジェクト型変数の解放
    Set obj = Nothing
    
End Sub

変数の使用

変数に格納したデータは、プロシージャが継続している間、または、変数に新たにデータを格納するまでは、好きなタイミングで参照することができます。

サンプルコード

Sub 変数内のデータの使用()

    Dim var As Variant
    var = 1
    
    '変数内のデータを取得
    MsgBox var
    '>>> 1
    
    '変数内のデータを使用して変数を上書き
    var = var + 1
    MsgBox var
    '>>> 2
    
    'オブジェクト型変数の使用
    Dim bk As Workbook
    Set bk = Workbooks(1)
    bk.Activate
    
End Sub

コメント