一応サンプルコード置いてますが、解説とかがメインです。
'メインプロシージャ(ByRef)
Sub test_sub()
Dim a as Long
Dim b as Long
Dim c as Long
b = 10
c = 5
a = test_calc(b,c)
MsgBox("a=" & a)
MsgBox("b=" & b)
MsgBox("c=" & c)
End Sub
'計算するプロシージャ(ByRef)
Function test_calc(ByRef d as Long, ByRef e as Long) as Long
d = 15
e = 20
test_calc = d * e
End Function
Functionで戻り値の型を指定する場合、閉じカッコの後に as Longを記述します。(as Dateなど他の型も可)
引数のByVal、ByRef、戻り値のas Longは省略可能ですが、エラーの温床になるのでお勧めしません。ByVal、ByRefを省略した場合、ByRefが書かれたことになります。
ByValは引数を生成する時に値をコピーし、ByRefはコピーせずにそのまま参照します。
なんかByValは値渡し、ByRefは参照渡しっていうらしいです。面倒だから専門用語増やすなと言いたい。
ByValを使った場合、引数をいじっても遷移元のプロシージャでは値は変わりません。
ByRefだと、引数いじったら変わります。
基本引数を変えたい場面ってないのでByValでいいと思いますが、値コピーだから、恐らくメモリ食ってるのかな?とか思ったりします。が、詳しくは知りません。
怖かったらByValを使っておいて、気になった時に調べればいいと思います。