传递给函数的 VBA 变量被修改

标签 vba excel

我已将变量作为参数传递给 VBA 函数,但仅引用了函数中的参数,而不是原始变量。似乎原始变量正在被函数修改,这意味着它共享相同的地址空间?这里发生了什么,我如何防止它发生?

函数如下:(单位、十、百、千是全局整数变量)

Function Components(qty As Integer, stringSize As Integer)

If qty < stringSize Then
    units = qty

ElseIf qty >= stringSize * 100 Then
    thousands = qty \ (stringSize * 100)
    qty = qty - (thousands * stringSize * 100)
    Components qty, stringSize


ElseIf qty >= stringSize * 10 Then
    hundreds = qty \ (stringSize * 10)
    qty = qty - (hundreds * stringSize * 10)
    Components qty, stringSize

ElseIf qty >= stringSize Then
    tens = qty \ (stringSize)
    qty = qty - (tens * stringSize)
    Components qty, stringSize

End If

End Function

我使用另一个函数调用它
Components charQty, 26

其中 charQty = 565 当它作为参数传递给组件和
组件完成后 charQty = 19。我通过在函数调用之前和之后立即打印值来确定这一点。

我对VBA相当陌生。任何帮助将不胜感激。

最佳答案

与大多数其他语言不同,VBA 中参数的默认行为是传递 ByRef - 这意味着对原始对象/变量的引用被传递,因此原始对象/变量可以被调用函数修改。

另一种方法是使用 ByVal ,在这种情况下,将值的临时副本传递给被调用函数。因为它是临时的,所以当函数结束时所做的任何更改都会丢失。

Function Components(ByVal qty As Integer, ByVal stringSize As Integer)

需要注意的一件事......因为对象总是由对该对象的引用来引用,所以该引用的临时副本仍将指向原始对象。所以几乎是*好像正在传递一个对象 ByRef即使您指定 ByVal . ( * 除非函数要对该参数执行 Set 到某个其他对象,否则原始对象仍将被指向函数外部。)

MSDN documentation

关于传递给函数的 VBA 变量被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44320800/

相关文章:

excel - 谷歌电子表格 : Compare 2 arrays

vba - AddComment 导致应用程序定义或对象定义的错误

vba - XHTML 网站抓取指南

c# - 如何查找单元格的命名范围 - VSTO

vba - Excel在msgbox中显示变量数据

vba - 无法更改合并单元格的一部分错误 Excel VBA

Excel VBA 仅对选定行中的某些单元格着色

sorting - 使用自定义顺序和包含逗号的值编写 Excel VBA 排序代码

excel - 用VBA打开excel文件的最快方法

excel - 在 JOIN 中使用 CASE 加速 SQL 查询