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

问题描述 投票:1回答:3

使用两个列表,一个包含以各种形式添加信息的名称(参见下面的示例 - 列表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阶段:插入原始源数据(完成)

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

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

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

阶段5:选择适当的类别,并在第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标记。

excel vba excel-vba excel-formula
3个回答
2
投票

这对我有用:

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

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

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

这是我的设置的屏幕截图:


1
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.