我在 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),"")
我已经从全列引用中删减了引用的单元格范围,以尽量减少计算滞后。INDIRECT
和INDEX
(此处为数组形式)都被视为易挥发的每次发生计算循环时都会重新计算的函数;而不仅仅是当直接影响它们的值发生变化时。根据需要填写。
我已经在我的 OneDrive 上为您提供了该示例工作簿这里供参考和下载。
这可能会让你忙上一阵子,因为你要自己转录公式。回复任何具体的如果您遇到问题,您会有疑问。