Well I read and re-read
http://www.vbforums.com/showthread.p...ighlight=Byref
http://www.developerfusion.co.uk/show/51/6/
and stuff like
Code:
It is more efficient to code 
     SUB WriteLine(ByVal L AS STRING)
than to code
     SUB WriteLine(L AS STRING)
and it is never necessary to code
     SUB WriteLine(ByRef L AS STRING)
since that is the default.
But efficiency is seldom a problem (never so far for me) on modern computers. If a case arose, I would probably opt for avoiding the SUB entirely to omit all overhead.

Maybe one could use ByVal to use the fact that you are guaranteed that your input variable is not changed.
y = F1(x) + F2(x)
for example. If F1 modified x, then F2 would return an unexpected result.

But if one were so careful as to do that, one could simply not modify x.

However, if the default were reversed so that all SUBs are "efficient" and passed variables never get changed, then I can imagine a case where one would need to know about ByRef in the case that one actually wanted to return multiple values.

That not being the case, I think the answer to the question "Why ever use ByVal or ByRef?" is "There is seldom or never a good reason. Forget you ever heard the terms."

Mac