Excel VBA スタンダード 合格への道のり②
第二回目の投稿、行きます。
Function プロシージャって何?
Function hogehoge1()
処理
End Function
これをFunctionプロシージャと呼びます。
Subプロシージャと違う点
Subプロシージャ = 記述されているコードをひたすら実行するだけ
Functionプロシージャ = 値を返すことができる
何のこっちゃ?って思いますよね。
例を出します。
Sub hogehoge2()
Range("A1") = 100
//セルA1に100を代入する//
Range("A2") = hogehoge3
//セルA2にhogehoge3に代入した200(A1 ✖️ 2)を代入//
End Sub
FUnction hogehoge3()
hogehoge3 = Range("A1") * 2
End Function
こんな感じで、Functionプロシージャの中で、そのFunctionプロシージャの名前に返したい値を代入する。
→今回の場合はhogehoge3に返したい値 A1✖️2を代入している
まとめ
Subプロシージャ = 値を返せないプロシージャ
Functionプロシージャ = 値を返せるプロシージャ
引数ーインスウじゃないよー
”ひきすう”って読みます。
引数は「計算や処理の元となる値」を渡すことができるもの
プロシージャから別のプロシージャを呼び出すときに使われる。
Sub hogehoge(引数)
Function hogehoge(引数)
といった感じ。
引数には「どんな種類の値を受け取るのか」という型を指定できる。
例えば整数型なら、(A As Long) 文字列型なら(B As String)
Sub hogehoge(A As Long)
Function hogehoge(B As String)
複数の引数を受け取りたい時はカンマ(,)でで区切る
Sub hogehoge(A As String, B As String)
では実際に使ってみた例です。
Sub hogehoge4()
Call hogehoge5(100)
End Sub
Function hogehoge5(A As Long)
MsgBox A
//メッセージボックスでAを表示//
End Function
流れとしては、
hogehoge4がhogehoge5を引数100で呼び出し
↓
hogehoge5は整数100を受け取り、Aに100が入る
↓
メッセージボックスに100が表示される
「参照渡し」と「値渡し」
参照渡しや値渡しは、呼び出す先に直接数値や文字列を渡すのではなく、一度変数に代入してからその変数を渡します。
まず例を見てみましょう。
Sub hogehoge6()
Dim A As Long
A = 100
Call hogehoge7(A)
//直接値を渡さず、変数を渡している//
MsgBox A
End Sub
Sub hogehoge7(B As Long)
B = B * 2
End Sub
hogehoge6からhogehoge7へ変数Aを直接渡しているため、変数の中が二倍され、200になっています。
このようなデータの渡し方を参照渡しと呼びます。
Sub hogehoge6()
Dim A As Long
A = 100
Call hogehoge7(A)
MsgBox A
End Sub
Sub hogehoge7(ByVal B As Long)
//ByValを追加//
B = B * 2
End Sub
この例では、hogehoge7の引数に"ByVal"というキーワードを付けました。
Byvalのお陰で、hogehoge6は変数Aそのものではなく、変数Aの値のみを渡しています。
そのため、変数A自体には影響がなかったため、メッセージボックスでは100が表示されます。
このデータの渡し方を値渡しと呼びます。
値渡しが"ByVal"だったのに対し、参照渡しでは"ByRef"というキーワードを引数につけるのが基本ルールとされています。
Sub hogehoge6()
Dim A As Long
A = 100
Call hogehoge7(A)
MsgBox A
End Sub
Sub hogehoge7(ByRef B As Long)
//ByValを追加//
B = B * 2
End Sub
モジュールレベル変数を使って値を共有しよう
最後に引数を使わずに、値を共有するやり方をご紹介します。
モジュールレベル変数については前回の記事で扱ってので、合わせて参考にしてみてください。
Dim A As Long
//モジュールレベル変数//
Sub hogehoge8()
A = 100
Call hogehoge9
End Sub
Sub hogehoge9()
MsgBox A
End Sub
引数はプロシージャ間の値を共有する仕組みですが、上のようにモジュールレベル変数を用いれば、引数を使わなくても値を共有することができます。
まとめ
Functionプロシージャ = 値を返せるプロシージャ
引数(ひきすう) = プロシージャ間で値を共有する仕組み
参照渡し
= 渡す値を一度変数に代入し、その変数を渡す
変数自体を渡すため、中の値が変わってしま
ByRefというキーワードを使用する
値渡し
= 渡す値を一度変数に代入し、その変数を渡す
ByValというキーワードを使うことで、変数の値のみを渡せる
変数の中身に影響なし