加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 23:24:30 所属栏目:大数据 来源:网络整理
导读:讨论它们的区别源自一处代码: Sheet1.Cells(2,1).CopyFromRecordset(Rs) 'Rs为一个ADO.Recordset对象。 我发现它不能运行,但是在调用前加上了Call,就可以运行了。这个问题困扰了我很久,都是因为不求甚解,结果发现早晚会出问题。 经查阅相关资料,特将VB

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

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已做了新规定,要求调用必须加括号。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读