こんにちは、フリーランスエンジニア兼ライターのワキザカ サンシロウです。
皆さんは、VBAのプロシージャが何かわかりますか?VBAを初めて間もない方だと、プロシージャの意味や使い方がわからない方も多いのではないでしょうか。
そこで今回は、
- VBAプロジェクトの構成とは
- プロシージャとは
といった基礎的なことから、
- Subプロシージャの作り方・実行方法
- 合わせて覚えると便利なFunctionプロシージャとは
といった応用的な方法まで、徹底的に解説します!
VBAプロジェクトの構成とは?
まず、VBAプロジェクトの構成について簡単に解説します。VBAは以下のように、「プロジェクト→モジュール→プロシージャ→ステートメント」の構成でできています。
モジュールの中に複数のプロシージャがあり、プロシージャはステートメントでできています。これだけだとよくわからないと思うので、実際にVBEの画面で何がどれに該当するかわかるような画像を用意しました。
赤枠で囲っている部分がプロジェクトです。プロジェクト内にはモジュール(Module1)があります。Module1のコードが、右側に表示されているウィンドウの青枠部分です。
モジュール内には、Test1とTest2のプロシージャがあり、オレンジ色に下線を引いた1行ずつのコードがステートメントです。全ての言葉を覚える必要はありませんが、
- VBAではモジュールにプログラムを作る
- モジュールには複数のプロシージャを作れる
程度にまずはざっくりと覚えておけばOKです!
プロシージャとは
次に、プロシージャについて簡単に解説します。プロシージャは、VBAの処理をまとめた機能です。さきほど解説した通り、モジュール内に書くことで作ることができます。
プロシージャの作り方は次のとおりです。プロシージャの作り方:
Sub プロシージャ名() 'ここにVBAの処理を書く End Sub
また、引数を使えば、値を渡して処理を実行することもできます。引数を使った例:
Sub プロシージャ名(引数の変数名1 as 型名,引数の変数名2 as 型名) 'ここにVBAの処理を書く End Sub
たとえば、「数値Xと数値Yをかけた結果を計算する処理」などをプロシージャで作る場合です。数値Xと数値Yをかけた結果を表示するサンプル:
Sub Test2(X As Integer, Y As Integer) 'XとYをかけた結果をメッセージで表示 MsgBox X * Y End Sub
このように、引数を使ってプロシージャを作ることもできます。
プロシージャの作り方
次に、プロシージャの作り方について解説します。
事前準備:標準モジュールの作成
先ほど伝えた通り、プロシージャはモジュールに内に書いていくため、最初に標準モジュールを追加します。以下のように、「右クリック→挿入→標準モジュール」の順で選択することで、追加できます。
追加すると右側にコードウィンドウが表示されます。
Subプロシージャの作成方法
次に、Subプロシージャの作り方について解説します。「Sub プロシージャ名」を入力してからエンターキーを押すことで、Subプロシージャを作ることができます。
プロシージャ名にTestを入力してエンターキーを押した場合は、次のようなコードができます。作ったコード:
Sub Test() End Sub
この中に処理(ステートメント)を書くことで、VBAの処理を作っていけるわけですね。
簡単なコードを書く方法
次に、簡単なサンプルコードを書く方法について解説します。「Sub プロシージャ名() ~ End Sub」の中に処理を書いていきます。
サンプルコード:
Sub Test() Range("A1").Value = "侍エンジニア" End Sub
今回は、セルに値を書き込むRangeメソッドを使ったサンプルを用意しています。「Range(セル位置).Value = 値」でセルに値を書き込むことができます。
Rangeメソッドの詳しい使い方については以下で解説しているので、気になる方は見てみてくださいね!
プロシージャを実行する方法
次に、作ったプロシージャを実行する方法を解説します。プロシージャ内にカーソルを置いて、実行ボタンをクリックすることで簡単に作ったプロシージャを実行することができます。
実行方法:
実行後のセルデータ:
このように、簡単に作ったプロシージャを実行することができます。
補足:他のプロシージャから呼び出すことも可能
ちなみに、プロシージャは別のプロシージャから実行することもできます。別のプロシージャから実行する場合は、Callステートメントを使って次のように書きます。
Callステートメントで別のプロシージャを呼び出す方法:
Call プロシージャ名
先ほど作ったサンプルを実行する場合は、次のようになります。
サンプルコード:
Sub Main() 'Testプロシージャを実行 Call Test End Sub Sub Test() Range("A1").Value = "侍エンジニア" End Sub
実行結果:
複雑な処理を1つのプロシージャだけで書いてしまうと、コードが読みづらくなってしまいます。また、エラーの原因も見つけづらくなってしまうため、適度にプロシージャを分けてCallステートメントで呼び出して作るのがおすすめです!
覚えておくと便利なFunctionプロシージャとは
プロシージャにはSubプロシージャ以外にも、Functionプロシージャがあります。Subプロシージャとの大きな違いは、「戻り値で結果を返すことができること」です。
たとえば、最初に紹介した「数値Xと数値Yをかけた結果を表示するサンプル」を、Functionプロシージャで書き換えると次のようになります。
Functionプロシージャで書き換えたサンプル:
Sub Main() 'Functionプロシージャ(Test2)を実行 MsgBox Test2(10, 5) End Sub Function Test2(X As Integer, Y As Integer) As Integer 'XとYをかけた結果を返す Test2 = X * Y End Function
実行結果:
XとYをかけた結果を返すFunctionプロシージャをTest2の名前で作成し、MainでTest(10,5)のように書くことで、10(Xの値)と5(Yの値)をかけた結果を取得して、MsgBoxで結果をメッセージに表示しています。
SubをFunctionに書き換えて、戻り値に設定する型を「as Integer」でプロシージャ名の右に追加しています。
このように、「処理した結果を返すプロシージャ」を作ることができるので、Functionプロシージャはとても便利です。Funcitonプロシージャの詳しい使い方については以下で解説しているので、気になる方は見てみてくださいね!
まとめ
今回は、プロシージャの使い方について解説しました。まずは、Subプロシージャの作り方・Callで実行する方法をやってみてください。
作るのが慣れてきたら、Functionプロシージャに置き換える方法を試す流れがおすすめです。ぜひ、やってみてくださいね!