在字符串中搜索并返回“ * 1 *”,在Excel中也返回包含“ * 11 *”的实例

时间:2019-08-16 14:42:14

标签: excel excel-formula

我正尝试通过index(match)和right(len)-find()函数的组合从带有文本的数据数组中提取单元格。在我的公式中,我正在搜索“ * DS#1 ”的实例,excel会返回这些实例,但还会返回带有“ DS#11 *”的实例。如何获得Excel仅返回DS#1的信息?

我试图使用if语句,但没有成功,if(formula =“ * 11 *”,“”,formula)。

以下是数据示例的链接。以黄色突出显示的第一个单元格不应返回该文本,而应为“”。以黄色突出显示的第二个单元格适合返回该数据。
example data

= RIGHT(INDEX($ V:$ AC,MATCH(“ DS#1”,$ AC:$ AC,0),1),LEN(INDEX($ V:$ AC,MATCH(FW $ 1,$ AC:$ AC,0),1))-FIND($ AG2,INDEX($ V:$ AC,MATCH(FW $ 1,$ AC:$ AC,0),1))+ 1)

4 个答案:

答案 0 :(得分:1)

这是您可以适应您的范围的公式,该公式将返回范围rngDS中包含findDS的列表。我使用了命名范围,但是您可以将它们调整为自己的范围。

由于您选择不发布数据示例或所需结果,因此不确定是否要这样做。

例程找到findDS字符串,然后检查以确保以下字符为非数字。

C1: =IFERROR(INDEX(rngDS,AGGREGATE(15,6,1/(NOT(ISNUMBER(-MID(rngDS,SEARCH(findDS,rngDS)+LEN(findDS),1))+ISERROR(MID(rngDS,SEARCH(findDS,rngDS)+LEN(findDS),1))))*ROW(rngDS),ROWS($1:1))),"")

并填写

enter image description here

答案 1 :(得分:1)

这里有一些有关如何查找值并检查以下字符的示例。

enter image description here

D2中的公式:

=INDEX(A2:A6,MATCH(1,INDEX((ISNUMBER(SEARCH("DS#1",B2:B6)))*(NOT(ISNUMBER(MID(B2:B6,SEARCH(C2,B2:B6)+LEN(C2),1)*1))),0),0))

答案 2 :(得分:0)

提出基于公式的解决方案非常困难,尤其是当您需要先区分DS1,DS#1时。然后,DS#11,DS#11X等会在每个DS代码后查找文本字符串,更不用说这些混乱的代码可能(也可能不会)以随机顺序放置在文本字符串中。

一种更好的方法是使用 Power Query (在 Excel 2010和更高版本中可用)。我的解决方案是使用 Excel 2016

假定您具有以下两个表:

Source

您可以使用数据标签中的来自表功能,将两个表都添加到 Power Query Editor

添加后,制作表1的副本。我已将副本重命名为Table1 (2) - Number Ref。然后,您应该有三个未编辑的查询:

Queries List

如果您的源数据是包含其他一些信息的较大表,则可以在Google上搜索如何向编辑器添加工作表,以及如何删除不必要的列并删除重复的值。

  

首先,让我们开始使用表1

Table1

以下是步骤:

  1. 使用替换值功能从文本字符串中删除所有 # ,然后替换所有 DS 在文本字符串中使用 DS# ,因此所有DS代码均采用 DS#XXX 格式。例如。 DS8 将更改为 DS#8 。如果DS8和DS#8是有效代码,则可能无需执行此步骤;
  2. 使用拆分列函数用单词 DS 拆分文本字符串,并将每个子文本字符串放入新行,那么您应该具有以下条件:

Split into rows

  1. 再次使用拆分列函数将文本字符串从左侧按1个字符拆分,您应该具有以下内容:

Split by 1 character

  1. 过滤第一列以仅显示哈希标签 # ,然后删除第一列,则应具有以下内容:

Filtered

  1. 重复使用替换值函数从文本字符串中删除以下字符/符号:()HTJHSK//,并用空格-代替破折号。我认为这些内容与评论无关,但是如果需要,您可以将其保留。那你应该有:

Cleaned

    再次使用
  1. 使用拆分列功能通过左侧的第一个空格拆分文本字符串,那么您应该具有:

Splited Again

  1. 然后,您可以修剪清洁第二列以进一步整理注释,将这些列重命名为 DS#注释和连续的数字引用,然后将第三列的格式更改为“文本” 。那你应该有:

Renamed

  1. 最后一步是添加一个名为Match ID的自定义列,以将第一列和第三列中的值组合为一个文本字符串,如下所示:

Added Column

  

其次,让我们处理表1(2)-参考编号

以下是步骤:

  1. 删除第一列,因此将Number Ref列保留为单列;
  2. 转置该列,然后将第一行提升为标题。那你应该有:

Number Ref

此查询的目的是将所有数字引用转换为列标题,然后将该查询追加与下一个查询( Table2 )达到预期的结果,我将在下一节中说明。

  

最后,让我们处理第三个查询 Table2

以下是步骤:

  1. 在表中附加上一步中的 Number Ref 表;

Append

  1. 突出显示整个表格,并使用替换值功能将所有 null 替换为数字 1 。然后突出显示第一列,并使用 Unpivot Other Columns (取消其他列)函数来转换表格,如下所示:

Unpivot

  1. 然后删除最后一列Value),并添加一个名为Match ID的新自定义列以合并 DS代码数字参考。那你应该有:

Added Match ID

    如下所示,使用Match ID
  1. 合并 Table1 的表:

Merge

  1. 展开新合并的列Table1以显示评论;

Expand

  1. 使用拆分列功能将第一列按非数字拆分为数字,将digit column的格式更改为整数< / strong>,然后排序 Attribute列,然后digit column连续升序,那么您应该:

Sorted

  1. 再次使用拆分列功能,以破折号Match ID拆分-列,并删除前三列,重命名其余的列三个列,分别为 DS#编号参考注释,那么您应该具有:

Final

  1. 关闭并加载该表至所需的新工作表,该工作表可能如下所示:

Loaded

  

最后,由您完全决定如何在Power Query中构造表。您可以在编辑器中预先过滤“数字引用”,仅将相关结果加载到工作表中,也可以将整个表加载到工作表中,并使用 VLOOKUP INDEX 进行检索数据,也可以将第三个查询加载到数据模型,然后在其中创建要使用的数据透视表。

以下是幕后代码仅供参考。 所有步骤均使用编辑器的内置功能,而无需任何高级手动编码。

表1

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Comments", type text}}),
    #"Replaced Value8" = Table.ReplaceValue(#"Changed Type","#","",Replacer.ReplaceText,{"Comments"}),
    #"Replaced Value9" = Table.ReplaceValue(#"Replaced Value8","DS","DS#",Replacer.ReplaceText,{"Comments"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Value9", {{"Comments", Splitter.SplitTextByDelimiter("DS", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Comments"),
    #"Split Column by Position" = Table.SplitColumn(#"Split Column by Delimiter", "Comments", Splitter.SplitTextByPositions({0, 1}, false), {"Comments.1", "Comments.2"}),
    #"Filtered Rows" = Table.SelectRows(#"Split Column by Position", each ([Comments.1] = "#")),
    #"Removed Columns" = Table.RemoveColumns(#"Filtered Rows",{"Comments.1"}),
    #"Replaced Value1" = Table.ReplaceValue(#"Removed Columns",")","",Replacer.ReplaceText,{"Comments.2"}),
    #"Replaced Value2" = Table.ReplaceValue(#"Replaced Value1","-"," ",Replacer.ReplaceText,{"Comments.2"}),
    #"Replaced Value3" = Table.ReplaceValue(#"Replaced Value2","(","",Replacer.ReplaceText,{"Comments.2"}),
    #"Replaced Value4" = Table.ReplaceValue(#"Replaced Value3","HT","",Replacer.ReplaceText,{"Comments.2"}),
    #"Replaced Value5" = Table.ReplaceValue(#"Replaced Value4","JH","",Replacer.ReplaceText,{"Comments.2"}),
    #"Replaced Value6" = Table.ReplaceValue(#"Replaced Value5","SK","",Replacer.ReplaceText,{"Comments.2"}),
    #"Replaced Value7" = Table.ReplaceValue(#"Replaced Value6","//","",Replacer.ReplaceText,{"Comments.2"}),
    #"Split Column by Delimiter1" = Table.SplitColumn(#"Replaced Value7", "Comments.2", Splitter.SplitTextByEachDelimiter({" "}, QuoteStyle.Csv, false), {"Comments.2.1", "Comments.2.2"}),
    #"Trimmed Text" = Table.TransformColumns(#"Split Column by Delimiter1",{{"Comments.2.2", Text.Trim, type text}}),
    #"Cleaned Text" = Table.TransformColumns(#"Trimmed Text",{{"Comments.2.2", Text.Clean, type text}}),
    #"Renamed Columns" = Table.RenameColumns(#"Cleaned Text",{{"Comments.2.1", "DS#"}, {"Comments.2.2", "Comments"}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"Number Ref", type text}}),
    #"Added Custom" = Table.AddColumn(#"Changed Type1", "Match ID", each "DS#"&[#"DS#"]&"-"&[Number Ref])
in
    #"Added Custom"

表1(2)-参考编号

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Comments", type text}, {"Number Ref", Int64.Type}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Changed Type",{"Number Ref"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Removed Other Columns",{{"Number Ref", type text}}),
    #"Transposed Table" = Table.Transpose(#"Changed Type1"),
    #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table", [PromoteAllScalars=true]),
    #"Changed Type2" = Table.TransformColumnTypes(#"Promoted Headers",{{"388", type any}, {"1", type any}})
in
    #"Changed Type2"

表2

let
    Source = Excel.CurrentWorkbook(){[Name="Table2"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"List", type text}}),
    #"Appended Query" = Table.Combine({#"Changed Type", #"Table1 (2) - Number Ref"}),
    #"Replaced Value" = Table.ReplaceValue(#"Appended Query",null,"1",Replacer.ReplaceValue,{"List", "388", "1"}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Replaced Value", {"List"}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Value"}),
    #"Added Custom" = Table.AddColumn(#"Removed Columns", "Match ID", each [List]&"-"&[Attribute]),
    #"Merged Queries" = Table.NestedJoin(#"Added Custom", {"Match ID"}, Table1, {"Match ID"}, "Table1", JoinKind.LeftOuter),
    #"Expanded Table1" = Table.ExpandTableColumn(#"Merged Queries", "Table1", {"Comments"}, {"Comments"}),
    #"Split Column by Character Transition" = Table.SplitColumn(#"Expanded Table1", "List", Splitter.SplitTextByCharacterTransition((c) => not List.Contains({"0".."9"}, c), {"0".."9"}), {"List.1", "List.2"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Character Transition",{{"List.2", Int64.Type}}),
    #"Sorted Rows" = Table.Sort(#"Changed Type1",{{"Attribute", Order.Ascending}, {"List.2", Order.Ascending}}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Sorted Rows", "Match ID", Splitter.SplitTextByDelimiter("-", QuoteStyle.Csv), {"Match ID.1", "Match ID.2"}),
    #"Changed Type2" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"List.1", type text}, {"Match ID.1", type text}, {"Match ID.2", type text}}),
    #"Removed Other Columns" = Table.SelectColumns(#"Changed Type2",{"Match ID.1", "Match ID.2", "Comments"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Other Columns",{{"Match ID.1", "DS#"}, {"Match ID.2", "Number Ref"}})
in
    #"Renamed Columns"

干杯:)

答案 3 :(得分:0)

基于这篇帖子的创造性答案,我能够接受其中一些想法并形成解决方案。我发现的解决方案分为两部分。第一种是将我尝试过滤的字符串替换为数据中任何实例中都没有出现的随机文本。由于我需要替换一系列数据(从DS11到DS19),因此我使用了VBA函数来避免使用大型嵌套函数。

一旦我要过滤掉的字符串被替换,我添加了一个If(Isnumber(search())函数,当返回替换的文本时显示“”。

Function REPLACETEXTS(strInput As String, rngFind As Range, rngReplace As Range) As String

Dim strTemp As String
Dim strFind As String
Dim strReplace As String

Dim cellFind As Range

Dim lngColFind As Long
Dim lngRowFind As Long
Dim lngRowReplace As Long
Dim lngColReplace As Long

lngColFind = rngFind.Columns.Count
lngRowFind = rngFind.Rows.Count
lngColReplace = rngFind.Columns.Count
lngRowReplace = rngFind.Rows.Count

strTemp = strInput

If Not ((lngColFind = lngColReplace) And (lngRowFind = lngRowReplace)) Then
    REPLACETEXTS = CVErr(xlErrNA)
    Exit Function
End If

For Each cellFind In rngFind

    strFind = cellFind.Value
    strReplace = rngReplace(cellFind.Row - rngFind.Row + 1, cellFind.Column - rngFind.Column + 1).Value
    strTemp = Replace(strTemp, strFind, strReplace)

Next cellFind

REPLACETEXTS = strTemp

End Function