今さら言うことでもあるまいが ByVal と ByRef は必ず付けようと再認識するために作成したネタ。
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 それにしても ByVal と ByRef を明記しない人っていっぱいいるような…、って余計なお世話か。でも明らかに値渡しなのに ByVal が付いていないのは、間違いだよな〜。C言語で言うとポインタが付いてることになるし(笑) 1つ疑問がある。Form型って ByVal と ByRef のどちらで渡せばいいのだろう。
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 実行結果を見る限り ByVal と ByRef で動作が異なるようなことは無いと判明。普通に考えると ByVal だが…、いっそのこと敢えて「何も付けない」とするのも1つの手かも。 |