更新日:、 作成日:

VBA 開発入門の基礎まとめ

はじめに

Excel VBA マクロの開発入門について基礎的なことをすべてまとめています。

VBA が初めての方も、他のプログラミング言語を経験している方も、このページを見れば VBA がどういうものかわかります。

開発環境を表示する

エクセルに開発タブを表示して VBA の開発環境を表示できます。

開発タブを表示

[タブ] を右クリックして [リボンのユーザー設定] をクリックします。

66

メインタブにある [開発] をチェックして [OK] をクリックします。

67

開発タブが表示されます。

68

開発環境を開く

[開発] タブをクリックして [Visual Basic] をクリックします。

77

これが VBA の開発環境です。開発環境のことを IDE と言います。

62

コードを作成する

[開発] タブをクリックして [Visual Basic] をクリックします。

87

プロジェクトウィンドウから [シート] や [標準モジュール] など、コードを入力したい [ファイル] をダブルクリックします。Sheet1 に対して操作をしたいなら Sheet1 にコードを入力します。

75

挿入タブから標準モジュールやクラスを追加できます。下記の「マクロを記録する」で Excel の操作をマクロにすると標準モジュールにコードが出力されます。

76

コードを表示したら Sub 関数を作成します。これが VBA で最初に実行されるコードになります。この関数の中に実行したいコードを入力していきます。

77

マクロを記録する

エクセルの「マクロの記録」機能を使うと、エクセルの操作を自動で VBA のコードに出力してくれます。VBA がわからない方でもマクロを作成できます。

[開発] タブをクリックして [マクロの記録] をクリックします。

88

[マクロ名] を入力して [OK] をクリックします。

78

ここからエクセルの操作が記録されます。セルに値を入力するなど、マクロにしたい操作を行います。

79

マクロの記録を終了するときは [記録終了] をクリックします。

89

標準モジュールが追加され、マクロ名の Sub 関数が作成されます。その中に記録した操作が出力されます。

80

VBA マクロを保存する

VBA マクロが含まれるファイルを保存するには、通常の拡張子 .xlsx では保存できません。マクロ有効ブック .xlsm で保存する必要があります。

VBA マクロが含まれるファイルを保存するときにメッセージが表示されるので [いいえ] をクリックします。

82

[Excel マクロ有効ブック (.xlsm)] を選択して保存します。

83

マクロを有効にする

マクロはエクセルの操作以外にも Windows の操作もできるため、悪意のあるコードも実行できます。信頼できないファイルを開いたときに勝手に実行されないように既定で無効になっています。

VBA マクロが含まれない .xlsx のファイルを開いたときは、マクロが無効な状態でもマクロを作成して実行できます。

VBA マクロを含む .xlsm のファイルを開いたときは、マクロを有効にしないと実行できません。

[ファイル] をクリックして [オプション] をクリックします。

63

[トラストセンター] をクリックして [トラストセンターの設定] をクリックします。

[セキュリティセンター] と表示されるバージョンもあります。
80

[マクロの設定] をクリックし、[警告して、VBA マクロを無効にする] を選択して [OK] をクリックします。

81

VBA マクロを含むファイルを開いたときは、マクロが無効になっています。[コンテンツの有効化] をクリックして、そのファイルだけマクロを有効にできます。

84

コンテンツの有効化したファイルは「信頼済みドキュメント」になり、マクロを無効にしても実行できます。次に開くときもコンテンツの有効化のメッセージは表示されません。

VBA マクロを実行する

作成したマクロを実行する方法を紹介します。

  • VBA の開発環境から実行する:開発者向け
  • マクロを選択して実行する:開発者向け、ユーザー向け
  • ショートカットから実行する:ユーザー向け
  • ボタンから実行する:ユーザー向け

VBA の開発環境から実行する

この方法は開発時に手軽に実行できます。

実行したい [関数] をクリックします。カーソルがある関数が実行する関数になります。

81

F5 キーを入力して実行できます。またはツールバーや [実行] から [Sub/ユーザーフォームの実行] をクリックします。

82

クリックした関数が実行されます。

ボタンから実行する

この方法はボタンなどのコントロールを操作して実行できます。

[開発] タブから [挿入] をクリックして ActiveX コントロールの [コマンド ボタン] をクリックします。

91

[シート] にドラッグしてボタンを貼り付けます。その [ボタン] をダブルクリックします。

41

イベントが作成されます。これはそのボタンをクリックしたときに実行されます。

85

