小弟最近发现一个奇怪的现象,求教各位:下面的三个函数(过程)定义如下:
private sub      StrAdd_1(str as string)
private function StrAdd_2(str as string)
private function StrAdd_3(str as string)as String当我分别调用三个函数时,发现以下现象:
StrAdd_1不会改变传入的字符串的值;
StrAdd_2也不会改变传入的字符串的值;
StrAdd_3改变传入的字符串的值。也就是说:
sub 和 无返回值的 function 没有对字符串当作传引用或者指针拷贝方式调用,即完整的复制了一份字符串数据给形参。(非常耗时)
而只有第三种有返回值的 function 将使用传引用或传指针方式调用。(在C++里,传指针也是传值方式啊)简直让我莫名其妙!!!
按道理是否对string类型参数不管 byval 还是 byRef 应该都能够改变实际参数的值啊!?
谁也经历过这个问题?谢谢指教!上述环境 Excel XP VBA 

解决方案 »

  1.   

    VBA没弄过.
    VB就没有你说的问题.
      

  2.   

    代码在公司,跟文件readall 出来后有关,我刚才在自己机器上试验不出来了,礼拜一上班后在来问!楼上的谢谢关注!
      

  3.   

    原来是这么回事!!Private Sub CommandButton1_Click()
        Dim str1$, str2$, str3$, strTmp$
        
        str1$ = "old"
        str2$ = "old"
        str3$ = "old"
        
         StrAdd_1 (str1$)
         StrAdd_2 (str2$)
         strTmp$ = StrAdd_3(str3$)
         
         MsgBox str1$
         MsgBox str2$
         MsgBox str3$
         
    End Sub
    Private Sub StrAdd_1(str As String)
        str = "New"
    End Sub
    Private Function StrAdd_2(str As String)
        str = "New"
    End Function
    Private Function StrAdd_3(str As String) As String
        str = "New"
    End Function
    =====================================================
    但是我试过了如果全部使用 CALL 关键字的话,就全部是打印出“New”来。比如 Call StrAdd_1 (str1$)
    现在的问题是,写Call和不写Call有什么区别??
    Msdn上面也没说啊。搞的我糊涂了一个下午那天,浪费时间。
    请各位指教。
      

  4.   

    使用CALL 关键字在对对象的引用中是不同的,但是对于普通变量应该是有没有CALL关键字都是一样的.
      

  5.   

    不用CALL时,调用的函数或过程的参数不加括号
    如:StrAdd_1 str1$
        StrAdd_2 str2$
    这一句:strTmp$ = StrAdd_3(str3$)  是调用了函数过程。
      

  6.   

    当没有用call的时候,必须要去掉括号,即StrAdd_1 str1$,否则被认为传递str1$的Copy版本进入过程.
      

  7.   

    helanshan(C++) ( ) :
    照你的说法,StrAdd_1(str1$)就没有调用函数了吗?不对吧。zhujiechang(小朱):
    你回复正是次现象的说明,可是为什么差别这么大?
    为什么要设计这么个容易引起Bug的差别(我还得回去检查我的其它代码),好处在哪里?值得吗?
    额外的拷贝多浪费木材啊,^_^
      

  8.   

    可能我上面的意思没有说清楚。。
    不加call的时候,正如zhujiechang(小朱)所说。。
    而strTmp$ = StrAdd_3(str3$) 是调用了函数过程后,返回str = "New"的值