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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 Excel_Vba_Excel_Dictionary - Fatal编程技术网

基于通配符的词典项值检索-VBA Excel

基于通配符的词典项值检索-VBA Excel,vba,excel,dictionary,Vba,Excel,Dictionary,目前,我正在运行字典,以便根据表中存储的键来填充表中缺少的值。问题是我的表的值(键)比字典中存储的值(键)多。在某些情况下,我的表中的信息类似于字典中的某个键,我想知道是否可以使用通配符来检索这些项。示例如下: 字典中的示例记录: 梅赛德斯(钥匙)车(项目) 川崎(关键)电机(项目) 假设我的表有以下条目: Merc(钥匙),但缺少该项目,在本例中应为“汽车” 有可能做到这一点吗?如果这个例子不好,我很抱歉,但我希望你们中的任何人都能帮助我 我找到了几篇关于这个主题的文章: 提前

目前,我正在运行字典,以便根据表中存储的键来填充表中缺少的值。问题是我的表的值(键)比字典中存储的值(键)多。在某些情况下,我的表中的信息类似于字典中的某个键,我想知道是否可以使用通配符来检索这些项。示例如下:

字典中的示例记录:

  • 梅赛德斯(钥匙)车(项目)
  • 川崎(关键)电机(项目)
假设我的表有以下条目:

  • Merc(钥匙),但缺少该项目,在本例中应为“汽车”
有可能做到这一点吗?如果这个例子不好,我很抱歉,但我希望你们中的任何人都能帮助我

我找到了几篇关于这个主题的文章:


提前谢谢你

您可以编写一个返回布尔值的函数

Public Function KeywordExists(ByVal Keyword As String) As Boolean
    Dim k As Variant
    For Each k In objDict.Keys  'Your dictionary object
        If Keyword Like "*" & k & "*" Then
            KeywordExists = True
            Exit For
        End If
    Next k
End Function
称之为:

If KeywordExists("Foo") then '...
Dim key As String
    key = StringKeyword("Foo") 
编辑:

要返回键,只需将返回类型更改为string

Public Function StringKeyword(ByVal Keyword As String) As String
    Dim k As Variant
    For Each k In objDict.Keys  'Your dictionary object
        If Keyword Like "*" & k & "*" Then
            StringKeyword = K
            Exit For
        End If
    Next k
End Function
称之为:

If KeywordExists("Foo") then '...
Dim key As String
    key = StringKeyword("Foo") 

您可以编写一个返回布尔值的函数

Public Function KeywordExists(ByVal Keyword As String) As Boolean
    Dim k As Variant
    For Each k In objDict.Keys  'Your dictionary object
        If Keyword Like "*" & k & "*" Then
            KeywordExists = True
            Exit For
        End If
    Next k
End Function
称之为:

If KeywordExists("Foo") then '...
Dim key As String
    key = StringKeyword("Foo") 
编辑:

要返回键,只需将返回类型更改为string

Public Function StringKeyword(ByVal Keyword As String) As String
    Dim k As Variant
    For Each k In objDict.Keys  'Your dictionary object
        If Keyword Like "*" & k & "*" Then
            StringKeyword = K
            Exit For
        End If
    Next k
End Function
称之为:

If KeywordExists("Foo") then '...
Dim key As String
    key = StringKeyword("Foo") 

左栏回答:不要使用字典,也不要使用like,因为这种方法太慢,扩展性不好。请尝试以下方法之一:

  • 使用接受通配符的高级筛选器。您必须将数据转储到Excel中。但我假设数据已经在网格中的某个地方了。但是高级过滤器很快,我实际上在幕后使用它,在我构建的一个数据透视表过滤应用程序中,它允许用户根据多个通配符和复杂的排除项快速过滤数据透视表
  • 对已排序的数据使用二进制搜索算法。我经常发现它 在Excel中,通过将两个列表转储到Excel中,最容易做到这一点, 在那里分类,然后用我说的双VLOOKUP技巧 关于这里:
  • 查尔斯·威廉姆斯(Charles Williams)在这里发表了一篇非常有用的文章,不管怎样都应该阅读:
    左栏回答:不要使用字典,也不要使用like,因为这种方法太慢,扩展性不好。请尝试以下方法之一:

  • 使用接受通配符的高级筛选器。您必须将数据转储到Excel中。但我假设数据已经在网格中的某个地方了。但是高级过滤器很快,我实际上在幕后使用它,在我构建的一个数据透视表过滤应用程序中,它允许用户根据多个通配符和复杂的排除项快速过滤数据透视表
  • 对已排序的数据使用二进制搜索算法。我经常发现它 在Excel中,通过将两个列表转储到Excel中,最容易做到这一点, 在那里分类,然后用我说的双VLOOKUP技巧 关于这里:
  • 查尔斯·威廉姆斯(Charles Williams)在这里发表了一篇非常有用的文章,不管怎样都应该阅读:

    Hey@Kostas K.,但这不会从字典中返回键的值。它只会告诉我是否有类似的东西,请参见编辑。只需将返回类型从boolean更改为string并返回键即可。太棒了!我会把它标记为已回答,但我可以要求额外的东西吗?如果我在一个带有for循环的表中循环,并且需要在其中使用for-each,那么有没有办法提高性能?因为循环中的一个循环会使它变慢。谢谢你回答这个问题@Kostas K.外循环包含多少条记录?恐怕没有其他方法可以像那样使用
    。Dictionary有一个
    .Exists
    方法,但它只查找整个键(与上面的循环类似,但速度更快)。是的,我知道Exists,但遗憾的是它在这种情况下对我没有帮助。目前,主循环有12000条记录,而for-each正在其内部进行。但我希望我能在更多的数据上使用它,大约10万行。如果你不知道,它仍然是好的。谢谢你帮我解决这个问题@Kostas K.Hey@Kostas K.,但这不会从字典返回键的值。它只会告诉我是否有类似的东西,请参见编辑。只需将返回类型从boolean更改为string并返回键即可。太棒了!我会把它标记为已回答,但我可以要求额外的东西吗?如果我在一个带有for循环的表中循环,并且需要在其中使用for-each,那么有没有办法提高性能?因为循环中的一个循环会使它变慢。谢谢你回答这个问题@Kostas K.外循环包含多少条记录?恐怕没有其他方法可以像
    那样使用
    。Dictionary有一个
    .Exists
    方法,但它只查找整个键(与上面的循环类似,但速度更快)。是的,我知道Exists,但遗憾的是它在这种情况下对我没有帮助。目前,主循环有12000条记录,而for-each正在其内部进行。但我希望我能在更多的数据上使用它,大约10万行。如果你不知道,它仍然是好的。谢谢你帮我解决这个问题@谢谢你的回复!我会看看你分享的文章谢谢你的回复!我会看看你分享的文章