<can actually be either Variables that you pass to the Function, or the Variables that you receive back from the Function
The point about a "reference" is that it is pointing to some place in memory. When you pass a variable by reference (ByRef, which is the default), then, you are passing into the function a pointer to a variable. If the function modifies the data that the pointer points to (by modifying one of its, the function's, arguments), then (obviously) everything that points to that location will point to the modified data.
Passing by value (ByVal) creates a new memory location, stores the data that the variable passes to that new memory location, and goes from there. The link to the passed variable is broken.
So, when you pass by reference, think of it as two different variables referencing the same data. That's why it works the way it does.
<Declaring the Variables to be Public, and just writing to the Public Variable using the ByRef call
If you do this, it's irrelevant whether you pass ByVal or ByRef. You're modifying a different variable in either case.
<However it does not appear that you can actually get the updated value, until that instance of the call is complted.
I'm not sure what you mean by "instance of the call". If you mean what I think you mean, yes, you can get the updated value.