Subscribed unsubscribe Subscribe Subscribe

VBAの個人的な嵌りどころ

必要に迫られてVBA入門中.ちょっと嵌ったところをメモ.間違っていたら誰か指摘してください…

小数→整数への暗黙変換は,最近接偶数に丸められる

小数部が0.5未満のときには切り捨て,ちょうど0.5のときは最も近い偶数に丸められ,それ以外のときには切り上げられる.

Dim i As Ingeger
Dim d As Double

d = 0.5
i = d '0

d = 0.51
i = d '1
 
d = 1.5
i = d '2

d = 1.51
i = d '2

関数の引数はデフォルトで参照渡し

組み込み型だろうと何だろうと,ByValを明示しない限りは参照で渡される.

Sub Test()
    Dim i As Integer
    i = 0
    func1 i  ' i == 1
    func2 i  ' i == 2
    func3 i  ' i == 2
End Sub

' 参照渡し
Private Function func1(i As Integer) As Integer
    i = i + 1
    func1 = i
End Function

' 参照渡し
Private Function func2(ByRef i As Integer) As Integer
    i = i + 1
    func2 = i
End Function

' 値渡し
Private Function func3(ByVal i As Integer) As Integer
    i = i + 1
    func3 = i
End Function

関数呼び出しの引数を括弧でくくるかどうかは,戻り値を使うかどうかで使い分ける

戻り値を捨てる場合は括弧なし,戻り値を使用する場合は括弧有りの書式を使う必要がある.

Sub Test()
    Dim i As Integer
    i = 0
    func1 1, 2       ' OK
    func1(1, 2)      ' Error! 戻り値を使わない場合は括弧を使用しない
    i = func1(1, 2)  ' OK
    i = func1 1, 2   ' Error! 戻り値を使う場合は括弧を使用する
End Sub

Private Function func1(i As Integer, j As Integer) As Integer
    func1 = i + j
End Function

ところが,関数を1引数にすると挙動が変わるように見える.

Sub Test()
    Dim i As Integer
    i = 0
    func1 1       ' OK
    func1(1)      ' OK 2引数の時と違う???
    i = func1(1)  ' OK
    i = func1 1   ' Error! 戻り値を使う場合は括弧を使用する
End Sub

Private Function func1(i As Integer) As Integer
    func1 = i + 3
End Function

この場合の括弧は,実は関数呼び出し側ではなくて引数を修飾したものとして解釈されているらしい.

Dim i As Integer
Dim j As Integer

i = (j) + 3  ' jをコピーした一次オブジェクトと3との和をiに代入
func1(i)     ' iをコピーした一次オブジェクトを,括弧無しの呼び出し構文でfunc1に渡す

ややこしいけど,ここでのfunc1(i)の括弧は,関数ではなくiのほうを修飾したものとして解釈されている.(i)というiのコピーがまず生成され,func1に「括弧無しの書式で」渡っているので,戻り値を評価しなくても当然合法な構文となる.
”括弧を付けると値渡しになる”と解説しているサイトがあったが,結果としてそうなっているだけで,関数呼び出し側にそのような規則があるわけではない.また,”戻り値を評価しない場合には括弧を付けても付けなくても良い”というような解説も見かけたが,1引数のときに見かけ上そうなっているだけで,2引数の場合にはエラーになるのでこれも正しい解釈ではなさそう.
値渡しで引数を渡す - プロシージャ - Excel VBA入門
Office TANAKA - Excel VBA Tips[括弧が必要な場合]