|
どうやら、参照渡しのパラメータとして、
オブジェクトのプロパティを直接指定した場合、
自動的に値渡しに変更されているようです。
Call addcalc(a, b, Me.ans)
でMeキーワードを付加してしまうと、ただの変数ではなく、
オブジェクト(Workbook)のプロパティと認識されてしまいます。
値渡しでパラメータが渡されるので
サブプロシジャー(addcalc)内で変数の値を変更しても
呼び出し元の変数(ans)には値の変更の影響がありません。
よって、「2 + 3 = 0」と表示されてしまいます。
このような場合は、第3変数をパラメータとして使用し、
戻り値をプロパティに設定する方法が考えられますね。
Sub main2()
Dim a As Long
Dim b As Long
Dim c As Long
Me.ans = 0
a = 2
b = 3
Call addcalc(a, b, c)
Me.ans = c
MsgBox a & " + " & b & " = " & Me.ans
End Sub
問題はこれで解決します(解決方法は簡単なのですが)。
因みにThisworkbookのモジュールに
'===============================================================
Public ans As Variant
'===============================================================
Sub main()
Dim a As Long
Dim b As Long
ans = 0
a = 2
b = 3
Call addcalc(a, b, ans)
MsgBox a & " + " & b & " = " & ans
End Sub
'================================================================
Sub addcalc(x As Long, y As Long, z As Long)
z = x + y
End Sub
これで、Thisworkbook.mainを実行すると、
実行前のコンパイル時のエラーで
「Byref引数の型が一致しない」というエラーが発生します。
上記のmainの
Call addcalc(a, b, ans)
を
Call addcalc(a, b, me.ans)
に変更すると、
正しい結果は返してくれませんが、エラーにはなりませんでした。
これは、値渡しのパラメータでは、
型のチェックがコンパイル時には行われていないことを意味します。
まっ、「値が受け継がれさえすればよいのですから、そこまでは必要がない」
ということでしょうか?
尚、Vbscriptとでもプロパティを参照渡しでは、渡すことが出来ませんでした。
確認したコードは以下のとおりです。下記のコードをテキストファイルとして保存し、
保存後拡張子をvbsに変更して実行してみてください(例 Test.vbs)
'===================================
dim a,b
dim zzz
dim cc
set cc=new cls
a=2
b=3
cc.bbb=0
call test(a,b,cc.bbb)
msgbox a & " + " & b & " = " & cc.bbb
call test(a,b,zzz)
msgbox a & " + " & b & " = " & zzz
'==================================
sub test(x,y,z)
z=x+y
end sub
'==================================
class cls
property get bbb()
bbb=zzz
end property
property let bbb(dat)
zzz=dat
end property
end class
|
|