● ByVal と ByRef を慮る ●

今さら言うことでもあるまいが ByValByRef は必ず付けようと再認識するために作成したネタ。

Private Sub Command1_Click()
    Dim LongValue As Long
    LongValue = 1
    Debug.Print Hex$(VarPtr(LongValue))
    Call ByValProc(LongValue)
    Call ByRefProc(LongValue)
End Sub

Public Sub ByValProc(ByVal LongValue As Long)
    Debug.Print Hex$(VarPtr(LongValue))
End Sub

Public Sub ByRefProc(ByRef LongValue As Long)
    Debug.Print Hex$(VarPtr(LongValue))
End Sub

[実行結果]
12F3F0
12F3C4
12F3F0

それにしても ByValByRef を明記しない人っていっぱいいるような…、って余計なお世話か。でも明らかに値渡しなのに ByVal が付いていないのは、間違いだよな〜。C言語で言うとポインタが付いてることになるし(笑)

1つ疑問がある。Form型って ByValByRef のどちらで渡せばいいのだろう。

Private Sub Command1_Click()
    Dim FormObj As Form
    Set FormObj = Me
    FormObj.ScaleMode = vbTwips
    Debug.Print Hex$(VarPtr(FormObj))
    Debug.Print "ScaleMode:" & FormObj.ScaleMode
    Call ByValProc(FormObj)
    Debug.Print "ScaleMode:" & FormObj.ScaleMode
    Call ByRefProc(FormObj)
    Debug.Print "ScaleMode:" & FormObj.ScaleMode
End Sub

Public Sub ByValProc(ByVal FormObj As Form)
    Debug.Print Hex$(VarPtr(FormObj))
    FormObj.ScaleMode = vbPixels
End Sub

Public Sub ByRefProc(ByRef FormObj As Form)
    Debug.Print Hex$(VarPtr(FormObj))
    FormObj.ScaleMode = vbTwips
End Sub

[実行結果]
12F58C
ScaleMode:1
12F4C4
ScaleMode:3
12F58C
ScaleMode:1

実行結果を見る限り ByValByRef で動作が異なるようなことは無いと判明。普通に考えると ByVal だが…、いっそのこと敢えて「何も付けない」とするのも1つの手かも。


戻る