Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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字典中检索值,并在键未使用时引发错误?_Vba_Excel_Dictionary - Fatal编程技术网

是否尝试从VBA字典中检索值,并在键未使用时引发错误?

是否尝试从VBA字典中检索值,并在键未使用时引发错误?,vba,excel,dictionary,Vba,Excel,Dictionary,我在许多其他语言中使用过字典(无论它们是否被称为字典),但总有一种方法可以使用on参数调用,该参数可以是: A) 如果参数用作键,则返回相关值,或 B) 以某种方式指示该参数未用作键 在缺少.exists方法之前,我不得不学习excel/VBA并使用collections类整整五分钟,这迫使我不得不寻找其他方法。普遍的共识似乎是scripting.Dictionary类是其他语言中关联数组/字典/哈希表的VBA等价物 但我不喜欢的一点是,检索与给定键关联的值的唯一方法是使用.items属性(显式

我在许多其他语言中使用过字典(无论它们是否被称为字典),但总有一种方法可以使用on参数调用,该参数可以是:

A) 如果参数用作键,则返回相关值,或
B) 以某种方式指示该参数未用作键

在缺少.exists方法之前,我不得不学习excel/VBA并使用collections类整整五分钟,这迫使我不得不寻找其他方法。普遍的共识似乎是scripting.Dictionary类是其他语言中关联数组/字典/哈希表的VBA等价物

但我不喜欢的一点是,检索与给定键关联的值的唯一方法是使用.items属性(显式地或通过脚本.Dictionary(“key”))。但是,如果字典中没有使用key,它就添加了key,而不是做任何事情来指出问题

我知道我可以使用if结构和.exists作为测试来实现相同的功能,并且可以编写自己的函数,在exists测试失败时引发错误,但是在Python(raises KeyError)、PHP(raises a Notice)、Java中实现核心功能似乎需要大量的填充(映射返回null——虽然对于哈希映射来说,这并不一定理想,因为null实际上是一个有效值——但它确实可以作为哈希表的指示符)


那么,有没有任何方法可以尝试通过键检索值来做一些事情(理想情况下抛出一个错误)如果密钥没有被使用,而不是默默地添加它?谷歌没有提供任何答案-但也许我只是没有很好地使用搜索语句。

我发现当你访问一个不存在的密钥时,字典添加密钥也很不方便

只需使用
Collection
并自己编写缺少的
Exist
函数,例如

Function ExistsInCollection(ByVal c As Collection, ByVal key As Variant) As Boolean
  On Error GoTo not_exists
  c.Item key
  ExistsInCollection = True
not_exists:
End Function

您可以将scripting.dictionary包装在自定义类中,并使用(例如)一个“Get”方法,该方法使用Exists首先检查密钥是否存在,并在缺少密钥时引发和错误。我们希望这在没有自定义代码的情况下是可能的,这些自定义代码必须在我可能使用的任何站点上复制,但看起来自定义代码是唯一的选项:/至少它是一个小函数:)