Excel VBAと「プロシージャ」の関係をイメージする
Excel VBA では、コードはバラバラに書くのではなく、「プロシージャ」という単位にまとめて書きます。
プロシージャは「意味のあるひと固まりの処理」のことです。
人間の言葉にすると、こうなります。
「この一連の作業を、まとめて『この名前の手順』として登録しておく」
その「名前付きの手順」が、VBAでいうプロシージャです。
Excelでマクロを実行するとき、実行対象になるのは「プロシージャ」です。
つまり、プロシージャを作れるようになる=自分でマクロを作れるようになる、ということです。
プロシージャにはどんな種類があるか
SubプロシージャとFunctionプロシージャ
VBAのプロシージャには主に二種類あります。
Subプロシージャ
Functionプロシージャ
超初心者の段階では、まず Sub プロシージャだけをしっかり押さえれば十分です。
Function は「値を返す関数」で、少し先のステップで学ぶイメージでOKです。
ここでは「プロシージャ作成=Subプロシージャを作ること」として説明していきます。
Subプロシージャの基本構造をかみ砕く
形(構文)をまず覚える
Subプロシージャは、必ず次のような形で書きます。
Sub プロシージャ名()
' ここに処理を書く
End Sub
VB上から順に意味を分解すると、こうなります。
Sub … ()
「ここから一つの手順(プロシージャ)が始まります」という宣言です。
「プロシージャ名」の部分は、あなたが自由に決める名前です。
(中身)
実際にやりたい処理を、1行ずつ書いていきます。
End Sub
「このプロシージャはここで終わりです」という区切りです。
この「Sub ~ End Sub」で一つの箱を作り、その中に命令を並べていく、というイメージです。
プロシージャ名の役割
プロシージャ名は、次の二つの意味を持ちます。
マクロ一覧に表示される名前
他のプロシージャから呼び出すときの「呼び名」
たとえば、次のように書いたとします。
Sub Greeting()
MsgBox "こんにちは!"
End Sub
VBこの場合、「Greeting」がプロシージャ名です。
マクロの実行画面にも「Greeting」と表示されますし、他のプロシージャから呼び出すときも Greeting という名前を使います。
実際にプロシージャを作ってみる(例題)
ここからは、標準モジュールに Subプロシージャを作る流れを、手を動かすイメージで説明します。
例題1:メッセージを表示するだけのプロシージャ
標準モジュール(Module1 など)のコードウィンドウに、次のコードを書いてみてください。
Sub あいさつ()
MsgBox "Excel VBAの世界へようこそ!"
End Sub
VBこのプロシージャは、「あいさつ」という名前のマクロです。
実行すると、メッセージボックスで「Excel VBAの世界へようこそ!」と表示されます。
中身を分解すると、こうなります。
Sub あいさつ()
プロシージャの開始宣言。名前は「あいさつ」。
MsgBox “Excel VBAの世界へようこそ!”
メッセージボックスを表示する命令。
ダブルクォーテーションで囲まれた文字列が、そのまま表示されます。
End Sub
プロシージャの終わり。
VBEでこのプロシージャの中にカーソルを置き、F5キーを押すと実行できます。
また、Excel側で「開発タブ → マクロ」から「あいさつ」を選んで実行することもできます。
例題2:セルに値を書き込むプロシージャ
次に、少しだけ「Excelらしい」処理をしてみます。
Sub セルに書き込む()
Range("A1").Value = "プロシージャから書き込みました"
End Sub
VBこのプロシージャを実行すると、アクティブなシートの A1 セルに文字が入ります。
Range(“A1”).Value = “プロシージャから書き込みました”
Range(“A1”) は「A1セル」を表し、.Value はそのセルの中身(値)を意味します。
= の右側に書いた文字列が、そのままセルにセットされます。
ここまでできれば、「プロシージャを作って、Excelを動かす」という感覚がかなりつかめてきます。
プロシージャの役割をもう少し深掘りする
「実行の単位」としてのプロシージャ
Subプロシージャは、「マクロを実行する単位」です。
Excelの「マクロ」画面に表示されるのは、Subプロシージャだけです。
つまり、「一つのマクロ=一つのSubプロシージャ」と考えてOKです。
たとえば、次のように二つのプロシージャを書いたとします。
Sub A1に書く()
Range("A1").Value = "A1です"
End Sub
Sub B1に書く()
Range("B1").Value = "B1です"
End Sub
VBマクロの実行画面には、「A1に書く」と「B1に書く」が別々に表示されます。
どちらを実行するかを選べる、ということは、「処理のまとまりごとにプロシージャを分けられる」ということです。
「呼び出しの単位」としてのプロシージャ
プロシージャは、他のプロシージャから呼び出すこともできます。
たとえば、次のように書いてみます。
Sub あいさつ()
MsgBox "こんにちは!"
End Sub
Sub メイン処理()
あいさつ
Range("A1").Value = "あいさつが終わりました"
End Sub
VBここでは、「メイン処理」というプロシージャの中から「あいさつ」を呼び出しています。
メイン処理を実行すると、まずメッセージボックスが出て、その後 A1 セルに文字が入ります。
ポイントは、「あいさつ」という処理を一か所にまとめておくことで、
必要なところから何度でも呼び出せる、ということです。
この「処理を分割して、名前を付けて呼び出す」という考え方が、プログラミングの超重要な基礎です。
引数付きプロシージャの超入門
少しだけステップアップして、「引数付き」のプロシージャも触れてみます。
名前を変えてあいさつする例
Sub あいさつする(名前 As String)
MsgBox "こんにちは、" & 名前 & "さん!"
End Sub
Sub テスト()
あいさつする "山田"
あいさつする "佐藤"
End Sub
VBあいさつする というプロシージャは、「名前」という材料(引数)を受け取ります。
テスト を実行すると、「こんにちは、山田さん!」「こんにちは、佐藤さん!」と順番に表示されます。
ここでのポイントは二つです。
1つ目:プロシージャに「材料(引数)」を渡せること。
2つ目:同じ処理を、渡す値だけ変えて何度も使い回せること。
超初心者のうちは、「引数=そのプロシージャに渡す情報」とだけ覚えておけば十分です。
まとめと、次の一歩
今日おさえてほしいこと
プロシージャとは、「意味のあるひと固まりの処理」に名前を付けたもの。
Subプロシージャは、マクロを実行する基本単位で、形は「Sub ~ End Sub」。
プロシージャ名は、マクロ一覧に出る名前であり、他のプロシージャから呼び出すときの「呼び名」。
標準モジュールに Subプロシージャを書けば、Excelを自動で動かすマクロになる。
プロシージャ同士を呼び合うことで、処理を分割して分かりやすく整理できる。
ここまで理解できていれば、「プロシージャ作成でつまずく段階」はほぼ卒業です。
次の練習アイデア
一つの標準モジュールの中に、次の三つのプロシージャを書いてみてください。
1つ目:メッセージを出すだけの「あいさつ」。
2つ目:A1とB1に文字を書く「セルに書く」。
3つ目:上の二つを順番に呼び出す「メイン処理」。
メイン処理だけを実行して、「あ、複数のプロシージャが連携して動いているな」と感じられたら、
もう立派に「プロシージャを作って組み立てられる人」です。
