第一问:传址的时候因为是将变量的地址直接传递给参数,这个时候涉及到两个内存地址的大小和类型,所以如果类型不匹配,就会产生错误提示。而对于传值来说,就没有这个限制,因为你传递的仅仅是“值”。但是传值不是说就不会产生错误,例如:
Dim X as String
X = "A"
Sub Proc(byval a as Integer)
那么:Call Proc(X)
这个时候就会产生类型不匹配的错误。因为参数a是一个整型变量,如果你将一个字符串变量赋值给他就会产生错误,这个跟你变量类型不匹配的定义是一样的,例如
Dim x as Integer
x = "A"
这个也会产生类型不匹配错误一样。
所以,正确的定义变量和参数类型,是VB编程良好的习惯之一!!要恪守准则,就不容易出错!
第二问:关于模块级变量,他的作用域是整个模块,该变量随着模块的卸载或者退出才消失。我们先将你的代码进行简化:
Private X As String
Private Sub Command1_Click()
X = 5
End Sub
Private Sub proc(ByVal a As Integer, ByVal b As Integer)
MsgBox X
X = 5 * X
Msgbox X
End Sub
通过上面的代码,我们可以得到弹出一个窗口,显示的结果为5。后来显示的结果为25这个就是不断的调用和修改模块级变量的结果。
我知道你实际的疑问是在ByRef和ByVal的区别,你可以参看我以前给别人解答的示例:
http://zhidao.baidu.com/question/557053844?&oldq=1