[デザイン モード] をクリックしてオフの状態にします。

92

ボタンをクリックすると、イベントが発生してその処理が実行されます。

44
他の方法について詳しくは「マクロを作成して実行する」をご覧ください。

コンパイル

コンパイルするとコード全体を構文チェックします。関数名を間違えて入力しているなど、不正なコードがあるとエラーで教えてくれます。

[デバッグ] から [VBAProject のコンパイル] をクリックします。

86

コンパイルされます。一度コンパイルすると、コードを編集するまでコンパイルできなくなります。

コンパイルしなくても実行されるコードは、その時に自動でコンパイルされます。コンパイルすると実行する前にエラーがわかります。

デバッグする

F8 キーを入力して実行すると、最初のコードから 1 行ずつステップインして実行できます。

デバッグ用のショートカットキーを使うと便利です。

  • ステップイン:1 行だけ処理を進めます。それが自作の関数なら、関数の中に移動します。
  • ステップオーバー:1 行だけ処理を進めます。それが自作の関数ならその関数の処理をすべて実行します。
  • ステップアウト:今実行している関数を抜けるまで処理を進めます。
20

特定の場所まで処理を進めたいときはブレークポイントを設定します。

ブレークポイントを設定すると、設定した場所で処理が中断し、その時点の変数の状態を確認できます。これを使って意図しない動作になっていないか調べられます。

ブレークポイントを設定するコードの [左側の部分] をクリックします。

16

ブレークポイントが設定されると、その行が赤くなります。ブレークポイントはいくつでも設定でき、もう一度クリックすると解除できます。

17

コードを実行すると、ブレークポイントを設定した行で処理が止まります。黄色くなっている行が、次に実行されるコードです。

18

変数の上にマウスカーソルを合わせると、変数の値を確認できます。

19

処理を再開するには 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 つの要素を持つ配列が作成されます。

1
' 静的(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 + 23
-引き算2 - 11
*掛け算2 * 36
/割り算7 / 23.5
\割り算の商7 \ 23
Mod割り算の余り7 Mod 21
^べき乗2 ^ 38
&文字結合"Tips" & "found""Tipsfound"

比較演算子

If 文などの比較に使う比較演算子を紹介します。結果はすべて Boolean になります。

演算子 演算名 使用例 結果
=等しい1 = 2False
<>等しくない1 <> 2True
>大きい1 > 2False
<小さい1 < 2True
>=以上1 >= 2False
<=以下1 <= 2True

文字列をワイルドカードを使って比較する Like 演算子があります。正規表現を簡単にしたものです。

パターン 説明 使用例 一致例
?任意の 1 文字あい?あいう, あいか, あいも
*0 個以上の文字*ABAB, 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
詳しくは「For 文」をご覧ください。

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 を入力した数だけ分岐を増やせます。

詳しくは「If 文」をご覧ください。

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
詳しくは「Select 文」をご覧ください。

イベント

プロジェクトウィンドウからイベントを作成したい [シート] や [ThisWorkbook] をダブルクリックします。ここでは Sheet1 のイベントを作成します。

8

コードの左上にある (General) から [Worksheet] をクリックします。

ThisWorkbook のときは Workbook をクリックします。
5

コードの右上にある (Declarations) から取得したい [イベント] を選択します。

6

関数が作成されます。これがイベントが発生したときに実行される関数です。この中に、そのイベントが発生したときの処理を書きます。

7

イベントの関数には引数がよくあります。その引数に何が変更されたのかを特定する情報が含まれています。

' 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 ' エラー、値は変更できない
詳しくは「Enum 列挙型」をご覧ください。

構造体

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 な関数を作成すると、他のシートや標準モジュールから呼び出せるようになります。同じコードを何度も書く必要がなくなります。

[挿入] から [標準モジュール] をクリックします。

6

標準モジュールが追加されます。

7

名前を変更するには、その [標準モジュール] を選択した状態で [オブジェクト名] を変更します。

8
詳しくは「標準モジュール」をご覧ください。

クラス

[挿入] から [クラス モジュール] をクリックします。

7

クラスが追加されます。

8

クラス名を変更するには、その [クラス] を選択した状態で [オブジェクト名] を変更します。

9

このクラス名がデータ型の名前になります。

コードを作成

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 キーを入力します。

9

そのキーワードのヘルプが表示されます。

8
Tipsfound ではキーワードや関数を数多く解説していますので、そちらをご覧になると理解が深まると思います。
詳しくは「ヘルプを表示する」をご覧ください。