gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:12:00 27 4
gpt4 key购买 nike

我已将变量作为参数传递给 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com