関数(プロシージャ)
プロシージャとは、ある機能ごとにプログラムをまとめた単位の事で、他の言語などでは関数と呼ばれることもあります。
VBAプログラミングでは、プロシージャを書いてそれを呼び出して実行します。プロシージャから別のプロシージャを呼び出すこともできます。
汎用的なプロシージャを作っておけば他のプログラムで使用することもできます。
プロシージャの種類
プロシージャには以下の3つがあります。
- Subプロシージャ
- Functionプロシージャ
- Propertyプロシージャ
Subプロシージャ
Subプロシージャは最も汎用的なプロシージャで、引数を取ることができます。
戻り値と呼ばれる値を返すことはできません。
Functionプロシージャ
Functionプロシージャは戻り値を返すことができるプロシージャで、引数も取ることができます。
Subプロシージャなどから呼ばれて実行されます。
Propertyプロシージャ
Propertyプロシージャは、オブジェクトの状態を返したり、セットしたりするプロシージャで、クラスで使用します。
クラスについては勉強が進んでから取り扱う概念なのでここでは省略します。
関数定義
Sub macro()
MsgBox "Hello VBA"
End Sub
Sub マクロ()
MsgBox "こんにちは"
End Sub
関数の定義は上記のように書きます。
書式としては、最初に Sub 半角空白が入って、関数名()となります。
関数名は予約語禁止などのルールがありますが、比較的自由に書くことができます。日本語の関数名もOKです。
関数名の後のカッコは、引数と呼ばれる値を取ることができます。
引数は関数の内部で使う事が出来るので、関数に対して外から値を渡すことができます。
Sub macro(s As String)
MsgBox s
End Sub
このコードでは、sという文字列型の引数を渡している例です。
次はFunctionです。
Function bai(n As Long) As Long
bai = n * 2
End Function
Funciotnは、値を返すことができます。どのような型で値を返すのかを、() の後に書きます。
そして返す値は、関数名=返り値 の形で書きます。
関数の呼び出し
関数は他から呼び出すことができます。上記の関数を呼び出す例です。
Sub macro()
MsgBox "Hello VBA"
End Sub
Sub macro2(s As String)
MsgBox s
End Sub
Function bai(n As Long) As Long
bai = n * 2
End Function
Sub Test()
Call macro
macro
Call macro2("こんにちは。")
macro2 "こんにちは。"
MsgBox bai(2)
End Sub
この例では、上の3つの関数をTest関数から呼び出しています。
呼び出し方としては2つの方法があります。
一つは Call ステートメントをつけて呼び出す例です。
二つ目は、Call ステートメントを省略できる例です。
この二つは引数のある・なしで書き方が変わってきます。
Callを省略する場合は、関数名と引数の間に半角空白を置きます。
さて、最後の bai 関数ですが Callを付ける書き方はありません。
この関数は返り値(戻り値)を持つため、常に何かに代入させるためです。
Functionは返り値を返さない事もできるので、その場合はCallを使った書き方ができます。Call を付けないのは返り値がない時です。
引数が2つ以上あるとき
Sub myAdd(n As Long, m As Long)
MsgBox n + m
End Sub
Sub Test2()
Call myAdd(2, 3)
myAdd 2, 3
End Sub
引数が2つ以上のときは上記のように書きます。
Callを省略するときはカンマと半角空白が必要になります。
Withステートメント
With を使うと、以下のような記述を、
Worksheets("Sheet1").Range("A1") = "rat"
Worksheets("Sheet1").Range("B1") = "dog"
Worksheets("Sheet1").Range("C1") = "cat"
Worksheets("Sheet1").Range("A3") = "bat"
Worksheets("Sheet1").Range("A5") = "foot"
以下のように、省略して書くことだ出来るようになります。
With Worksheets("Sheet1")
.Range("A1") = "rat"
.Range("B1") = "dog"
.Range("C1") = "cat"
.Range("A3") = "bat"
.Range("A5") = "foot"
End With
注意したいのは、省略する部分は、ドッド( . )で書き始めるという事です。
ドットを忘れると、With で指定した部分が反映されなくなってしまいます。
プログラムをスッキリと書くことができるので、積極的に使ってください。