Excel VBA スタンダードの暗記項目まとめ【第二章 変数の活用】
この記事では、VBAエキスパートの「Excel VBA スタンダード」の受験用に、暗記すべき項目について、公式の試験範囲の第二章をまとめました。
とくに暗記すべきところは「太文字」や「表」でまとめてあります。とくにステートメントやメソッド、プロパティについては、記述できるレベルまで仕上げておくことをおすすめします。
この記事では暗記を優先するため、解説をできるだけ省いています。学習未経験の人は、Excel VBA スタンダードの公式テキストなどで試験範囲の内容に目を通してからの利用を推奨します。
また、公式テキストに掲載されていないなど、試験に出る可能性の低い内容の解説は、基本的に割愛しています。
Excel VBA スタンダード 第二章 変数の活用
2.1 データの個数を数える、値を合計する(2019年5月改訂で追加)
数値の演算
例えば、Aという変数に1を加算する場合は、「A = A + 1」となります。
また、セル(1,1)に入力されている値を加算する場合、「A = A + Cells(1, 1)」となります。
本番の試験対策としては、ForやIfステートメントの中で、演算を行った値がいくつになるかを判断できるようにしましょう。
文字列の結合
文字列を結合する場合は「&」を使います。以下の例では、セルA1に「マントヒヒ」と入力されます。
Sub Macro1()
Range("A1") = "マント" & "ヒヒ"
End Sub
試験範囲外の補足。
公式テキストでは紹介されていませんが、「&」ではなく「+」でも文字列の結合ができます。ただし、変数A、Bを「A + B」のように結合しようとした場合、変数A、Bに数値が格納されていると、数値同士が加算されてしまいます。
文字列の結合を意図した処理であれば、「&」を使った方が確実な処理ができるでしょう。
2.2 配列
配列は「Dim 配列名(要素数 – 1) As データ型」で宣言できます。配列の個別の値を識別するための番号をインデックス番号と呼びます。
以下の例では、MsgBoxの表示が「マントヒヒとバブーンとマンドリルとチンパンジー」になります。
Sub Macro1()
Dim Animals(3) As String
Animals(0) = "マントヒヒ"
Animals(1) = "バブーン"
Animals(2) = "マンドリル"
Animals(3) = "チンパンジー"
MsgBox Animals(0) & "と" & Animals(1) & "と" & Animals(2) & "と" & Animals(3)
End Sub
配列の宣言は「Dim 配列名(下限 To 上限) As データ型」とすることも可能です。この場合、インデックス番号は下限から始まります。
例えば、上の例で「Dim Animals(1 To 4) As String」としてしまうと、「Animals(0) = “マントヒヒ"」の部分で「インデックスが有効範囲にありません」とエラーが発生します。
SplitとUBound
Splitは文字列を一定の文字で区切り、配列にできる関数です。以下のように利用します。
Sub Macro1()
Dim Animals As Variant
Animals = Split("マント・ヒヒ", "・")
MsgBox Animals(1)
MsgBox UBound(Animals)
End Sub
例では、「マント・ヒヒ」が「・」で分割されるため、Animalsに「マント」と「ヒヒ」が分かれて格納されます。その結果、1つ目のMsgBoxでは「ヒヒ」が表示されます(Animals(0)の内容が「マント」になります)。
VBAには配列を受け取る専用の型がないので、Split関数の返す値は「Variant」で受け取ることになります。
また、UBound関数を利用すると、配列の上限値を得ることができます。「UBound(配列)」で利用することができ、上の例の2つの目のMsgBoxは、上限値である「1」が表示されます。
動的配列(ReDimとPreserve)
動的配列では、以下のように要素数を指定しないで宣言することができます。
Dim Animals() As String
マクロの途中で要素数を指定する際は、ReDimという命令を使い「ReDim 配列名(要素数)」のように要素数を指定できます。
ReDimは実行の度に配列に格納されていた値が消えてしまいます。消さずに要素数を変更する場合は「Redim Preserve 配列名(要素数)」のように利用します。
以下の例では、一つ目のMsgBoxではAnimal(1)とAnimal(2)の値が消え、「とと哲学するマントヒヒ」と表示されますが、二つ目のMsgBoxではAnimal(3)の値を保存したままになるので「ヒヒとマントヒヒと哲学するマントヒヒと狒々山」と表示されます。
Sub Macro1()
Dim Animals() As Variant
ReDim Animals(1 To 3)
Animals(1) = "ヒヒ"
Animals(2) = "マントヒヒ"
ReDim Animals(3)
Animals(3) = "哲学するマントヒヒ"
MsgBox Animals(1) & "と" & Animals(2) & "と" & Animals(3)
ReDim Preserve Animals(4)
Animals(1) = "ヒヒ"
Animals(2) = "マントヒヒ"
Animals(4) = "狒々山"
MsgBox Animals(1) & "と" & Animals(2) & "と" & Animals(3) & "と" & Animals(4)
End Sub
2.3 オブジェクト変数
オブジェクト変数の宣言
オブジェクト変数とは、オブジェクトを格納する変数です。オブジェクト変数では、そのオブジェクトが持つプロパティやメソッドが使用できます。
- Dim オブジェクト変数名 As Range:セルを格納する
- Dim オブジェクト変数名 As Worksheet:ワークシートを格納する
- Dim オブジェクト変数名 As Workbook:ブックを格納する
- Dim オブジェクト変数名 As Object:全てのオブジェクトを格納できる
試験範囲外ですが、WordやOutlookもオブジェクトとして比較的簡単に扱うことができます(というか、そこがVBAの強み)。
ネット上に利用方法が色々紹介されていますので、簡単に業務効率化ができることもあります(Word文書のPDF化や定型文のメール作成など)。
オブジェクトを格納する
オブジェクト変数にオブジェクトを格納する場合は、「Set オブジェクト変数名 = オブジェクト」のように記述します。
また、オブジェクト変数を破棄する場合は「Set オブジェクト変数名 = Nothing」として、Nothingを代入します。
ちなみに、試験には出ないと思いますが、Functionでオブジェクト変数を返す場合も「Set Function名 = オブジェクト」のように利用します。
エラーになる利用方法
公式テキストには載っていませんが、実際の試験で問われるレベルなので紹介します。
以下のコードを実行した場合、6行目で、Sheet1のセルA1に値を代入する処理は成功しますが、オブジェクト変数を使い「B.A.Value = “マントヒヒ"」とすると、エラーが発生します。
Sub Macro1()
Dim A As Object, B As Object
Set A = Range("A1")
Set B = Worksheets("Sheet1")
Worksheets("Sheet1").Range("A1").Value = "マントヒヒ"
B.A.Value = "マントヒヒ"
End Sub
<<第一章 プロシージャへ | 第三章 ステートメントへ>>