vba:当被强制为“ByVal”时,字典传递给充当“ByRef”的函数

时间:2011-10-25 14:22:33

标签: vba dictionary

我有一个包含dictA的字典{AA,1},{AB,2},{AC,3}和一个包含dictAdj的调整字典{AB,-4}

我将这两个传递给函数调用funcReconcile(ByVal Arg1 as Dictionary, ByVal Arg2 as Dictionary) as Dictionary

该函数将循环遍历dictAdj的内容,以查看它们是否存在于dictA中。

然后该函数将调整dictA(例如)以在输出字典中显示{AA,1},{AB,-2},{AC,3}

由于某种原因,当函数返回字典时,我的原始dictA也会受到影响,导致它显示{AA,1},{AB,-2},{AC,3}而不是{AA,1},{AB,4},{AC,3}

我知道VBA中存在通过ByRef和ByVal传递对象的问题,但这是第一次真正用这样的东西撞到墙上。

任何指针? (没有双关语)

2 个答案:

答案 0 :(得分:2)

您必须构建复制方法,制作字典的完整副本,然后对副本进行修改。

分配给一个新变量只是将原始引用分配给新变量 - 它指向原始数据。

以下是Copy from one dictionary object into another?的一些零碎代码:

a=dictionary1.items
b=dictionary1.keys
for i=0 to ubound(a)
  dictionary2.add(b(i), a(i))
next

答案 1 :(得分:0)

这篇文章真的很旧,可能对原版海报没有帮助。我在研究同样的时候遇到过这个问题。我的解决方案(我相信)更好。它使用linq而不是节省资源的循环。我的代码在vb中,因为我的项目正在使用,但您可以使用代码转换器来更改函数。

简单的1行解决方案。 2个单独的词典,它们是真正的副本(单独的身份):

Dim dictionary2 As Dictionary(Of Integer, String) = dictionary1.ToDictionary(Function(k) k.Key, Function(k) k.Value.ToString())