2011-06-12 56 views
2

我想要从预定义列表中搜索任意单词(标准)的描述单元格,并从相邻单元格中获取该项目的相关金额。使用多个字符串标准搜索Excel

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

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

回答

2

创建一个名称(如命名范围,而是指一个值,而不是一个范围。)

对于Excel 2007和2010年,公式选项卡上,定义名称组,名称管理器
对于Excel 2003插入,名称,定义

创建一个新的名称(允许使用的名称“关键词”),设置“指的是”价值

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

后的公式编辑作为进入数组公式

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

编辑列表然后编辑KeyWords的值就是指值。这可以通过名称管理器来完成,或者如果你愿意,通过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 
+0

Chris,你的解决方案对我来说是一个理想的设置,但是当公式中使用KeyWords时,excel只会识​​别引用值中的第一项(“* costco *”)。有任何想法吗? – Ankit 2011-06-13 11:39:23

+0

作为数组公式输入公式(按ctrl-shift-进入,而不是只输入) – 2011-06-13 12:48:18

+0

伟大的解决它!最后一个问题,我将如何使用VBA编辑“引用值”的值? – Ankit 2011-06-13 13:46:32

1

负载你正在寻找到一个数组(经由转换范围到一个数组,或者具有用户选择从一个小的形式你设计串)

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转换为数组可能会更好。

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

+0

感谢您的快速反应!我在围绕逻辑方面遇到了一些麻烦。是arrCategories还是catg包含要搜索的字符串的数组? – Ankit 2011-06-13 12:26:16

+0

@Ankit arrCategories是一个包含字符串“* costco *”,“* saputo *”,“* t&t *”'的数组。 'catg'代表循环过程中'arrCategories'中的当前项(在循环的第一次迭代期间等于“* costco *”)。 – jonsca 2011-06-13 12:33:21

+0

啊,现在我明白了逻辑,谢谢。但是,“If xcel = catg”行确实匹配,我需要一个近似匹配(描述列是一个句子)。我试图使用Like运算符,但没有取得任何成功。在这种情况下也许有一种方法可以使用通配符,我无法弄清楚如何? – Ankit 2011-06-13 21:16:31