Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
vba:传递给函数的字典充当;ByRef“;当强制为“时”;“拜瓦尔”;_Vba_Dictionary - Fatal编程技术网

vba:传递给函数的字典充当;ByRef“;当强制为“时”;“拜瓦尔”;

vba:传递给函数的字典充当;ByRef“;当强制为“时”;“拜瓦尔”;,vba,dictionary,Vba,Dictionary,我有一个字典dictA包含{AA,1},{AB,2},{AC,3},还有一个调整字典dictAdj包含{AB,-4} 我将这两个函数传递到一个函数中,调用它funcReconcile(ByVal Arg1作为Dictionary,ByVal Arg2作为Dictionary)作为Dictionary 函数将遍历dictAdj的内容,以查看它们是否存在于dictA中 然后,函数将调整dictA(例如)以在输出字典中显示{AA,1},{AB,-2},{AC,3} 由于某种原因,当函数返回字典时,我原

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

我将这两个函数传递到一个函数中,调用它
funcReconcile(ByVal Arg1作为Dictionary,ByVal Arg2作为Dictionary)作为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时存在一些问题,但这是我第一次用这样的东西真的碰壁


有什么建议吗?(没有双关语)

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

赋值给一个新变量只是将原始引用赋值给新变量——它指向原始数据

以下是来自以下网站的一些零碎代码:


这篇文章真的很老了,可能对原来的海报没什么帮助。我是在研究这个问题时发现的。我的解决方案(我相信)更好。它使用linq,而不是一个节省资源的循环。我的代码是用vb编写的,因为我的项目正在使用vb,但是您可以使用代码转换器来更改函数

简单的单线解决方案。2个单独的字典是真实副本(单独的标识):


字典是一种引用类型。有没有办法强迫它或锁定它?我甚至在函数中重铸了一个新变量。不走运。另外,这是vba…不是C#您需要手动复制字典。jason,有关@SLaks谈论的内容的更多信息,请参阅我对该答案的评论:非常旧的答案。。。但这是VB.NET代码,问题是(曾经?)关于VBA。。。因此不适用,这是正确的。不幸的是已经三年多了,我无法解释为什么我错过了这个。我刚刚毕业(5月13日),所以我将不得不接受我尝试过但回答错误的答案。
a=dictionary1.items
b=dictionary1.keys
for i=0 to ubound(a)
  dictionary2.add(b(i), a(i))
next
Dim dictionary2 As Dictionary(Of Integer, String) = dictionary1.ToDictionary(Function(k) k.Key, Function(k) k.Value.ToString())