このページの概要
このページでは、Excel VBA マクロを作成したい人向け、これから独学で勉強を開始する人向けに、Excel VBA マクロを作成するための基礎知識をまとめています。
このページを最初に読むことで、スムーズに Excel VBA マクロ作成の勉強を進めることができるようになることを目的としています。
Excel VBA とマクロとは
Excel VBA とはプログラミング言語のひとつであり、Excel で様々な処理をすることに特化した言語です。
Excel マクロとは、Excel VBA によって作成された一連の処理を行う機能のことです。
Excel マクロを作成するための言語が Excel VBA であるという関係です。
マクロを作成するとはどういうことなのか
マクロを作成するということは「ある機能を持った一連の処理を構築する」ということです。
この一連の処理の中には様々な基礎的要素が含まれています。例えば、
- 値を代入する
- 四則演算を行う
- 条件式の評価を行う
- 繰り返し処理をする
などです。マクロ作成者はこれらの要素を組み合わせて一連の処理を構築します。
マクロはどのツールで作成されてどこに保存されるのか
エクセルには VB エディタという、VBA でマクロを作成するためのエディタが含まれています。
エクセルのファイルを開き、[alt + F11
] を押下してみてください。すると以下画像のようなウィンドウが表示されるはずです。これが VB エディタです。
この画面上でマクロの作成・管理を行います。
この VB エディタで作成されたマクロは、エクセルファイルの中に保存されます。
マクロを含むエクセルファイルの拡張子
エクセルファイルの拡張子は通常は「.xlsx
」です。一方で、マクロを含むエクセルファイルを保存するためには、拡張子を「.xlsm
」(マクロ有効ブック)に変更する必要があります。
マクロを含むエクセルファイルを初めて保存する際には、「名前を付けて保存」を実行し、保存の際に拡張子を「.xlsm
」にする必要があります。
Excel VBA マクロの基礎をマクロを作成しながら学ぶ
ここからは、Excel VBA マクロの基礎を、実際にマクロを作成しながら学んでいきます。
VB エディタの起動と画面の確認
まずはエクセルファイルを新規作成し、そのファイルを開いた後 [alt + F11
] を押下して VB エディタを開いてください。
VB エディタの画面左上に「プロジェクト – VBAProject」と記されたエリアがありることを確認してください。
このエリアの中に、現在開いているエクセルファイル毎にツリー状に情報が表示されています。デフォルトでは、以下のような構造になっていることを確認してください。
- VBAProject (<エクセルファイル名>)
- Microsoft Excel Objects(フォルダ)
- Sheet1 (<シート名>)
- ThisWorkbook
- Microsoft Excel Objects(フォルダ)
次に VB エディタの画面右側の広めのエリアを見てください。デフォルトではグレー表示で何も表示されていませんが、ここは VBA のコード(処理内容)を記述するエリアで、マクロ作成時はこのエリアで作業します。
ここで、プロジェクトエリアの「ThisWorkbook」をダブルクリックしてみてください。
右側のエリアに以下画像のようにテキストエディタが表示されることを確認してください。
このエディタ上で処理内容を記述していくことになります。
標準モジュールの追加
マクロを作成する際はエクセルファイルに対して標準モジュールというものを追加して、その標準モジュールに対して記述していくことが一般的な流れです。
標準モジュールの追加は、プロジェクトエリアで対象のファイルのプロジェクト上で右クリックをして、[挿入 → 標準モジュール] を選択することで行うことができます。
標準モジュールの追加後、プロジェクトエリアで以下がツリーに追加されたことを確認します。
- 標準モジュール
- Module1
マクロの構造【プロシージャ】
プロジェクト欄で「Module1」をダブルクリックしてください。こうすることで VB エディタの右側のエディタエリアに Module1 に対するエディタを表示できます。
画面右側のエリアにエディタが表示されたことを確認します。
右側のエディタエリアに、
sub test
とだけ入力した後、[Enter] を押下してみてください。すると
Sub test()
End Sub
と自動で補完されたはずです。
この Sub test() ~ End Sub
までが一つの塊で、この塊をプロシージャと呼びます。
マクロはプロシージャ単位で実行されます。
この Sub test() ~ End Sub
の間に処理を記述していきます。
VBA の基本的な性質として以下があります。
- 1行につき1つの処理を記述する(別の行に記述した内容は別の処理と認識される)
- 上から下に向かって処理が実行される
- 全角文字を含めるとエラーになる
- 行頭のインデント(半角スペース)は任意に入れることができる
マクロの実行とメッセージボックスの表示
以下のようなメッセージボックスを表示するマクロを作成してみましょう。
今、エディタエリアに以下のように記述されている状態かと思います。
Sub test()
End Sub
ここに以下のように一行追加してください。
Sub test()
MsgBox "こんにちは"
End Sub
なお、追加する行の行頭のスペースは Tab を一度押下すれば OK です。
上記のように、VBA の中でダブルコーテーション「””」で文字を囲うと、囲われた中身はプログラムではない文字列として扱われます。通常は使用できない全角文字もダブルコーテーションの中では使用できます。
では、作成したマクロを実行してみましょう。
マクロの実行は以下の手順で行います。
まずエディタ内のカーソルを、実行したいプロシージャの Sub ~ End Sub
の間のいずれかの位置に持ってきます。
次にマクロを実行します。実行ボタンはメニューバーの中の以下赤枠のボタンです。このボタンをクリックするか、F5 キーを押下することでマクロを実行できます。
マクロを実行した結果、以下のメッセージボックスが表示できましたでしょうか。
おめでとうございます。はじめてのマクロ作成ができましたね。
四則演算をしてみる
次に四則演算をして、その演算結果をメッセージボックスで表示してみましょう。
VBA で四則演算をするためには以下の記号を用います。
以下のように、メッセージボックスの文字列部分を計算式に変えてみてください。メッセージボックスでは、文字列の代わりに計算式を指定して、その計算結果を表示することもできます。
Sub test()
MsgBox 1 + 2
End Sub
このマクロを実行してみてください。以下のように 1 + 2 の計算結果が表示されます。
同様に、引き算、掛け算、割り算も行ってみてください。
◆引き算
Sub test()
MsgBox 10 - 3
End Sub
実行結果:
◆掛け算
Sub test()
MsgBox 10 * 5
End Sub
実行結果:
◆割り算
Sub test()
MsgBox 10 / 5
End Sub
実行結果:
もちろん、もっと長い計算式を記述することも可能です。
◆四則演算を組み合わせた式
Sub test()
MsgBox (10 / 5 + 3 ) * 5
End Sub
実行結果:
なお、掛け算・割り算は足し算・引き算よりも先に実行されるであったり、カッコを使用することで計算順序を制御できるといったルールは一般的な算数式のルールと同じです。
変数を使用してみる
変数とは、プログラム上で使用できるデータ保存用の入れ物です。
変数を使用することで、計算した結果の値を保存して何度も再利用するといったことができます。
VBA において変数を利用する上では以下を覚えておいてください。
- 変数には「型」があり、「型」によって格納できるデータの種類が決まっている
- 変数を利用する前には「変数宣言」を行う
変数の型
変数には様々な「型」がありますが、最初は以下だけ覚えておいてください。
Integer
型 → 整数を格納する型String
型 → 文字列を格納する型
変数宣言の仕方
変数を使用する前に変数宣言をしますが、変数宣言は以下の構文で記述します。
Dim <変数名> as <変数の型>
変数には名前を付ける必要がありますが、以下のルールに従ってください。
- 変数名には[半角/全角]文字、アンダーバー(_)を利用可能で、そのほかの記号やスペースは使えない
- 変数名の先頭が数字やアンダーバー(_)であることはNG
- 長さは半角 255 文字まで
- 予約語(VBAで既に使用されている名前)は使用できない
例えば、mynumber という名前の Integer 型の変数を宣言する場合は以下のようになります。
Dim mynumber As Integer
また、mystring という名前の String 型の変数を宣言する場合は以下のようになります。
Dim mystring As String
変数に値を格納する
変数に値を格納する場合は以下のように「=
」を使用して記述します。
例えば、Integer 型の変数 mynumber を宣言し、その mynumber に 1 + 1 の計算結果を格納するマクロ例は以下です。
Sub test()
Dim mynumber As Integer
mynumber = 1 + 1
End Sub
メッセージボックスを使用して変数の値を表示することができます。上記マクロ例に、mynuber の値をメッセージボックスで表示する処理を追加してみます。
Sub test()
Dim mynumber As Integer
mynumber = 1 + 1
MsgBox mynumber
End Sub
このマクロを実行すると以下が表示されます。
変数 mynumber に格納された値、つまり 1 + 1 の計算結果が表示されています。
String 型の変数には文字列を格納できます。
以下のマクロ例は、String 型の変数 mystring を宣言し、その mystring に「こんにちは」という文字列を格納した後、メッセージボックスで mystring の値を表示します。
Sub test()
Dim mystring As String
mystring = "こんにちは"
MsgBox mystring
End Sub
このマクロを実行すると以下のメッセージが表示されます。
上記のマクロ例は変数を使うまでもない単純な処理内容でしたが、処理が複雑になると変数の活用場面が増えてきます。
エラーを発生させてみよう
既に気付いているかもしれませんが、VB エディタではプログラムを1行書くごとに自動で構文チェックが行われます。
そしてもし構文エラーがある場合はエラーメッセージが表示されます。
例えば、以下のように Dim mynumber as
まで入力した後に Enter を押下してみます。
すると以下のようにエラーメッセージが表示されます。同時に対象行が赤文字で表示されます。
上の例では変数宣言の構文で変数型が入力されていないためエラーになります。
この構文チェック機能があるため、マクロ作成時にはすぐに構文エラーに気づくことができます。
Excel のワークシートのセルの値を取得したりセットしたりしよう
VBA では Excel のワークシート上のセルの値を取得して使用したり、セルに値をセットしたりすることができます。
まず、シート名が「Sheet1」のシートを作成してください。(新規作成した Excel ファイルではデフォルトで存在しているはず)
次に以下のマクロを作成して実行してみてください。(以下をコピペでOKです。)
Sub test()
ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Value = "こんちには"
End Sub
マクロ実行後、Sheet1 シートを表示してみてください。以下のように、A1 セルに「こんにちは」と入力されているはずです。
次に以下のようなマクロを作成してください。(以下をコピペでOKです。)
Sub test()
MsgBox ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Value
End Sub
このマクロを実行すると以下のようにメッセージが表示されるはずです。
上記の例で察したかもしれませんが、シートとセルの値の指定方法は以下の構文です。
細かく上記構文の構造を確認します。
ThishWorkbook
の部分で「このマクロが保存されているファイル」を指定したことになります。
ThisWorkbook.Sheets("<シート名>")
の部分までで、「このマクロが保存されているファイルの<シート名>
シート」を指定したことになります。
ThisWorkbook.Sheets("<シート名>").Cells(<行番号>, <列番号>)
の部分までで、「このマクロが保存されているファイルの<シート名>
シートの【<行番号>
行、<列番号>
列】のセル」を指定したことになります。
セルに対して.Value
と指定すると「そのセルの値」という意味になります。
上記内容から、<シート名>
や <行番号>, <列番号>
の部分に入力する値を変えることによって、対象シートや対象セルを自在に変更することができます。
条件式を理解しよう
条件式とは、計算結果が真(True
)または偽(False
)になる式のことです。
例えば以下のような式が条件式です。
1 < 2
4 < 10
100 = 100
a <= b
これらの式は計算結果が True か False かの何れかになります。
条件式では以下の比較演算子が使用されます。
条件式の値を確認してみましょう。
まず以下のマクロを実行してみてください。
Sub test()
MsgBox 10 < 20
End Sub
以下の表示となるはずです。
条件式は 10 < 20
でした。10 は 20 より小さいため、条件式の値としては真(True)となります。
次にマクロを以下のように変更して実行してみてください。
Sub test()
MsgBox 10 > 20
End Sub
以下のように表示されるはずです。
条件式は 10 > 20
でした。ただ 10 は 20 より小さいため、条件式の値としては偽(False)となります。
この条件式は、条件分岐処理(If文)やその他さまざまな場面で使用することになります。
文字列の比較
比較演算子の =
や <>
は、数値同士の比較においては「(値が)等しい」「(値が)等しくない」という意味で用いられましたが、文字列同士の比較にも使用されます。
例えば、以下のマクロを実行してみてください。
Sub test()
MsgBox "あいうえお" = "あいうえお"
End Sub
結果は以下のようになります。
「あいうえお」と「あいうえお」は等しい文字列のため、結果は True となります。
また以下のマクロを実行してみてください。
Sub test()
MsgBox "あいうえお" <> "あいうえお"
End Sub
結果は以下のようになります。
「あいうえお」と「あいうえお」は等しい文字列のため、結果は False となります。
条件分岐を理解しよう
条件分岐とは、条件式の評価結果に基づいて処理内容を変えることです。
If 文【最もシンプルな条件分岐】
条件分岐をするためには If 文 を利用します。
まず以下のマクロを実行してみてください。
Sub test()
Dim mynumber As Integer
mynumber = 5
If mynumber < 10 Then
MsgBox "mynumberは10より小さい"
End If
End Sub
このマクロを実行すると以下のメッセージが表示されます。
次に、上記マクロの mynumber への値の代入部分で 5 ではなく 20 を代入するよう変更してください。
Sub test()
Dim mynumber As Integer
mynumber = 20
If mynumber < 10 Then
MsgBox "mynumberは10より小さい"
End If
End Sub
この変更後のマクロを実行すると、何も表示されないはずです。
変数 mynumber の値によって処理内容が変わったことになります。これが条件分岐です。
条件分岐のために利用した If 文の構文は以下です。
条件式が True の時のみ何らかの処理を行いたい場合に、この If 文を利用します。
If ElseIf 文【複数の条件式がある場合】
複数の条件式を続けて評価し、最初にTrueとなった条件式に対応する処理を実施することができます。
この場合は If ElseIf 文を利用します。
まず以下のマクロを実行してみてください。
Sub test()
Dim mynumber As Integer
mynumber = 3
If mynumber < 5 Then
MsgBox "mynumberは5より小さい"
ElseIf mynumber < 10 Then
MsgBox "mynumberは10より小さい"
End If
End Sub
このマクロを実行すると以下のメッセージが表示されます。
次に、上記マクロの mynumber への値の代入部分で 3 ではなく 8 を代入するよう変更してください。
Sub test()
Dim mynumber As Integer
mynumber = 8
If mynumber < 5 Then
MsgBox "mynumberは5より小さい"
ElseIf mynumber < 10 Then
MsgBox "mynumberは10より小さい"
End If
End Sub
このマクロを実行すると以下のメッセージが表示されます。
mynumber の値によって異なるメッセージが表示されたことが分かるかと思います。
If ElseIf 文を利用するとこのように条件式によって処理内容を変更することができます。
If ElseIf 文を利用する際の注意点として、条件式は上側から順に評価されていき、一番最初に True となる条件式を見つけた時点で処理内容が決定され、以降の条件式は無視される点があります。このため、条件式の記載順序に注意してください。
If Else 文【条件式に合致しない場合の処理】
If 文または If ElseIf 文ですべての条件式が False の場合に何らかの処理を行いたい場合は、
If Else 文を利用します。
以下のマクロを実行してみてください。
Sub test()
Dim mynumber As Integer
mynumber = 8
If mynumber < 5 Then
MsgBox "mynumberは5より小さい"
Else
MsgBox "mynumberは5以上"
End If
End Sub
実行結果として以下の表示になるかと思います。
上記マクロで記述していた条件式は mynumber < 5
でしたが、これに合致しない場合の処理が実行されています。
以下のように、If Else 文には任意に ElseIf ~ then を追加することができます。
Sub test()
Dim mynumber As Integer
mynumber = 8
If mynumber < 5 Then
MsgBox "mynumberは5より小さい"
ElseIf mynumber < 10 Then
MsgBox "mynumberは10より小さい"
Else
MsgBox "mynumberは10以上"
End If
End Sub
繰り返し処理を理解しよう
マクロの処理の中で、同じような処理を繰り返すことが良くあります。
同じような処理を繰り返す場合に、VBA で同じ内容を何度も繰り返し記述することも可能ですが、非常に効率が良くないです。
ここで、繰り返し処理を行うための For 文があります。
まずわかりやすい例として、以下のようなマクロがあったとします。
Sub test()
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
MsgBox "こんにちは"
End Sub
上記マクロはメッセージボックスで「こんにちは」と表示することを10回繰り返します。
このマクロを For 文を使用して書き換えると以下のようになります。
Sub test()
Dim i As Integer
For i = 1 To 10
MsgBox "こんにちは"
Next
End Sub
上記2つのマクロで処理内容は全く同じですが、マクロの内容としては For 文を使用した方がより短くすっきりしているかと思います。
For 文の構文は以下の通りです。
シンプルな例で For 文の動きを説明します。
以下のマクロは、For 文で繰り返しメッセージボックスを表示し、その内容として変数 i の値を表示します。
Sub test()
Dim i As Integer
For i = 1 To 10
MsgBox "i の値:" & i
Next
End Sub
このマクロを実行すると、以下の順でメッセージが表示されます。
i の値:1
i の値:2
i の値:3
i の値:4
i の値:5
i の値:6
i の値:7
i の値:8
i の値:9
i の値:10
上記の実行結果から、変数 i の値は 1 から開始され、For 文内の処理が一度実行されるたびに変数 i の値が 1 加算され(マクロ内で For 文の Step を省略しているので 1 ずつ加算される)、i の値が 10 のときの繰り返し処理を行った後、For 文の処理が停止したことが分かります。(For 文 を抜けた時点で i の値は 11 になっている。)
For 文で使用されている変数の値が、For 文内の処理が繰り返されるごとに変わっていくことを利用することが良くあります。
例えば、以下のマクロでは、シートのA1セルからA10セルまでの値に「こんにちは」をセットするマクロです。
Sub test()
Dim i As Integer
For i = 1 To 10
ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value = "こんにちは"
Next
End Sub
このマクロを実行すると、以下のようにシートのセルに値がセットされます。
For 文の変数 i とセルの行数を対応付けることで、For 文を使用して一定範囲内のセルに値をセットしています。
オブジェクトとプロパティを理解しよう
Excel VBA マクロを作成していると「オブジェクト」というものを扱う必要が出てきます。
オブジェクトとは、プロパティと呼ばれる様々な値を持つ「もの」です。
例えば、以下の「もの」はオブジェクトです。
- ワークブック
- ワークシート
- セル、セル範囲
- 行、列
さらに、例えばセルについていうと以下の値は「プロパティ」です。
- セルの値
- フォント
- 背景色
- 罫線
プロパティは、<オブジェクト>.<プロパティ> = <値>
のように、ピリオド「.」を使用した形式で記述します。
例:
- セルの値
- Cells(i,j).Value = <値>
- セルのフォントカラー
- Cells(i,j).Font.Color = <色>
- セルの背景色
- Cells(i,j).Interior.Color = <色>
- セルの罫線のスタイル
- Cells(i,j).Borders.LineStyle = <罫線スタイル>
ここで実際にマクロを動かして確認してみましょう。
まず「Sheet1」という名前のシートを作成してください。※Excelファイル作成直後であれば存在するはず
次に以下のマクロを作成し、実行してみてください。
Sub test()
ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Value = "こんにちは"
ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Font.Color = RGB(255, 0, 0)
End Sub
マクロ実行後「Sheet1」シートを表示してみると、以下のようにA1セルに赤字で「こんにちは」と入力されているはずです。
次に以下のようにマクロの2行目の RGB(255, 0, 0)
の部分を RGB(0, 255, 0)
に変えてから実行してみてください。
Sub test()
ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Value = "こんにちは"
ThisWorkbook.Sheets("Sheet1").Cells(1, 1).Font.Color = RGB(0, 255, 0)
End Sub
マクロ実行後「Sheet1」シートを表示してみると、以下のようにA1セルに緑字で「こんにちは」と入力されているはずです。
オブジェクトを変数に格納する
オブジェクトを変数に格納することができます。
このとき、変数の型はそのオブジェクト用の型である必要があります。
例えば、シートのセルを格納するためには Range 型の変数が必要になります。
以下のマクロでは、Range
型の変数 mycell
に対してセルを格納した後、変数を利用してセルのプロパティを設定しています。
Sub test()
Dim mycell As Range
Set mycell = ThisWorkbook.Sheets("Sheet1").Cells(1, 1)
mycell.Value = "こんにちは"
mycell.Font.Color = RGB(255, 0, 0)
End Sub
注意点として、オブジェクトを変数に格納する際の構文は以下です。
オブジェクトの場合は先頭に Set
が必要となるため注意してください。
良く扱うオブジェクトとしてワークシートがあります。
ワークシートを格納する変数の型は Worksheet
です。
以下のマクロでは、Worksheet
型の変数 mysheet
にワークシート ThisWorkbook.Sheets("Sheet1")
を格納して使用しています。
Sub test()
Dim mysheet As Worksheet
Set mysheet = ThisWorkbook.Sheets("Sheet1")
mysheet.Cells(1, 1).Value = "こんばんわ"
mysheet.Cells(1, 1).Font.Color = RGB(0, 0, 255)
End Sub
ワークシートに関して良く使うプロパティとしては、シート名を示す Name
があります。
以下のマクロでは、ワークシート mysheet のシート名をメッセージボックスで表示します。
Sub test()
Dim mysheet As Worksheet
Set mysheet = ThisWorkbook.Sheets("Sheet1")
MsgBox mysheet.Name
End Sub
このマクロを実行すると、以下のメッセージが表示されます。
Sheet1
シート上の図形がクリックされたらマクロを実行させてみよう
ここまでは作成したマクロの実行は VB エディタ上で行っていましたが、マクロを実行するためにユーザに VB エディタを開いて実行してもらうのは現実的ではありません。
エクセルのユーザがシート上でマクロを実行できるのが理想です。
ここで、シート上の図形がクリックされたらマクロを実行させるようにすることができます。
例を示しながらその方法を説明します。
まず、サンプルマクロとして以下のマクロを作成しておきます。
Sub test()
MsgBox "こんにちは"
End Sub
次に、シート上に四角形の図形を追加し、テキストを「マクロ実行」とします。
次に、追加した図形上で右クリックし、「マクロの登録」をクリックします。
すると以下の画面が表示されます。リストの中に作成済みマクロのリストが表示されるため、実行させたいマクロをクリックして選択した後、「OK」をクリックします。
これで準備は完了です。シート上の図形をクリックしてみてください。するとマクロが実行され、メッセージボックスが表示されるはずです。
このように、シート上に図形を設置して実行ボタンとして使用することは良く行われます。