サイトについて      連絡先   検索

VBA 入門、基礎のまとめ

はじめに

Excel VBA マクロの実行の仕方から変数や関数の作成、For 文 IF 文などの構文、エラー処理やデバッグ方法まで、基礎的なことをすべてまとめています。

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

古いバージョンを使用している方は・2007 へ2003 へ

  • 目次
    • コードを作成する
    • マクロを記録する
    • VBA マクロを実行する
    • コンパイル
    • デバッグする
    • 関数
    • 変数
    • 定数
    • スコープ
    • 配列
    • コメント
    • データ型
    • 演算子
    • For 文
    • If 文
    • Select 文
    • イベント
    • 列挙型 Enum
    • 構造体
    • 標準モジュール
    • クラス
    • エラー処理
    • ヘルプ

コードを作成する

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

開発タブが表示されていないときは、先に「使い方」をご覧ください。
87

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

75

挿入タブから標準モジュールやクラスを追加できます。初めのうちは使わなくて大丈夫です。

76

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

77

関数について詳しくは後で紹介します。

マクロを記録する

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

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

88

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

78

セルに文字や数値を入力します。この操作が記録されています。

79

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

89

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

80

VBA マクロを実行する

上記の方法で作成したコードを実行する方法を紹介します。主に次の 3 つのやり方があります。

VBE から実行する

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

実行したい [関数] をクリックします。キャレットがある関数が実行する関数になります。

81

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

82

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

マクロを選択して実行する

この方法はエクセルの画面から実行できます。

[関数] タブから [マクロ] をクリックします。

90

または、関数以外の [場所] をクリックして実行します。

83

実行したい [マクロ] をクリックして [実行] をクリックします。

ここに表示されるのは VBA の Sub 関数と「マクロを記録」で作成したマクロです。
84

選択したマクロが実行されます。

ボタンから実行する

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

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

91

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

41

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

85

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

92

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

44

コンパイル

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

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

86

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

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

デバッグする

デバッグをするためには、ブレークポイントを設定します。設定した場所で処理が中断し、その時点のプログラムの状態を確認できます。これを使って意図しない動作になっていないか調べられます。

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

16

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

17

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

18

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

19

処理を再開するには [デバッグ] から [ステップ イン] などをクリックします。ショートカットキーを使うと便利です。

20

F5キーを入力するか [Sub/ユーザーフォームの実行] ボタンをクリックして、次のブレークポイントまたは最後まで処理を進められます。

関数

関数には実行だけする 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 パブリック 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

オブジェクト型の参照を比較する 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 のイベントを作成します。

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 ' エラー、値は変更できない

構造体

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 ではキーワードや関数を数多く解説していますので、そちらをご覧になると理解が深まると思います。
  • 目次
    • コードを作成する
    • マクロを記録する
    • VBA マクロを実行する
    • コンパイル
    • デバッグする
    • 関数
    • 変数
    • 定数
    • スコープ
    • 配列
    • コメント
    • データ型
    • 演算子
    • For 文
    • If 文
    • Select 文
    • イベント
    • 列挙型 Enum
    • 構造体
    • 標準モジュール
    • クラス
    • エラー処理
    • ヘルプ