更新日:、 作成日:
VBA 開発入門の基礎まとめ
はじめに
Excel VBA マクロの開発入門について基礎的なことをすべてまとめています。
VBA が初めての方も、他のプログラミング言語を経験している方も、このページを見れば VBA がどういうものかわかります。
開発環境を表示する
エクセルに開発タブを表示して VBA の開発環境を表示できます。
開発タブを表示
[タブ] を右クリックして [リボンのユーザー設定] をクリックします。
メインタブにある [開発] をチェックして [OK] をクリックします。
開発タブが表示されます。
開発環境を開く
[開発] タブをクリックして [Visual Basic] をクリックします。
これが VBA の開発環境です。開発環境のことを IDE と言います。
スポンサーリンク
コードを作成する
[開発] タブをクリックして [Visual Basic] をクリックします。
プロジェクトウィンドウから [シート] や [標準モジュール] など、コードを入力したい [ファイル] をダブルクリックします。Sheet1 に対して操作をしたいなら Sheet1 にコードを入力します。
挿入タブから標準モジュールやクラスを追加できます。下記の「マクロを記録する」で Excel の操作をマクロにすると標準モジュールにコードが出力されます。
コードを表示したら Sub 関数を作成します。これが VBA で最初に実行されるコードになります。この関数の中に実行したいコードを入力していきます。
マクロを記録する
エクセルの「マクロの記録」機能を使うと、エクセルの操作を自動で VBA のコードに出力してくれます。VBA がわからない方でもマクロを作成できます。
[開発] タブをクリックして [マクロの記録] をクリックします。
[マクロ名] を入力して [OK] をクリックします。
ここからエクセルの操作が記録されます。セルに値を入力するなど、マクロにしたい操作を行います。
マクロの記録を終了するときは [記録終了] をクリックします。
標準モジュールが追加され、マクロ名の Sub 関数が作成されます。その中に記録した操作が出力されます。
VBA マクロを保存する
VBA マクロが含まれるファイルを保存するには、通常の拡張子 .xlsx では保存できません。マクロ有効ブック .xlsm で保存する必要があります。
VBA マクロが含まれるファイルを保存するときにメッセージが表示されるので [いいえ] をクリックします。
[Excel マクロ有効ブック (.xlsm)] を選択して保存します。
マクロを有効にする
VBA マクロが含まれない .xlsx のファイルを開いたときは、マクロが無効な状態でもマクロを作成して実行できます。
VBA マクロを含む .xlsm のファイルを開いたときは、マクロを有効にしないと実行できません。
[ファイル] をクリックして [オプション] をクリックします。
[トラストセンター] をクリックして [トラストセンターの設定] をクリックします。
[マクロの設定] をクリックし、[警告して、VBA マクロを無効にする] を選択して [OK] をクリックします。
VBA マクロを含むファイルを開いたときは、マクロが無効になっています。[コンテンツの有効化] をクリックして、そのファイルだけマクロを有効にできます。
コンテンツの有効化したファイルは「信頼済みドキュメント」になり、マクロを無効にしても実行できます。次に開くときもコンテンツの有効化のメッセージは表示されません。
VBA マクロを実行する
作成したマクロを実行する方法を紹介します。
- VBA の開発環境から実行する:開発者向け
- マクロを選択して実行する:開発者向け、ユーザー向け
- ショートカットから実行する:ユーザー向け
- ボタンから実行する:ユーザー向け
VBA の開発環境から実行する
この方法は開発時に手軽に実行できます。
実行したい [関数] をクリックします。カーソルがある関数が実行する関数になります。
F5 キーを入力して実行できます。またはツールバーや [実行] から [Sub/ユーザーフォームの実行] をクリックします。
クリックした関数が実行されます。
ボタンから実行する
この方法はボタンなどのコントロールを操作して実行できます。
[開発] タブから [挿入] をクリックして ActiveX コントロールの [コマンド ボタン] をクリックします。
[シート] にドラッグしてボタンを貼り付けます。その [ボタン] をダブルクリックします。
イベントが作成されます。これはそのボタンをクリックしたときに実行されます。
[デザイン モード] をクリックしてオフの状態にします。
ボタンをクリックすると、イベントが発生してその処理が実行されます。
コンパイル
コンパイルするとコード全体を構文チェックします。関数名を間違えて入力しているなど、不正なコードがあるとエラーで教えてくれます。
[デバッグ] から [VBAProject のコンパイル] をクリックします。
コンパイルされます。一度コンパイルすると、コードを編集するまでコンパイルできなくなります。
コンパイルしなくても実行されるコードは、その時に自動でコンパイルされます。コンパイルすると実行する前にエラーがわかります。
デバッグする
F8 キーを入力して実行すると、最初のコードから 1 行ずつステップインして実行できます。
デバッグ用のショートカットキーを使うと便利です。
- ステップイン:1 行だけ処理を進めます。それが自作の関数なら、関数の中に移動します。
- ステップオーバー:1 行だけ処理を進めます。それが自作の関数ならその関数の処理をすべて実行します。
- ステップアウト:今実行している関数を抜けるまで処理を進めます。
特定の場所まで処理を進めたいときはブレークポイントを設定します。
ブレークポイントを設定すると、設定した場所で処理が中断し、その時点の変数の状態を確認できます。これを使って意図しない動作になっていないか調べられます。
ブレークポイントを設定するコードの [左側の部分] をクリックします。
ブレークポイントが設定されると、その行が赤くなります。ブレークポイントはいくつでも設定でき、もう一度クリックすると解除できます。
コードを実行すると、ブレークポイントを設定した行で処理が止まります。黄色くなっている行が、次に実行されるコードです。
変数の上にマウスカーソルを合わせると、変数の値を確認できます。
処理を再開するには F8 キー入力して 1 行ずつステップイン実行したり、F5 キーを入力して次のブレークポイントまたは最後まで処理を進められます。
関数
関数には実行だけする Sub 関数と、その結果を戻り値として返す Function 関数の 2 種類があります。
Sub 関数:戻り値を返さない
Sub 関数名() のように入力します。最後に Enter キーを入力すると、自動で End Sub が追加されます。
Sub サブ()
' ここに処理を記載
End Sub
Sub 関数を呼び出すには 関数名 または Call 関数名 のように入力します。
Sub ' 関数を呼び出す
サブ
Call サブ
VBA で最初に実行されるコードが Sub 関数です。そこから別の関数を呼び出して、コードを作成していきます。
Function 関数:戻り値を返す
Function 関数名() As 型名 のように入力します。最後に Enter キーを入力すると、自動で End Function が追加されます。
型名がこの関数の戻り値の型です。関数名に値を代入すると、それが戻り値になります。
Function ファンクション() As String
' ここに処理を記載
ファンクション = "戻り値"
End Function
Function 関数を呼び出すには 関数名 のようにします。Function 関数には戻り値があるので、それを変数などに代入するときは 変数 = 関数名 のようにします。
' Function 関数を呼び出す
Dim s As String
s = ファンクション ' s に "戻り値" が設定される
変数
Dim 変数名 As 型名 のように入力します。Dim が変数を宣言するキーワードです。
Dim 変数 As String
Dim tips As Integer
代入
変数に値を入れることを「代入」すると言います。
変数名 = 値 のように入力します。
Dim tips As Integer
tips = 10 ' tips は 10 になる
変数の宣言と初期化を 1 行ではできません。2 行に分ける必要があります。
Dim 変数 As Integer = 10 ' これはできません。
Dim 変数 As Integer ' 2 行に分ける必要がある
変数 = 10
型の中には Object 型 (参照型) というものがあります。Sheet1 などのワークシートのように、クラスで作成されたものがオブジェクトです。
Set 変数名 = 値 のように、オブジェクト型を代入するには頭に Set を付ける必要があります。
Dim 変数1 As Object
Set 変数1 = Range("A1") ' Object 型は Set を付けて代入する
Dim 変数2 As Object
変数2 = Range("A1") ' エラー、Set がない
取得
変数の値を取得するには 変数名 のように、そのまま変数名を入力します。値を入力するところに変数名を入力すると、その変数の値が使用されます。
Dim tips As Integer
tips = 10
Dim found As Integer
found = tips
' found = 10 と同じ
定数
Const 定数名 As 型名 = 値 のように入力します。Const が定数を宣言するキーワードです。
Const サイト名 As String = "Tipsfound"
Const MAX As Integer = 100
Const 誕生日 As Date = "2000/12/31"
定数は宣言するときだけ値を設定できます。その後は値を変更できません。このため「定数」と言います。
Const 定数 As String = "Tips"
定数 = "found" ' エラー、定数の値は変更できない
スコープ
変数や関数を参照できる範囲を「スコープ」と言います。スコープには次の種類があります。
- Public:他のシートや他の標準モジュールなど、すべてのファイルから参照できる。
- Private:宣言しているシートや標準モジュールなど、そのファイル内から参照できる。
- Dim:宣言した関数の中だけで参照できる。関数には使えない。
' すべてのファイルから参照できる
Public パブリック As Integer
' 宣言しているファイルから参照できる
Private プライベート As Integer
Sub 実行()
' この関数内から参照できる
Dim ローカル As Integer
End Sub
スコープを省略すると、何になるのかは変数や関数などそれぞれで違います。混同しないように省略しないのをオススメします。
配列
配列には要素数が決まっている「静的配列」と、変更できる「動的配列」があります。
静的配列
Dim 変数名(要素数) As 型名 のように入力します。変数を宣言するときの変数名に () を付けると配列になり、要素数も入力すると「静的配列」になります。
() の中に要素数を指定します。3 を指定すると 0 ~ 3 の 4 つの要素を持つ配列が作成されます。
' 静的(0 ~ 3) の 4 つの要素を持つ配列
Dim 静的(3) As Integer
' このように何個も同じ変数を作る必要がなくなる
Dim 数値0 As Integer
Dim 数値1 As Integer
Dim 数値2 As Integer
Dim 数値3 As Integer
動的配列
Dim 変数名() As 型名 のように入力します。宣言時に要素数を省略すると「動的配列」になります。
宣言しただけでは要素を 1 つも持っていない空の配列です。
ReDim 変数名(要素数) で動的配列の要素数を決定します。何度でも要素数を変更できます。
' 要素は 1 つもない動的配列
Dim 動的() As Integer
' 要素数を変更する
ReDim 動的(3) ' 0 ~ 3、Dim 配列(3) と同じ要素数になる
ReDim Preserve 変数名(要素数) のように Preserve を付けても要素数を変更できます。
Dim 動的() As Integer
ReDim Preserve 動的(3)
ReDim で要素数を変更すると、配列に入っていた値はすべて初期化されます。数値型なら 0 になります。Preserve を付けると値が保持されたまま変更できます。
配列の操作
配列の要素を指定するにはインデックス (番号) を使います。
配列(インデックス) で指定したインデックスの要素に対して、値を取得または設定ができます。
' 配列(0 ~ 3) の 4 つの要素を持つ
Dim 配列(3) As Integer
' 配列に値を代入
配列(0) = 0 ' インデックス 0 番目の要素に 0 を代入する
配列(1) = 10 ' インデックス 1 番目の要素に 10 を代入する
' 配列の値を取得
Dim i As Integer
i = 配列(1) ' インデックス 1 番目の要素を取得する
Debug.Print(i) ' 10
i = 配列(2) ' インデックス 2 番目の要素を取得する
Debug.Print(i) ' 20
コメント
' コメント のように入力します。 ' の後ろがすべてコメントになります。
' ここがコメント
Sub 実行()
Dim i As Integer ' ここがコメント
End Sub
データ型
VBA で使用できる型には主に次のものがあります。
型名 | データ型 | 値の例や範囲 |
String | 文字列型 | "文字列" |
Boolean | ブール型 | True または False |
Byte | バイト型 | 0 ~ 255 の整数 |
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 | 日付型 | 西暦100年1月1日 ~ 西暦9999年12月31日 の日付と時刻 |
Object | オブジェクト型 | オブジェクト参照するデータ型 (Worksheet やクラスなど) |
Variant | バリアント型 | なんでも (多様は禁物) |
Type | ユーザー定義型 | Type で定義した型、いわゆる構造体 |
Integer などの数値型に文字列など型に合わない値を代入するとエラーになります。
演算子
算術演算子
計算に使う算術演算子を紹介します。
演算子 | 演算名 | 使用例 | 結果 |
+ | 足し算 | 1 + 2 | 3 |
- | 引き算 | 2 - 1 | 1 |
* | 掛け算 | 2 * 3 | 6 |
/ | 割り算 | 7 / 2 | 3.5 |
\ | 割り算の商 | 7 \ 2 | 3 |
Mod | 割り算の余り | 7 Mod 2 | 1 |
^ | べき乗 | 2 ^ 3 | 8 |
& | 文字結合 | "Tips" & "found" | "Tipsfound" |
比較演算子
If 文などの比較に使う比較演算子を紹介します。結果はすべて Boolean になります。
演算子 | 演算名 | 使用例 | 結果 |
= | 等しい | 1 = 2 | False |
<> | 等しくない | 1 <> 2 | True |
> | 大きい | 1 > 2 | False |
< | 小さい | 1 < 2 | True |
>= | 以上 | 1 >= 2 | False |
<= | 以下 | 1 <= 2 | True |
文字列をワイルドカードを使って比較する Like 演算子があります。正規表現を簡単にしたものです。
パターン | 説明 | 使用例 | 一致例 |
? | 任意の 1 文字 | あい? | あいう, あいか, あいも |
* | 0 個以上の文字 | *AB | AB, 0AB, 10AB |
# | 任意の 1 桁 (0–9) | ## | 10, 22, 59 |
[charlist] | charlist に含まれる任意の 1 文字 | [A-C] [A, H, L]? | A, B, C A1, H2, L3 |
[!charlist] | charlist に含まれない任意の 1 文字 | [!A-C] [!A, B, C]? | D, E, F |
[パターン] | パターンの文字 ? * # [ ] と比較する | [*]? | *あ, *い, *A |
オブジェクト型の参照を比較する Is 演算子があります。
Sheet1 などのオブジェクト (参照型) は = で比較できません。何も入っていないオブジェクト型の変数を比較するには Nothing を使用します。
演算子 | 演算名 | 使用例 | 結果 |
Is | 参照が等しい | Sheets(1) Is Sheets(1) Sheets(1) Is Nothing | True False |
論理演算子
論理演算やビット演算に使う論理演算子を紹介します。
演算子 | 演算名 | 使用例 | 結果 |
And | 論理積 | True And True True And False False And False | True False False |
Or | 論理和 | True Or True True Or False False Or False | True True False |
Not | 論理否定 | Not True Not False | False True |
Xor | 排他的論理和 | True Xor True True Xor False False Xor False | False True False |
For 文
For Next
For Next は指定した回数だけループするときに使います。
For インデックス = 初期値 To 最終値 のように入力し、改行して Next を入力します。その間の処理をループします。
For i = 1 To 3
' ここにループする処理
Next
インデックスには変数を指定します。その値が初期値から最終値になるまで 1 ずつ加算しながらループします。
Dim i As Integer ' インデックス用の変数
' i が 1 から 3 まで 3 回ループする
For i = 1 To 3
Debug.Print(i) ' 1 2 3
Next
For Each
For Each はコレクションのすべての要素をループするときに使います。
For Each 要素 In コレクション のように入力し、改行して Next を入力します。その間の処理をループします。
For Each cell In Range("A1:A3")
' ここにループする処理
Next
要素にはコレクションの要素の型の変数を指定します。コレクションの要素が順番にその変数に設定され、最後の要素までループします。
Dim item As Range ' 要素用の変数
' item にセル A1 ~ A3 が 1 つずつ設定される
For Each item In Range("A1:A3")
Debug.Print(item.Address) ' $A$1 $A$2 $A$3
Next
If 文
Then
条件を満たすときだけ処理を実行します。
If 条件 Then のように入力し、改行して End If を入力します。条件を満たすときだけ If の中の処理が実行されます。そうでないときは、その処理は行われません。
If 0 = 0 Then
Debug.Print("True") ' True、条件を満たしているとき
End If
Else
条件が満たされないときだけ処理を実行します。
If 文の中に Else のように入力します。条件が満たされないときに Else の中の処理が実行されます。
If 0 = 1 Then
Debug.Print("True") ' True、条件を満たしているとき
Else
Debug.Print("False") ' False、条件を満たしていないとき
End If
この Then と Else が If 文の基本的な形です。分岐を増やすには ElseIf を使います。
ElseIf
If 文の分岐を増やせます。
If 文の中に ElseIf 条件 Then のように入力します。Then の条件が満たされないときで、この条件を満たすときに ElseIf の中の処理が実行されます。
Dim i As Integer
i = 2
If i = 0 Then
Debug.Print("0") ' 0、条件を満たしているとき
ElseIf i = 1 Then
Debug.Print("1") ' 1、上の条件が満たされないで、この条件を満たしているとき
ElseIf i = 2 Then
Debug.Print("2") ' 2、上の条件が満たされないで、この条件を満たしているとき
Else
Debug.Print("Else") ' Else、すべての条件を満たしていないとき
End If
Elseif を入力した数だけ分岐を増やせます。
Select 文
Select Case 値 のように入力し、改行して End Select を入力します。その中に Case 比較値 を入力します。値が比較値と同じときに、その Case の処理が実行されます。
Select Case 0 ' この値が
Case 0
Debug.Print("0") ' 0 のとき
Case 1
Debug.Print("1") ' 1 のとき
End Select
次のように比較値には様々な指定ができます。
Dim i As Integer
Select Case i
Case 0
Debug.Print("0") ' i が 0 のとき
Case 1 To 3
Debug.Print("1") ' i が 1 ~ 3 の間のとき
Case Is >= 4
Debug.Print("2") ' i が 4 以上のとき
Case 0, 2 To 3, Is > 5
Debug.Print("3") ' i が 0 または 2 ~ 3 または 5 より大きいとき
Case Else
Debug.Print("4") ' それ以外のとき
End Select
イベント
プロジェクトウィンドウからイベントを作成したい [シート] や [ThisWorkbook] をダブルクリックします。ここでは Sheet1 のイベントを作成します。
コードの左上にある (General) から [Worksheet] をクリックします。
コードの右上にある (Declarations) から取得したい [イベント] を選択します。
関数が作成されます。これがイベントが発生したときに実行される関数です。この中に、そのイベントが発生したときの処理を書きます。
イベントの関数には引数がよくあります。その引数に何が変更されたのかを特定する情報が含まれています。
' Change イベントの Target は変更されたセル
Private Sub Worksheet_Change(ByVal Target As Range)
Target.Font.Color = RGB(255, 0, 0) ' 変更されたセルの文字色を赤にする
End Sub
列挙型 Enum
Enum 列挙型名 のように入力します。Enum が列挙型を宣言するキーワードです。
Enum の中に 要素名 = 値 のように入力します。すべて Long 型の定数値を設定します。
Enum VbMsgBoxResult
vbOK = 1
vbCancel = 2
vbAbort = 3
vbRetry = 4
vbIgnone = 5
vbYes = 6
vbNo = 7
End Enum
列挙体の操作
値を取得するには 列挙型名.要素名 のように入力します。
Dim i As Long
i = VbMsgBoxResult.vbOK ' vbOK の値を取得する
Enum は定数なので値を後から変更できません。
VbMsgBoxResult.vbOK = 2 ' エラー、値は変更できない
構造体
Type 構造体名 のように入力します。Type が構造体を宣言するキーワードです。
Type の中に 要素名 As 型名 のように入力します。要素は変数のように使えます。
Type Point
X As Integer
Y As Integer
End Type
構造体の中に関数やコンストラクトなどは作成できません。変数だけ定義できます。
構造体の操作
構造体名がデータ型になります。その変数を宣言して構造体を操作します。
構造体の変数.要素名 のように入力して、構造体の要素に値を取得または設定できます。
Dim p As Point ' Point 構造体を変数で宣言する
' 値を設定する
p.X = 10
p.Y = 20
' 値を取得する
Dim i As Integer
i = p.X
Debug.Print(i) ' 10
i = p.Y
Debug.Print(i) ' 20
標準モジュール
VBA マクロのコードを書くためのファイルです。
標準モジュールに Public な関数を作成すると、他のシートや標準モジュールから呼び出せるようになります。同じコードを何度も書く必要がなくなります。
[挿入] から [標準モジュール] をクリックします。
標準モジュールが追加されます。
名前を変更するには、その [標準モジュール] を選択した状態で [オブジェクト名] を変更します。
クラス
[挿入] から [クラス モジュール] をクリックします。
クラスが追加されます。
クラス名を変更するには、その [クラス] を選択した状態で [オブジェクト名] を変更します。
このクラス名がデータ型の名前になります。
コードを作成
Sheet1 などのワークシートに対してコードを作成したときと同じように、クラスにコードを作成できます。
' 変数
Public FirstName As String
Public LastName As String
' 関数
Public Function MyName() As String
MyName = FirstName & LastName
End Function
クラスの操作
Dim 変数名 As クラス名 のように、変数や関数などの型としてクラス名を入力します。
Dim c As Class1
実際にクラスを使用するには、インスタンス化する必要があります。
Set 変数名 = New クラス名 のように入力して、その変数に新しいインスタンスを生成します。New がインスタンス化するキーワードです。オブジェクトを変数に代入するには、頭に Set を付けます。
Dim c As Class1
Set c = New Class1 ' インスタンス化
クラスの変数.変数名 や クラスの変数.関数名 のように入力して、そのクラスの変数や関数を参照できます。
' 変数を操作する
c.FirstName = "Tips"
c.LastName = "found"
' 関数を呼び出す
Dim s As String
s = c.MyName
Debug.Print(s) ' Tipsfound
エラー処理
プログラミングではエラーが必ず発生します。故意に発生するエラーもあれば、予想外のエラーもあります。
On Error Resume Next
エラーの発生を無視して処理を続行します。
Sub Tips
On Error Resume Next
Dim list(2) As Integer
Dim num As Integer
num = list(3) ' インデックスエラーが発生する。このエラーが無視される。
Debug.Print(num) ' ここからの処理も行われる num の値は 0 のまま変化なし
End Sub
On Error Go To
エラーが発生したときに指定の行ラベルへ移動します。
行ラベルは ラベル名: のように : を後ろに付けます。
Sub Tips
On Error GoTo Cacth ' エラーが発生したら Cacth へ移動する
Dim list(2) As Integer
Dim num As Integer
num = list(3) ' インデックスエラーが発生する
Debug.Print(num) ' ここからの処理は実行されない
Exit Sub ' エラーが発生ないとき Cacth 以降の処理を行わないように、ここで処理を抜ける
Cacth: ' エラーが発生したらここから処理を続行する
Err.Description ' ここでエラー処理を行う
End Sub
ヘルプ
Excel 2013 以降では、オンライン上の「VBA の言語リファレンス」にあります。インストールされません。
調べたい [キーワード] などをクリックして F1 キーを入力します。
そのキーワードのヘルプが表示されます。
スポンサーリンク