vba - 尽管不是返回值,但在函数中传递参数的局部变量会发生变化
问题描述
变量在我的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
当然,可以(并且在我的程序中)通过在参数中传递变量的副本来避免这个问题,但这不是它应该发生的,我只是不明白为什么。
解决方案
虽然我们认为字符串是“简单的”,但它们实际上并不是“隐藏的”。实际上,它们是“引用类型”——您已将字符串的两个“指针”设置为内存中的相同地址,使它们完全等效。(这不会发生在数字上。)字符串是隐式传递的“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
有用的链接:
推荐阅读
- python - 有没有办法在 QSplashScreen 后面放置阴影?
- ios - 如何在 .DAE 环境和角色加载时显示加载屏幕?
- kubernetes - 安装 NVIDIA Clara Deploy 时“服务器没有资源类型“pods””
- java - 如何使用 JOption 窗格制作受用户影响的选项?
- javascript - 无限滚动(JS)+ iPhone - 图像未加载
- python - 使用 Python 作为后端的 ReactJS
- arrays - 为什么 ArrayPointer 给出分段默认值?
- laravel - 编辑前在 laravel 表单上禁用 CACHE(crome 和 safari 浏览器)
- assembly - 为什么将 300 除以 2 时会出现浮点异常 (SIGFPE)?
- ios - 快速创建按钮