根据另一个列表提取列表的子字符串

时间:2012-03-25 15:20:42

标签: excel vba excel-vba excel-formula

使用两个列表,一个由以各种形式添加信息的名称组成(参见下面的示例 - 列表1)和一个由明确格式化名称组成的列表,即没有添加信息(列表2)

List 1
--------
Netto City      | Value
Imerco City     | value 
Bilka Suburb    | value
Bauhaus, City   | Value
City FDB Superb | Value

List 2
------
Netto
Imerco
Bilka
Bauhaus
FDB Super

我要做的是创建一个过滤器,这样无论我的源数据(列表1)的第一列是什么样子,我都可以根据(列表2)对值进行求和。

类似于此的内容:Excel - extracting data based on another list

我尝试使用vlookup,但是这不会搜索子字符串,然后我尝试使用

=IF(COUNTIF(A$4:A$9;"*"&D5&"*")>0;
    INDIRECT(ADDRESS(MATCH("*"&D5&"*";A$4:A$9;0);4));"not found")

但是,这似乎与列表2中的单个单元格值的搜索列表1相反。 如果这项工作同样适用,我无法完全理解,无论如何我都无法让它工作,因此我寻找另一种方式。搜索列表2,列表1中的每个项目。

但是,最终,我想要完成的是从源数据创建一个列表,我可以用它来对列表1中的每个项目进行分类,基于列表3

List 3
Bilka     | Cat1
Imerco    | Cat2
FDB Super | Cat1
etc. 

为了实现这一点,我需要一个干净的源数据列表,而不需要随附的所有额外信息。

我使用以下sumif

=SUMIFS($F$3:$F$703;$B$3:$B$703;
    "="&$H4;$D$3:$D$703;">="&I$2;$D$3:$D$703;"<="&I$3)

将属于列表3中的特定项目(我手动创建列表3)的所有总和加到日期之间。

这样做的目的是创建一个包含特定商店或自己选择的类别的所有支出的工作表,例如列表1中列出的支出主要是食品商店。

编辑 - 澄清。

我建议做的是多阶段过程。 阶段1: 插入原始源数据(完成)

第二阶段: 过滤唯一值的源数据(完成)

第3阶段: 为源数据中的每个项目创建批准名称列表   - 即,Bilka郊区进入Bilka,Netto City进入Netto 这里'Netto'和'Bilka'是经过批准的名称,可以手动创建,以便在第4阶段进行分组。我希望自动化这一步。

第四阶段: 根据名称和日期间隔对每个项目进行分组,每周每月一次(完成),如果我只能使第3阶段工作,因为它适用于我的手动更正数据。

第五阶段: 选择适当的类别,并在第3阶段的结果列表中键入每个项目: Bilka,是一个食物的地方,所以它会得到类别'食物',与netto一样,包豪斯将获得“建筑用品”类别,这些项目中的每一个都将获得“费用”类型,其中说工资将得到类型'收入'(已完成)

第5阶段的解决方案只是一个vlookup,基于类别到表中列出每个类别的类型,因此这很简单。

最终解决方案:要求迭代的列表在G列中,并在列H中输出已批准的名称列表。如果无法知道“超级”等项目之间的区别,则会出现错误和“SU”,我不知道如何解决这个问题。如果有人对此有任何建议,我全都听见了。

Sub LoopCells()
Sheets("RawData").Select
Sheets("RawData").Activate
LRApproved = Cells(Rows.Count, "H").End(xlUp).Row
LRsource = Cells(Rows.Count, "G").End(xlUp).Row
For Each approvedcell In Worksheets("RawData").Range("H2:H" & LRApproved).Cells     'Approved stores entered by users
For Each sourcecell In Worksheets("RawData").Range("G2:G" & LRsource).Cells 'items found from bank statement export
    If InStr(UCase(sourcecell.Value), UCase(approvedcell.Value)) <> 0 Then
                sourcecell.Offset(0, 2).Value = approvedcell.Value
    End If
   Next sourcecell
Next approvedcell
End Sub

感谢所有帮助。 编辑:添加最终解决方案和VBA标记。<​​/ p>

3 个答案:

答案 0 :(得分:2)

这对我有用:

=SUM(B$3:B$7*NOT(ISERROR(SEARCH(A11,A$3:A$7))))

这假定您的示例列表1在A3:B7范围内,而您的列表2在A11:B15中。将上述公式粘贴到单元格B11中,然后按 Ctrl Shift - 输入将其作为数组公式输入。然后你可以将它一直拖动到B15。

说明:SEARCH例如列表1的单元格中的“Netto”。对于不包含该字符串的单元格,SEARCH返回错误。所以我们正在寻找不会返回错误的单元格。我们现在有一系列布尔指示这个。通过值数组将它逐个元素相乘。在此乘法中,TRUE被解释为1,FALSE被解释为零,因此您将筛选出与“Netto”不对应的值。

这是我的设置的一个截然:

enter image description here

答案 1 :(得分:1)

也许我误解了但你不能使用SUMIF?

=SUMIF(A$4:A$9;"*"&D5&"*";B$4:B$9)

答案 2 :(得分:0)

而不是使用VBA,您可以使用简单的小公式来提取它。 =索引(List2!A2:A10,匹配(1,Countif(List1A2,“”&amp; List2!A2:A10&amp;“”),0))(按Ctrl + Shift + Enter)。假设您要将列表2提取到列表1中。