首页 > 解决方案 > 尽管不是返回值,但在函数中传递参数的局部变量会发生变化

问题描述

变量在我的strCont函数中发送以填充文档,然后我测试该变量而不是具有与发送之前相同的内容(在这种情况下为空字符串),它现在具有Cont变量在函数中采用的值("_ _ _ _ _ _ _ _ _ _")。

strCont在确切的瞬间改变值Cont,这意味着它不是关于返回,而是两个变量以某种方式联系在一起。
为什么这两个变量是联系在一起的?我所知道的关于函数的一切都告诉我它不应该那样工作。

提前致谢

这是代码:

Private Sub btnPrint_Click()
    Dim strClient2 As String, strTag As String, strCont As String
    '...
    strCont = strClient2
    strTag = "client2"
    Call Filling(strCont, strTag)
    If strCont = "" Then Call Filling("", "and2")
    '...
End Sub

功能

Function Filling(Cont As String, whatev As String)
    'other ifs...
    If Cont = "" Then Cont = "_ _ _ _ _ _ _ _ _ _"
    'fills doc...
End Function

当然,可以(并且在我的程序中)通过在参数中传递变量的副本来避免这个问题,但这不是它应该发生的,我只是不明白为什么。

标签: vbafunctionscope

解决方案


虽然我们认为字符串是“简单的”,但它们实际上并不是“隐藏的”。实际上,它们是“引用类型”——您已将字符串的两个“指针”设置为内存中的相同地址,使它们完全等效。(这不会发生在数字上。)字符串是隐式传递的“ByRef”,这意味着它们可以在其他过程中更改。

更改函数以显式获取字符串ByVal。这样,进入函数的内容只会在函数中改变。

Sub btnPrint_Click()
    Dim strClient2 As String, strTag As String, strCont As String
    '...
    strCont = strClient2
    strTag = "client2"
    Call Filling(strCont, strTag)
    If strCont = "" Then Call Filling("", "and2")
    '...
End Sub

Function Filling(ByVal Cont As String, ByVal whatev As String)
    'other ifs...
    If Cont = "" Then Cont = "_ _ _ _ _ _ _ _ _ _"
    'fills doc...
End Function

有用的链接:


推荐阅读