尽管不是返回值,但参数中传递的局部变量在函数中发生变化

时间:2018-05-09 12:25:32

标签: vba function scope

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

strCont会在Cont的确切时刻更改值,这意味着它不是关于Return,而是两个变量以某种方式链接在一起。
为什么这两个变量相关联?我所知道的关于功能的一切都告诉我它应该那样工作。

提前致谢

以下是代码:

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

当然,问题可以(并且在我的程序中)通过在参数中传递变量的副本来避免,但这种情况并不是它应该如何,而我只是“不要”。明白为什么。

1 个答案:

答案 0 :(得分:3)

虽然我们认为字符串是“简单的”,但它们实际上并非“在幕后”。实际上,它们是“引用类型” - 您已将字符串的两个“指针”设置为内存中的相同地址,使它们完全等效。 (数字不会发生这种情况。)字符串隐式传递“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

有用的链接: