見出し画像

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というキーワードを使うことで、変数の値のみを渡せる
  変数の中身に影響なし