ExcelVBAでマクロを作成するにあたり、基礎的かつ最も重要な変数と定数、配列、スコープ(適用範囲)についての備忘録です。
変数などはデータ型の種類によって宣言の仕方や代入の方法が違います。また、宣言する場所や指定方法によって適用範囲(スコープ)が変わります。
配列には一般的な配列以外に、キーと値を設定する連想配列(Dictionary)があり、状況に応じて使い分けることで全体の処理を高速化することができます。
変数と定数について
変数名の設定ルール
① 変数名には文字(日本語を含む)や数字、アンダーバーのみ使用できる
※そのほかの記号やスペースは使えない
② 変数名の先頭に数字やアンダーバーは使えない
③ 同じ適用範囲で同じ名前は使えない
④ 変数名の長さは半角で255文字まで
定数名の設定ルール
基本的には変数と同じだが、定数名はすべてアルファベット大文字で定義するのが一般的。
例:Const 定数名 As データ型 = 値
「TAX」「消費税」など
※定数を定義するときに値を設定しなかった場合は「構文エラー」となる
※変数とは違い、一度定義した定数の内容はプログラム実行中に変更はできない
データ型の種類
① Dim 変数名 As Long → 整数
② Dim 変数名 As String → 文字列
③ Dim 変数名 As Workbook → ワークブック
④ Dim 変数名 As Worksheet → ワークシート
⑤ Dim 変数名 As Range → セル(範囲)
※③~⑤は「Dim 変数名 As Object」でも可
⑥ Dim 変数名 As Double → 小数点数
⑦ Dim 変数名 As Date → 日付
⑧ Dim 変数名 As Boolern(ブール) → 真偽判定
⑨ Dim 変数名 As Variant → すべてOK(As以降を省略すると全てこれになる)
まとめて宣言する場合は変数名をカンマで区切る
※セルの値を変数に格納する際の注意点
データ型をVariantにしてもエラー値(!N/A)を変数に格納するとエラーになるため注意が必要
その場合はエラー無視(On Error ~)を設定してプログラムがストップするのを回避する
※ブール型の値「True」「False」について
整数に変換するとTrueは「-1」、Falseは「0」になる
但し、ワークシート上ではTrueは「1」、Falseは「0」に変換されるためN関数を使った場合は注意
VBAでブール型の値を整数に変換する関数は「CInt」
変数への代入について
変数に整数や文字列を代入する場合、正式には「Let 変数名 = 値」となる
変数にオブジェクトを代入する場合、正式には「Set 変数名 = 値」となる
但し、「Let」は省略可能なので記述しない。
つまりオブジェクトの代入のみ「Set」を付ける必要がある。(「Set」は省略できないため)
外部オブジェクトライブラリの参照設定とインスタンス作成について
外部のオブジェクトライブラリを使用する場合、参照設定しておくと補完機能が利用できてプログラミングしやすくなる。
但し、その場合はブック単位で参照設定が必要になる。
例:ファイルシステムオブジェクト
■参照設定を使わない場合 (アドインの作成など)
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
■参照設定を使う場合
参照設定から「Microsoft Scripting Runtime」にチェックする
Dim fso As New FileSystemObject
上記いずれかの方法によってファイルシステムオブジェクトのインスタンスを作成する
変数や定数、配列の適用範囲(スコープ)について
<プロシージャレベル>
プロシージャ内で定義された変数はそのプロシージャの外部からは参照できない。
<プライベートなモジュールレベル>
モジュールの先頭の宣言セクション(プロシージャの外側)でDim変数を宣言すると、モジュール内すべてのプロシージャで使用できるプライベートなモジュールレベル変数となる。
※Dimで宣言するより「Private」と明示的に指定する方がよい
<パブリックなモジュールレベル>
モジュールの先頭の宣言セクション(プロシージャの外側)でPublic変数を宣言すると、プロジェクト内のすべてのモジュールのすべてのプロシージャで使用できるパブリックなモジュールレベル変数となる。
※モジュールレベル変数を宣言する場合は必ず「Private」または「Public」で明示的に宣言する
<プロシージャのスコープについて>
イベントプロシージャを除いて、すべてのプロシージャは既定ではパブリックとなっている。
配列について
静的配列
Dim 配列変数名(要素数)
要素数の変更不可
Dim 配列変数名(3) → 要素はインデックス番号0~2の3つとなる
Dim 配列変数名(1 To 3) → 要素はインデックス番号1~3の3つとなる
行頭に「Option Base1」と記述しておけば、配列変数のインデックス番号下限値は1となる
例:Dim 配列変数名(3) → 要素はインデックス番号1~3の3つとなる
※「Option Base0」or「Option Base1」のみ指定可能
以下、配列の取得方法による下限値の違い
・Split関数とFilter関数で作成される配列は、Option Baseの影響を受けることなく常に下限値0となる
・セル範囲から作成される配列はOption Baseの影響を受けずに下限値1の2次元配列になる
・Array関数はOption Baseの指定したとおりに影響を受ける
※Option Baseは使用しない方がよい
動的配列
Dim 配列変数名()
宣言時は要素なし
ReDimによって要素数を何度も変更できるが、配列の要素が全て消えてリセットされるため注意
Dimにて配列変数を宣言する際に要素数の指定に変数を使用するとエラーになる。
そのため、まずは動的配列で宣言し、ReDimにて要素数の指定に変数を使用する。
例:Dim 配列変数名()
ReDim 配列変数名(変数)
Preserveは値を保持したまま配列の要素数を変更できるが、最下限の次元のみ変更できる。
また、要素数は上限値のみ変更可能で、下限値を変更するとエラーになる。
例:ReDim Preserve 配列変数名(要素数1,要素数2)
この場合は「要素数2」のみ変更できる
表の場合は2次元配列となるため、値を保持したまま行数の変更はできず、2次元目の列数のみ変更可能となる。そのため最初は余裕をもって行数を設定し、シートに書き出す際にリサイズする。
Preserveを使用しない場合は1次元目(行数)も変更可能だが、値はすべてリセットされる。
配列の要素の最大または最小インデックス番号の取得方法
LBound(配列変数名) 最小インデックス番号を取得する
UBound(配列変数名) 最大インデックス番号を取得する
UBound(配列変数名,2) 2次元目の最大インデックス番号を取得する
連想配列 (Dictionary)
Dictionaryオブジェクトのインスタンスを作成する
連想配列を作成してキーと値を追加する
Dim 変数名
Set 変数名 = CreateObject("Scripting.Dictionary")
変数名.add キー,値
※セル範囲からキーと値を代入する際は[.Value]で取得しないとエラーになる
変数名(キー)で値を取り出す
連想配列に指定したキーが含まれていれば値を取り出す
If 変数名.Exists(キー) Then
キーが含まれていた場合(True)の処理
Else
キーが含まれていなかった場合(False)の処理
End If
終わりに
今回はExcelVBAのプログラミングにおいて最も重要な変数や配列についての備忘録となりました。
特に、2次元配列と連想配列については使いどころが明確に分かれており、うまく活用することでマクロの処理速度を大幅に向上できるため、必須の知識となります。
では、次回はメインとなるプロシージャについて記録していきます。
コメント