Private Sub Command1_Click()
Dim s As String
    Call A(s)
    Debug.Print s
End SubFunction A(s As String) As Integer
    s = "aaa"
    A = Len(s)
End Function用上面的代码,s返回为aaa,当将call A(s)改为A(s)时,s返回NULL
为什么值不能返回啊,s缺省为byref!

解决方案 »

  1.   

    你系统的问题吧 我运行就打印 aaa
    aaa
    aaa
    aaa
    aaa
      

  2.   

    楼上的,你要把我的代码中的CALL去掉再试才行
      

  3.   

    有   CALL    的时候   S要括号没有的时候  不要括号   是这里吗?.................
      

  4.   

    你把代码改成这样再试试:Private Sub Command1_Click()
    Dim ss As String
    ss = "AAA"    Label1.Caption = A(ss)
    End SubFunction A(s As String) As Integer    A = Len(s)
    End Function楼主区分一下function和sub的区别吧!!!
      

  5.   

    MSDN中是这样说的:调用一个过程时,并不一定要使用 Call 关键字。如果使用 Call 关键字来调用一个需要参数的过程,argumentlist 就必须要加上括号。如果省略了 Call 关键字,那么也必须要省略 argumentlis 外面的括号。但它并未指出是什么原因。
      

  6.   

    理由很简单:你将参数作为表达式传过去了,当然不能赋值。A (s)是将 s 原有类型的值作为表达式传递。MSDN 的有关资料:
    按地址传递参数使过程用变量的内存地址去访问实际变量的内容。结果,将变量传递给过程时,通过过程可永远改变变量值。按地址传递参数在 Visual Basic 中是缺省的。如果给按地址传递参数指定数据类型,就必须将这种类型的值传给参数。可以给参数传递一个表达式,而不是数据类型。Visual Basic 计算表达式,如果可能的话,还会按要求的类型将值传递给参数。**把变量转换成表达式的最简单的方法就是把它放在括号内。**例如,为了把声明为整数的变量传递给过程,该过程以字符串为参数,则可以用下面的语句:Sub CallingProcedure ()
       Dim intX As Integer
       intX = 12 * 3
       Foo (intX)
    End SubSub Foo (Bar As String)
       MsgBox Bar            'Bar 的值为字符串‘ 36 ’。
    End Sub最后,纠正你的说法,s 返回的不是 Null,而是空串。
      

  7.   

    **把变量转换成表达式的最简单的方法就是把它放在括号内。**这句话太经典了
    我用varptr函数看了一下地址值
    感谢of123!