ByVal basically makes a local copy and keeps only the value at time of assignment.
ByRef connects the assignment to the original variable.
You use the former to retrieve a value for further procession.
You use the latter to repeatedly query a value in the original variable.
Also, if you define a variable ByRef, and assignment or modification to that variable will also change the original variable.