変数とは、文字列や数値などの変化する値を、一時的にメモリ上に格納する箱のようなものです。
また、変数には必ず固有の名前が必要になります。
●文字、数値、アンダースコア(_)が使用できる。
●先頭は文字でなければならない。
●記号やスペースは使用できない。
●長さは半角で255文字以内にする。
●Excelの関数、ステートメント、メソッドと同じ名前を使うことは出来ない。
変数を使用する場合は、あらかじめプログラム内で宣言を行います。
宣言をしなくても変数を使用することは出来ますが、変数名としようするデータの種類を宣言しておけばプロシージャの記述がわかり易くなり、無駄なメモリを浪費しなくて済みます。
変数を宣言し、メモリ領域を割り当てます。
構文
Dim 変数名 As データ型
プロシージャが複雑になるにつれ、どうしてもプログラミングミスは増加します。しかし、変数名のスペルミスのようなケアレスミスで頭を悩ませるのは賢いことではありません。
そこで、モジュールの先頭には、Option Explistステートメントを記述することを心がけて下さい。
モジュールの先頭(モジュール宣言セクション「Generral」)にOption Explicitステートメントを記述すると、そのモジュール内では「Dimステートメントで宣言した変数」以外の用語を使うことができなくなります。
この宣言セッション内で宣言された変数は、そのモジュールの全てのプロシージャ内で使用するこtが出来ます。
●変数を全てのモジュールのプロシージャで使用するためには、Dimステートメントではなく、Publicステートメントを、宣言セクション内に宣言して下さい。
◆public 変数 as データ型
| VBエディタ「ツール」「オプション」から変数の宣言を強制する設定を行えます。 | |
| 「Test」プログラム | プログラムの意味 |
| Sub test() Dim a As Integer Dim b As Integer Dim c As Integer a = 10 b = 6 c = a * b Msgbox c End Sub |
変数aを宣言(整数型-32,768〜32767の数値を扱う) 変数aを宣言 変数aを宣言 10を変数aに代入 6を変数bに代入 「a*b」の結果を変数cに代入 メッセージボックスに変数cの値を表示 |
●ステートメントで使用する「=」は、「代入する」という意味になります。
複数の変数を宣言するときは、複数行に分割して記述する方法のほかに、カンマで区切って1行で記述する方法もあります。
| ・複数行で記述 | ・1行で記述する |
| Dim a As Integer Dim b As Integer Dim c As Integer |
Dim a As Integer,b As Integer,c As Integer |
| 算術演算子 | 意味 | 例 |
| + | 2つの数値の和を求めます。 | X + Y |
| - | 2つの数値の差を求めます。 | X - Y |
| * | 2つの数値の積を求めます。 | X * Y |
| / | 2つの数値の商を計算して結果を浮動小数点で返します。 | X / Y |
| ¥ | 2つの数値の商を計算して結果を整数で返します。 | X ¥ Y |
| ^ | 数値のべき乗を求めます。 | X ^ Y |
| Mod | 2つの数値を除算しその剰余を返します。 | X Mod Y |
| データ型 | 使用メモリ | 値の範囲 |
| バイト型(Byte) | 1バイト | 0〜255の数値を扱う |
| ブール型(Boolean) | 2バイト | 真(True)又は偽(False)の値を扱う |
| 整数型(Integer) | 2バイト | -32,768〜32767の数値を扱う |
| 長整数型(Long) | 2バイト | -2,147,483,648〜2,147,483,647の数値を扱う |
| 通貨型(Currency) | 8バイト | 通貨を扱う場合に使用 |
| 日付型(Date) | 8バイト | 日付と時刻を扱う場合に使用 |
| 文字列型(String) | 10バイト+文字列の長さ | 文字列を扱う場合に使用 |
| オブジェクト型(Object) | 4バイト | オブジェクトを扱う場合に使用 |
| バリアント型(Variant) | 16バイト(数値) 22バイト+文字列の長さ(文字列) |
あらゆるデータ型に対応 変数で型を指定しない場合に、認識されるデータ型 |
| 単精度浮動小数点数型(Single) |
4バイト | 小数点を含む数値を扱う |
| 倍精度浮動小数点数型 | 8バイト | 単精度浮動小数点数型よりも大きな桁の小数点を含む数値を扱う。 |
データ型に「オブジェクト型」を指定すると、その変数にはSETステートメントを使用して、オブジェクトの参照を格納できます。
<例>下のサンプル例の場合
データ型に「オブジェクト型」とは(As Worksheet) 、その変数とは(mywsheet)のこと
| Sub オブジェクト変数() Dim mywsheet As Worksheet Set mywsheet = Workbooks("test.xls").Worksheets("sheet1") mywsheet.Range("A1:C5") = "テスト" End Sub |
この宣言により、「mywsheet」はオブジェクト変数になります。 Setステートメントを使って変数「mywsheet」に「Workbooks("test.xls").Worksheets("sheet1")」への参照を代入しています。 |
左の画像が実行結果です。 |
●オブジェクトの参照とは?
オブジェクト変数に代入されるのは、文字列ではありません。
オブジェクト変数には「オブジェクトそのもの」が代入されると考えて差し支えありません。
上記の例では、「Workbooks("test.xls").Worksheets("sheet1")」というオブジェクトを、SETステートメントを使うことによって、これ以降「mywsheet」というオブジェクト変数が、「Workbooks("test.xls").Worksheets("sheet1")」に代わって使用することが出来るようになるのです。
定数とは特定の数値や文字列を格納するメモリの箱のことを言います。
変数はプログラムの実行中に値が変化していくのに対し定数は、変更したり新しい値を代入することは出来ません。
たとえば、消費税の計算でプロシージャ内に「0.05」という数値が頻繁に出てくる場合、税率が改正されるとプロシージャ内に記述されている1.05を全て変更する必要がありますが、定数を宣言している場合は、宣言ステートメント1箇所だけの修正で済みます。
■Constステートメント
-----------------------------------------
構文
Const 定数名 [As データ型] = 値
-----------------------------------------
<例> 消費税を求める
Sub 消費税()
Const zei As Currency =0.05
Range("A1").Value = 500*zei
Range("B1").Value = 500*(1 + zei)
End Sub
「引数」とは、何らかの動作を行う、あるいは処理結果を求める際に、より詳細な条件を設定する為の要素です。
<例>
目の前に花瓶があり、この花瓶を動かします。これをVBA風に説明すると
花瓶 . 移動する。
しかし、これではどこに動かしたらいいのか解りません。
「どこに動かすか」という条件を加えると
花瓶 . 移動する。 場所:=玄関
ここでは架空の「移動する」というメソッドがあり、「場所」が引数です。
引数の条件を設定する為に「:=」という特別な演算記号を用いています。
※「・・・移動する。 場所・・・」移動すると場所の間には、半角スペースが入ります。
<例>
Worksheets.Add After:=Worksheets(2)
「After:=Worksheets(2)」の引数が、「2番目のシートの右に」という指示をAddメソッドに与えている。
制御構造とは、
マクロ記録により一連の操作は自動的に処理することが出来ますが、VBAではセルの値や条件に応じて処理をより柔軟に制御できます。
■条件によって処理を分岐するステートメント(詳しい解説はこちらを参照して下さい。
If 〜 Then
<例>
| Sub テスト01() If Range("A1") = 50 Then Range("A1").Interior.ColorIndex = 6 Else Exit Sub End If |
もし、セル「A1」の数値が50だったら、 セル「A1」を黄色で塗りつぶす それ以外の場合は、 処理を終了します。 |
Select 〜 Case(詳しい解説はこちらを参照してください。)
<例>
| Sub テスト02() Select Case Range("A1") Case Is > 80 Range("B1").Value = "上" Case Is > 60 Range("B1").Value = "中" Case Is > 40 Range("B1").Value = "下" Case Else Range("B1").Value = "規格外" End Select End Sub |
「A1」の値が 80以上の場合は、 「B1」に「上」を代入し 60以上の場合は、 「B1」に「中」を代入し 40以上の場合は、 「B1」に「下」を代入し それ以外の場合は、 「B1」に「規格外」と表示する |
■処理をループするステートメント
For 〜 Next(詳しい解説はこちらを参照してください。)
<例01>
| サンプルプロシージャ | 実行結果 | 解説 |
| Sub テスト03() Dim i As Integer For i = 1 To 5 Cells(i, 1) = "テスト" Next i End Sub |
変数「i」は、1〜5まで繰り返します。 その結果、"テスト"の文字を cells(1,1) cells(2,1) cells(3,1) cells(4,1) cells(5,1) に代入します。 |
<例02>
| サンプルプロシージャ | 実行結果 | 解説 |
| Sub テスト04() Dim i As Integer Dim j As Integer For j = 1 To 3 For i = 1 To 5 Cells(i, j) = "テスト" Next i Next j End Sub |
変数「i」は、1〜5まで繰り返します。 変数「j」は、1〜3まで繰り返します。 その結果、"テスト"の文字を以下の順序でセルに入力します。 cells(1,1) cells(2,1) cells(3,1) cells(4,1) cells(5,1) に代入します。 cells(1,2) cells(2,2) cells(3,2) cells(4,2) cells(5,2) に代入します。 cells(1,3) cells(2,3) cells(3,3) cells(4,3) cells(5,3) に代入します |
Do 〜 Loop(詳しい解説はこちらを参照してください。)
| サンプルプロシージャ | 実行結果 | 解説 |
| Sub テスト05() Range("A1").Select Do ActiveCell.Font.ColorIndex = 3 ActiveCell.Offset(1).Select Loop Until ActiveCell.Value = "" End Sub |
「A1」を選択する アクティブセルのフォントの色を「赤」にする 1つ下のセルに移動する セルの値が空白(””)になるまで繰り返して処理を行う。 |
条件式で使用する演算子は、下記のとうりです。
| 演算子 | 意味 | 例 |
| = | 等しい | X = 10 |
| > | より大きい | X > 10 |
| < | より小さい | X < 10 |
| >= | 以上 | X >= 10 |
| <= | 以下 | X <= 10 |
| <> | 以外 | X <> 10 |
| 演算子 | 意味 | 例 |
| And | 〜かつ〜 | X >= 10 And X <=20 |
| Or | 〜または〜 | X < = 10 Or X > = 20 |
| 演算子 | 意味 | 例 |
| & | 文字列連結 | ”今日は”&”休日”→”今日は休日” |