VB中,使用Call与不使用它的区别

  讨论它们的区别源自一处代码

Sheet1.Cells(2,1).copyFromrecordset(Rs) 'Rs为一个ADO.Recordset对象。

我发现它不能运行,但是在调用加上了Call,就可以运行了。这个问题困扰了我很久,都是因为不求甚解,结果发现早晚会出问题。

  经查阅相关资料,特将VB的Sub和Function调用语法总结如下:

1、Call SubA(P1,P2)2、SubA P1,P23、Call FunA(P1,P2)4、FunA P1,P25、Vara=FunA(P1,P2)  也就是说,用Call调用的Sub或Function,以及取得了返回值的Function,需要加括号,而不要返回值的Function及未加Call调用的Sub,是不加括号的。第3、4种形式对于系统内置函数无效,只能针对用户自定义函数使用。这看似灵活的两种方式,有时却能带给人迷惑。请看以下程序:Sub Demo(S As String) S = "DEF"End SubSub Main() Dim A As String A = "ABC" Debug.Print A Demo A Debug.Print A A = "ABC" Debug.Print A Call Demo(A) Debug.Print A A = "ABC" Debug.Print A Demo (A) Debug.Print AEnd Sub  结果:ABCDEFABCDEFABCABC  因为String这种对象类型,如果不声明参数方式,其认为ByRef而不是ByVal,因此,Sub Demo内的S = "DEF",是能够改变实参的内容的,因此前两次调用后的结果都显示DEF。注意第三次调用的结果,前后都是ABC。为什么呢?因为Demo (A)是上述第2种,而不是第1种形式的调用。那()是啥意思啊?()就是个运算符,而不是Sub调用的最外层标志。也就是说,在第三次调用中,(A)并不表示共有一个参数,第一个参数是A,而是表示共有一个参数,第一个参数是(A)。那么(A)是个表达式,其结果是个临时量,类型于A & ""一样,已经不是指A变量本身了,因此过程内改变的是这个临时量而不是A,所以不影响Main中的A。如果你不相信这种结论,可以测试一下下面的Sub:Sub Demo(S As String,T As String)End SubSub Main() Demo "1","2" Call Demo("1","2") Demo ("1","2") '语法错误End Sub  就是说,带括号必须用Call,要不就不能用括号,一个参数时的那种括号是参数自己的一部分,碰巧看起来很像个带括号调用而已。推荐使用Call使得语法明朗(虽然写起来长些),包括MsgBox。为了不让人混乱,据说VB.Net已做了新规定,要求调用必须加括号。

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...