【EXCEL VBA | 基礎コード】SubプロシージャとFunctionプロシージャ

スポンサーリンク

SubプロシージャとFunctionプロシージャ

EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!

今回は、"SubプロシージャとFunctionプロシージャ"について紹介します!

VBAプロジェクト

まずは、本題に進む前に「VBAプロジェクト」の構成について説明します。VBAプロジェクトとは、要するにそのプログラムの全体のことです。VBAの場合はは基本的にはEXCELファイル単体で完結することが多いと思いますので、一つのEXCELファイルの中にあるものと捉えて頂いた大丈夫だと思います。

VBEで言うと次のようになります。

デフォルトだと、左上に出てくる「プロジェクトウィンドウ」ここに「VBAProject(ファイル名)」と出てくるツリーがあると思いますが、この「VBAProject(ファイル名)」以下が一つのVBAProjectになります。VBAProjectの下層には、"Microsoft Excel Objects"と"標準モジュール"があります。

"Microsoft Excel Objects"は、Excelのオブジェクト、シートやブックが紐付いています。これは現段階ではあるな~くらいで思っていて大丈夫です。今後、学習を進めていくと、ここにもコードを記述することが出てきます。

"標準モジュール"は、ここまでもコードを書いてきた場所になります。これまでは一つだけで作って来ましたが、標準モジュールは複数作ることが出来ます。

右側のコードが記述してあるところが、標準モジュールの中です(プロジェクトウィンドウ上で開きたい標準モジュールをダブルクリックすると出てきます)

ここに、一つの一連の処理のまとまりである「プロシージャ」を作成していきます。

今回、紹介する「Subプロシージャ」「Functionプロシージャ」などの種類があります。

具体的なプログラムは、基本的には1行の単位である「ステートメント」で構成していきます。

だらだら書きましたが、以下図でまとめます。

今回の記事では、この中のプロシージャの種類について少し詳しく紹介します。

Subプロシージャ

まずは、Subプロシージャについてです。これはこれまでの記事の中でも毎回使ってきたものです。

構文

Sub プロシージャ名()

  ' 処理

End Sub

"Sub"で始めて、"End Sub"で終わる、一連のプログラムのまとまりのことでした。プロシージャは一つのモジュールの中に複数記述することが出でき、相互に呼び出して使うことが出来ます。

次のサンプルコードを見てください。

Sub main()
   
    Call test   ' testプロシージャを呼び出している
    
End Sub
-------------------------
Sub test()

    Dim val As String
    val = "ひらちんの部屋"
    
    Debug.Print val

End Sub

2つのサブプロシージャ「main」と「test」を作成しています。「test」には、イミディエイトウィンドウで"ひらちんの部屋"と表示するプログラムが書いてあり、「main」には「Call test」と書かれています。

先に実行動画で動作を確認します。※mainを実行します。

「main」のプロシージャを実行しましたが、「test」プロシージャに書かれたプログラムが動きました。

これは、「main」プロシージャ内の「Call test」で、「test」プロシージャを呼び出して実行しています。

呼び出すときは

Call 呼び出したいプロシージャ名

と書きます。

動きを図で表すと次のようになります。

処理ごとにプロシージャを別々に作成して、あとで呼び出して一つの大きな処理としたりするなど、複雑な処理を作るときに、分かりやすくなります。

引数について

また、ここまでの記事では、"引数"の無い最も単純な形のものを単体だけで使って来ましたが、本当は次のように、プロシージャ名の後ろの「()」丸括弧に"引数"を指定して使うことが出来ます。

Sub プロシージャ名(引数1, 引数2, ......)

  ' 処理

End Sub

"引数"とは、「プログラムの処理に使う値など」と思って下さい。分かりにくいと思うのでサンプルコードで説明します。

' 呼び出すプロシージャ
Sub main()
   
  ' testプロシージャを引数付きで呼び出している
    Call test("ひらちんの部屋")  
    
End Sub
-------------------------
' 呼び出されるプロシージャ
Sub test(val as string)
    
    Debug.Print val

End Sub

まずは呼び出されるプロシージャの説明です。

プロシージャ名「test」の後ろの「()」丸括弧の中が引数です。ここで指定した引数が、処理の中に登場して、利用されます。

VBAでは引数を指定する際に、データ型も指定する必要がありますので、変数の宣言と同じ様にデータ型も指定してください。(省略するとVariant型になります)

そして、呼び出す方のプロシージャは、

testプロシージャを呼び出すときは、プロシージャ名の後に「()」丸括弧を付けて、その中に引数を指定して呼び出しを行います。ここで指定した値が、呼び出し先のプロシージャに渡されて利用されます。

このように、引数を指定して呼び出し先のプロシージャに渡すことで、呼び出す側のプロシージャで引数に何を指定するのかを決めることができるようになります。

図で表すと次のようになります。

Functionプロシージャ

次に、プロシージャのもう一つの種類である、Functionプロシージャについて説明します。いわゆる"関数"と呼ばれるものです。

構文

Function プロシージャ名(引数1, 引数2,......) As データ型

  ' 処理

  プロシージャ名 = 戻り値

End Function

Subプロシージャと違い、Functionプロシージャは「Function」で始まって「End Function」で終わります。

引数を指定した「()」丸括弧の後には、戻り値のデータ型を指定します。処理の最後には、「プロシージャ名=戻り値」の形で処理後、返す値を指定します。

これも分かりにくいと思うので、サンプルでやってみます。

' 呼び出すプロシージャ
Sub main()

    Dim ans As Long
    ans = kakezan(5, 2)
    
    Debug.Print ans
    
End Sub

' 呼び出されるプロシージャ
Function kakezan(int1 As Long, int2 As Long) As Long

    Dim kotae As Long
    kotae = int1 * int2
    
    kakezan = kotae ' ここが戻り値の指定
    
End Function

それでは、まず呼び出される方のプロシージャの説明です。

引数を使って処理した結果を返します。書き方は次のような形です。

プロシージャ名 = ○○

そして呼び出す方のプロシージャでは、ここで返した値や変数を受け取るための変数を用意しておきます。

Functionプロシージャを呼び出すときは、「Call」はいりません。

Functionプロシージャ名(引数1, 引数2,...)

の形で呼び出して、そのまま返り値を変数に代入することが出来ます。

代入した変数を、Debug.Printで出力しているので、イミディエイトウィンドウに「10」が表示されます。

この流れを図にすると次のようになります。

このようにすることで、メインのコードと処理のコードを分離できるようになり、長いプログラムになっても分かりやすく、修正しやすい状態を保つことができるようになります。

返り値の無いものがSubプロシージャ、返り値が必要なものがFunctionプロシージャと覚えるのが良いと思います!

まとめ

SubプロシージャとFunctionプロシージャについて説明しました。Functionプロシージャはいわゆる関数と呼ばれるもので、本筋とはずれますが、これを覚えるとワークシート上でのユーザー定義関数を作成することができるようになります。次回は、ちょっとそれてユーザー定義関数について紹介したいと思います!