an argument/parameter passed to a sub/function as follows
byval - a copy of the variable is placed on the stack, and (effectively) the address of that copy is passed to the sub. therefore any changes to the variable whether intentional or accidental are effected on the temporary copy, and are discarded when the subproc ends, and control returns to the calling statement
byref - the address of the actual variable is passed, rather than the address of a copy. So changes to the variable are permanent.
since in general, it is better to limit the scope of variables as much as possible, it is much safer to pass variables byval, and only explicitly byref when specifically required - therefore it is also surprising that the default setting in VBA is byref, rather than byval.