检查某一列中两个标签之间是否存在某个标签

检查某一列中两个标签之间是否存在某个标签

我在 Excel 中有一列(称为 A),其中列出了不同的项目及其属性。每个项目都带有与之关联的单词“类型”,因此 A 列中有一个带有该标签的单元格,以便在其旁边的列(B)中可以列出类型。一些(并非全部)项目还带有与之关联的“小部件”标签。

由于每个项目只有一个“Type”标签,我希望能够让 Excel 搜索“Type”标签,然后检查在下一个“Type”标签之前是否有“Widget”标签,如果有,则将值粘贴到另一张表中“Type”标签旁边的 B 列中。它会继续执行此操作,直到找不到单词“Type”的更多实例。这是可行的吗?为了使布局更清晰,下面有一个示例列。请注意,不幸的是,每个条目之间的空格数不一致,因此不能用作跟踪一个条目的位置的方法。同样,单词“Widget”不必直接位于 Type 上方,它可以出现在两个“Type”实例之间的任何位置。

**Type**  01
Width     .5
Length    .4
Height    .3
Weight    15
Widget    Blue
**Type**  072
Width      .1 
Length     .1
Height     .1
Weight     50
**Type**   025
Width      .4
Length     .4
Widget     Red
Weight     11
Height     .4

单独表格上的期望输出将是:

01
025

因为这些是与小部件关联的类型。

答案1

更新公式。查找具有第一种类型和第二种类型的单元格,并在其之间查找单词 widget。如果存在,则返回类型旁边的值,如果不存在,则返回空白。

=IFERROR(IF(MATCH("widget",INDIRECT("A" & SMALL(IF(A:A="type",ROW(A:A),1000000),E1) & ":A" &                
SMALL(IF(A:A="type",ROW(A:A),1000000),E1+1)),0)>0,INDIRECT("B" & 
SMALL(IF(A:A="type",ROW(A:A),1000000),E1)),""),"")

使用 ctrl+shift+enter 输入

单元格 E1 将显示数字 1,E2 将显示数字 2。将公式向下复制以返回 WIDGET 的每个实例。如果不再有 WIDGET,则会出错,因此您可以在其周围使用 iferror。

可能需要一段时间来计算(或者我的电脑由于现在正在做其他事情而运行缓慢)。你最好使用宏。

下面是一个非常快速的尝试。它从下往上列出它们。基本上它从最后一行循环到第一行。如果它找到小部件,它会打开一个标志。如果标志打开并且它找到一个类型,它会返回它旁边的单元格。

*编辑宏来查找字符串中的类型或小部件,而不仅仅是精确匹配

Sub get_types()

Dim lRow As Long, cRow As Long, nRow As Long
Dim FindType As Boolean

FindType = False
nRow = 2

With Sheets("sheet1")
    lRow = .Range("A" & .Rows.Count).End(xlUp).Row

    For cRow = lRow To 1 Step -1
        If InStr(UCase(.Range("A" & cRow).Value), "WIDGET") > 0 Then FindType = True
        If FindType And InStr(UCase(.Range("A" & cRow).Value), "TYPE") > 0 Then
            .Range("E" & nRow).Value = .Range("B" & cRow).Value
            FindType = False
            nRow = nRow + 1
        End If
    Next
End With

End Sub

输出,蓝色单元格应列出,红色单元格被跳过,因为它没有小部件。由于循环的方向,单元格以相反的顺序列出。

在此处输入图片描述

答案2

您可以使用 IF AND 语句执行此操作,例如:

=IF(AND(A1="Widget",A2="**Type**"),B2,"")

这基本上告诉 Excel,如果文本“Widget”位于带有文本“**Type**”的单元格上方的单元格中,则输入 B 列中“**Type**”旁边的单元格中的数据,否则,将其留空。

最终结果如下:

在此处输入图片描述

如果您希望数据(本例中为 072)显示在另一个工作表中,则您的公式需要引用其特定工作表中的单元格。假设您在名为“Sheet 1”的工作表中有数据,请在您希望数据显示的工作表上使用此公式:

=IF(AND(Sheet1!A2="Widget",Sheet1!A3="**Type**"),Sheet1!B3,"")

答案3

以下是我对您的样本数据和要求的看法。请注意,我已扩展您的样本数据以演示如何处理多种情况。

         小部件类型

D2:G2 中的标准公式为:

D2 是 =IF(COUNTIF(A:A,"Widget")>COUNTIF(D$1:D1,"Widget"),"Widget","") `

E2 是=IF(LEN($D2),INDEX($B$1:$B$9999,SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"widget")*1E+99,,),ROW(1:1))),"")

F2 是=IF(LEN($D2),INDEX($B$1:$B$9999,SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"**Type**")*1E+99,,),COUNTIF(INDIRECT("A1:A"&SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"widget")*1E+99,,),ROW(1:1))),"**Type**"))),"")

G2 是=IF(LEN($D2),VLOOKUP("**Type**", INDIRECT("A"&SMALL(INDEX(ROW($1:$9999)+($A$1:$A$9999<>"widget")*1E+99,,),ROW(1:1))&":B9999"), 2, FALSE),"")

我已经从全列引用中删减了引用的单元格范围,以尽量减少计算滞后。INDIRECTINDEX(此处为数组形式)都被视为易挥发的每次发生计算循环时都会重新计算的函数;而不仅仅是当直接影响它们的值发生变化时。根据需要填写。

我已经在我的 OneDrive 上为您提供了该示例工作簿这里供参考和下载。

小部件_类型.xlsx

这可能会让你忙上一阵子,因为你要自己转录公式。回复任何具体的如果您遇到问题,您会有疑问。

相关内容