SubとFunctionの違いについて
VBAで使用するプロシージャにはSubとFunctionの2種類あり、SubもFunctionもどちらも中に処理を記述するための枠です。
2種類ありますが、処理を記述する際にどちらかのプロシージャでしか記述できない処理があるわけではありません。
この2つの違いは、Subは画面上のボタンオブジェクトやアドインタブメニューから呼び出せるが、Functionの処理は呼び出せないところにあり、Functionは基本的にSub内から呼び出されて使われます。
Fuctionの使い方について
'B2のセルに文字を出力後、メッセージボックスを表示する処理
Sub test()
Dim test As String
test = "セルに出力"
Call dispCellbox(test, "B2")
Call dispMsgBox("めっせーじぼっくす")
End Sub
'第一引数で渡された内容を第二引数のセル位置に出力する処理
Function dispCellbox(ByVal msg As String, ByVal position As String)
Range(position).Value = msg
End Function
'引数で渡された内容でメッセージボックスを表示する処理
Function dispMsgBox(ByVal msg As String)
MsgBox msg
End Function
Functionの使い方としては、Functionにはサンプルコードのように単一のシンプルな機能を定義してあげ、SubではSubの中で実現したい処理を実行するために複数のFunctionを組み合わせて使用する書き方がシンプルでわかりやすいかと思います。
上のサンプルプログラムで説明すると、Subの処理はボタン押下などで呼び出されます。サンプルプログラムのSubは呼び出された際に、
① 特定のセルに文字列を入力する処理
② 特定の文字をポップアップで出力する処理
の2つを実行します。
それぞれの処理をSubの中に記述してもいいですが、別のボタンを設置して、そっちでは違う文言を出力したかったり、同じ文字を出力するけど、セルの記入はいらなかったりした場合に、似た処理を書くのは非効率的なので、下記のコードイメージのように、「 特定のセルに文字列を入力する処理 」と「 特定の文字をポップアップで出力する処理 」をそれぞれ実行してくれるFunctionを定義すれば、他のSubでも使い回しができ、ソースもスッキリし、Subの中も見やすくなるので、今回はこのようにソースを記述しています。
Sub メッセージ出力処理() 'ボタンクリックかアドインメニューから呼ばれる処理
Call 指定セルに文字列を入れる処理(セルに記入する文字列, セル位置)
Call 指定した文字をメッセージ出力する処理(メッセージ出力する文字)
End Sub
Sub メッセージ出力処理ポップアップなし() 'ボタンクリックかアドインメニューから呼ばれる処理
Call 指定セルに文字列を入れる処理(セルに記入する文字列, セル位置)
End Sub
Function 指定セルに文字列を入れる処理(セルに記入する文字列, セル位置)
Range(セル位置).Value = セルに記入する文字列
End Function
Function 指定した文字をメッセージ出力する処理(メッセージ出力する文字)
MsgBox メッセージ出力する文字
End Function