【问题标题】:Search Excel with multiple string criteria使用多个字符串条件搜索 Excel
【发布时间】:2011-06-12 21:16:20
【问题描述】:

我想在描述单元格中搜索预定义列表中的任何单词(标准),并从相邻单元格中提取该项目的相关美元金额。

为了说明,这是我的设置:

   A   |   B   |   C   |     D    |    E    |   F    |

 Date  | Descr.| Amount|   Cat1   |   Cat2  |  Cat3  |

D、E、F:每一个都是项目类别。如果该行中的项目属于一个类别,我希望它的数量填充同一行中的该类别单元格。每个类别单元格都有一个公式来对此进行测试并执行操作。

我的第一个想法是使用 VLookup,但我有一个查找值列表。我无法成功地做到这一点。每个类别单元格都有这样的公式 -->

=IF(SUM(COUNTIF($B10,{"*costco*","*saputo*","*t & t*"}))>0,$C10," ")

B 列指的是描述,用于搜索任何条件。如果描述中包含任何单词,则单元格将填充 C 列中的数量,否则其左侧有一个空格。

这可以完美地工作,但是我需要标准(在这种情况下为 costco、saputo、t&t)是灵活的(在列表中添加或删除字符串),而不是在公式中硬编码。这是我的问题:如果我用对另一个单元格的引用替换标准,则公式将停止工作。我对 excel 比较陌生,不熟悉其功能的限制/约束,我怀疑这是问题所在。

非常感谢任何帮助,如果我需要提供更多信息,请告诉我。

Ankit

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    创建名称(类似于命名范围,但指的是值而不是范围。)

    对于 Excel 2007 和 2010,在“公式”选项卡、“已定义名称”组、“名称管理器”
    对于 Excel 2003 插入、名称、定义

    创建一个新名称(让我们使用名称“KeyWords”),将其“Refers To”值设置为

    ={"*costco*","*saputo*","*t & t*"}
    

    公式然后变成EDIT作为数组公式输入

    =IF(SUM(COUNTIF($B10,KeyWords))>0,$C10," ")
    

    编辑列表然后变成编辑关键字的值是指值。这可以通过名称管理器完成,或者如果您愿意,可以通过 VBA 完成

    编辑

    VBA 示例

    Sub SetKeyWords()
        Dim wb As Workbook
        Dim nm As Name
    
        Set wb = ActiveWorkbook
        Set nm = wb.Names("KeyWords")
        nm.RefersTo = "={""NewString""}"
    
    End Sub
    

    【讨论】:

    • 克里斯,您的解决方案对我来说是一个理想的设置,但是当关键字用于公式。有什么想法吗?
    • 将公式输入为数组公式(按 ctrl-shift-enter 而不是直接回车)
    • 太好了,解决了!最后一个问题,我将如何使用 VBA 编辑“引用值”的值?
    • @Ankit 添加了 VBA 示例。顺便说一句,如果你觉得答案有用,请接受它
    • 克里斯,我还要手动输入参考价值项目吗?我的目标是能够拥有一列关键字,VBA 可以使用这些关键字填充引用值。但是,这种设置似乎不可能?
    【解决方案2】:

    将您要查找的字符串加载到数组中(通过将范围转换为数组,或让用户从您设计的小表单中选择字符串)

     Sub MyLookup(arrCategories() As Variant)
        Dim searchrange As Range
        Dim xCell As Range
        Dim count As Integer
        'set searchrange to the proper column
        For Each xCell In searchrange
           For Each catg In arrCategories
              If xCell = catg Then
                  'Do something here
              End If
           Next catg
        Next xCell       
     End Sub
    

    您可能需要根据大小写是否重要来调整字符串数组。根据您的数据集的大小,将searchrange 转换为数组可能会更好。

    可能有一种更快的方法来查看是否在给定范围内找到了某些字符串,但这是一般的想法。

    【讨论】:

    • 感谢您的快速回复!我在理解逻辑时遇到了一些麻烦。是 arrCategories 还是 catg 保存要搜索的字符串的数组?
    • @Ankit arrCategories 是一个包含字符串 "*costco*","*saputo*","*t & t*" 的数组。 catg 表示循环进行时 arrCategories 中的当前项目(因此在循环的第一次迭代期间等于“costco”)。
    • 啊,现在我明白了逻辑,谢谢。但是,“如果 xcel = catg”行完全匹配,我需要一个近似匹配(描述列是一个句子)。我尝试使用 Like 运算符,但没有任何成功。也许有一种在这种情况下使用通配符的方法,我不知道怎么做?
    • 使用RegEx 可以解决问题。如果只是句子中的一个单词,可以使用InStr()查找。
    • InStr 工作感谢,很高兴了解 RegEx 的未来。感谢您的帮助,Chris' 在我的设置中更适用,但这非常有帮助,我相信它会在未来的项目中派上用场。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多