プロシージャ-Excel VBA

投稿者: | 2018年11月18日

他のプロシージャを呼び出す

モジュール内に存在するプロシージャを呼び出すには、callという命令を使う。

Sub Sample()

    Range("A1").Value = 100

    Call Sample2()End

SubSub

Sample2()

    Range("B1").Value = Range("A1").Value * 2

End Sub

他のプロシージャを呼び出すCallは省略も可能である。


Sub Sample()
    Range("A1").Value = 100
    Sample2()End
SubSub
Sample2()
    Range("B1").Value = Range("A1").Value * 2
End Sub

Functionプロシージャ

Functionプロシージャは、実行の結果を呼び出し元に返す働きをする。

Functionプロシージャの書式

Function プロシージャ名(受け取る値) As 返すデータ型

プロシージャの引数

プロシージャには引数としてデータを渡すことができる。
引数をやり取りするマクロでは、引数を受け取るプロシージャ側でどんな引数を
いくつ受け取るかを決めておき、引数を渡すプロシージャ側では決められた通り
に引数を渡す。

参照渡しと値渡し

Sub Sample()

    Dim buf As String

    buf = “Excel VBA”

    Call Sample2(buf)

    MsgBox buf

End Sub

Sub Sample2(msg As String)

    msg = “VBAエキスパート”

End Sub

上記のマクロを実行すると、呼び出し元(Sample)の変数bufが変更される。
これは、SampleからSample2へ「変数そのもの」を渡したためである。
このようなデータの渡し方を参照渡しと呼ぶ。
値を参照渡しで受け取る場合は、受け取り側の引数の定義にByRefというキーワードをつけるのがルールである。
キーワードを省略した場合はByRefが指定されたものとみなす。

Sampleを下記のように書き換える

Sub Sample()

    Dim buf As String

    buf = “Excel VBA”

    Call Sample2(buf)

    MsgBox buf

End Sub

Sub Sample2(ByVal msg As String)

    msg = “VBAエキスパート”

End Sub

上記のマクロを実行すると、変数bufの値は書き換わらない。
Sample2の引数の定義にByValというキーワードをつけたため、Sampleは変数そのものを渡したのではなく、「変数の値だけ」を渡したからである。
これを値渡しと呼ぶ。

省略可能な引数を定義する

省略可能な引数には、引数の前にOptionalというキーワードをつける。

Sub Sample(msg As String,Optional n As Long)

    Dim i As Long,buf As String

    For i = 1 To n

         buf = buf & msg & vbCrLf

    Next

    MsgBox buf

End Sub

引数が省略されたときの対応には、2通りの考え方がある。

初期値を設定しておく

プロシージャで引数を定義するときに、その引数が省略された時の初期値を設定しておく。

Sub Sample()

    Call Sample2(“Excel”)

End Sub

Sub Sample2(msg As String,Optional n As Long = 3)

    Dim i As Long,buf As String

    For i = 1 To n

        buf = buf & msg & vbCrLf

    Next

    MsgBox buf

End Sub

Optionalをつけて可能にした引数nが省略された場合、引数nには初期値である
「3」が設定される。

省略されたことを調べる

Optionalをつけて省略可能にした引数が省略されたかどうかは、IsMissing関数で判定できる。
IsMissing関数は引数が省略されるとTrueを返す。
IsMissing関数で判定する引数はバリアント型でないといけない。

次のマクロは引数が省略されたときに、引数nに3を代入する。

Sub Sample()

    Call Sample2(“Excel”)

End Sub

Sub Sample2(msg As String,Optional n)

    Dim i As Long,buf As String

    If IsMissing(n) = True Then n = 3

    For i = 1 To n

        buf = buf & msg & vbCrLf

    Next

    MsgBox buf

End Sub

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA