To clarify question 2 a little, say you had:
Sub Level1()
Dim A as Integer
A = 2
Call Level2(A)
MsgBox A
End Sub
Sub Level2(ByRef AA As Integer)
AA = AA * AA
End Sub
All changes to the ByRef variable (AA) are reflected in the corresponding variable (A) in the calling proc. This is because AA is merely a reference to A. Hence, this code will give MsgBox "4".
If you change ByRef to ByVal, a new variable (AA) is created with its initial value set to the corresponding variable (A). Because AA is a new variable, its value is not reflected in A. That code would end in MsgBox "2".