|
其实,在这里有几次传递过程的。请结合我的语句来理解:
1、在test里,a,b分别赋值为1和2。
2、然后执行过程ab。这时候a,b重新被赋值为5,5。
3、然后执行子程序sub1(5,5)
4、由于没有符合5<5的情况,因此,这时候会跳出sub1的循环【最好加上语句避免死循环】。
5、执行a,b……这时候的a,b其实已经是x,y了。
默认情况下,VBA是传址过程。如果改为byval来传值的话,a,b传递过去之后,a和b还是不会变的【5,5】。这一点,你可以运行test测试。- Sub ab(ByVal a, ByVal b)
- Dim c
- a = 5: b = 3: c = 5
- Call sub1(a, b)
- MsgBox a & ":" & b
- End Sub
- '子程序
- Sub sub1(ByVal x, ByVal y)
- Do While y < x
- y = y + 1
- x = x + y
- If x >= 20 Then Exit Do
- Loop
- MsgBox x & ":" & y
- End Sub
- Sub test()
- Call ab(1, 2)
- End Sub
复制代码 对比代码:
- Sub ab(ByRef a, ByRef b)
- Dim c
- a = 5: b = 3: c = 5
- Call sub1(a, b)
- MsgBox a & ":" & b
- End Sub
- '子程序
- Sub sub1(ByRef x, ByRef y)
- Do While y < x
- y = y + 1
- x = x + y
- If x >= 20 Then Exit Do
- Loop
- MsgBox x & ":" & y
- End Sub
- Sub test()
- Call ab(1, 2)
- End Sub
复制代码
|
|