我想在数字列表中搜索其他数字的子列表。如果以相同的顺序找到子列表,则返回找到的子列表上方单元格中的值。
如果我使用这个公式
=INDEX(B3:B15,MATCH(D3,B3:B15,0)-1,1)
(考虑 B 列中的数据表,我在输出中输入了以下公式),
输出仅显示一个数字。
但是,我需要输出所有 3 个连续数字,而不是每个数字。如果我在“3 个数字”单元格中输入 4,2,9,则输出应显示这 3 个数字。
在下面的例子中,我搜索三个数字 4、2、9。我第一次找到这些数字,并返回以黄色突出显示的 4,因为它位于我找到这些数字的位置上方。我还返回以黄色突出显示的 6,因为它位于我搜索的三个数字的上方。
答案1
您可以使用宏来查找数字。按ALT+ F11。VBE 编辑器将打开。右键单击“此工作簿”,然后选择“插入”并选择“模块”。输入以下代码并按(或“播放”按钮)运行它。您也可以通过转到功能区的“开发人员”选项卡,单击“宏”,选择,然后单击 来F5启动宏。Find3Numbers
Run
Sub FindNumberAbove3Cells()
Dim i, j As Integer
Dim fvalue, svalue, tvalue As Integer
Dim found As Boolean
'Clear the cells
Range("F4") = ""
Range("F5") = ""
Range("F6") = ""
found = False
fvalue = Range("D4")
svalue = Range("D5")
tvalue = Range("D6")
i = 4
j = 4
Do
'Check if the 3 cells contain the 3 numbers we are searching
If (Range("B" & i) = fvalue) And (Range("B" & (i + 1)) = svalue) And (Range("B" & (i + 2)) = tvalue) Then
'Check of the content of the previous cell is a number
If IsNumeric(Range("B" & (i - 1))) Then
Range("F" & j) = Range("B" & (i - 1))
j = j + 1
found = True
End If
End If
i = i + 1
'Exit the loop when one of consecutive cells is empty
Loop While Range("B" & (i + 2)) <> ""
'If there are not values above the 3 consecutive cells, print #N/A on cell F4
If found = False Then
Range("F" & j) = "#N/A"
End If
End Sub
找到数字后的结果
未找到号码时的结果
答案2
由于我没有 O365 并且 Excel Online,因此我无法测试某些内容FILTERXML
,但可以E2
尝试:
=FILTERXML("<t><s>"&TEXTJOIN("</s><s>",1,IF(MID(CONCAT(A2:A14),SEQUENCE(13),3)=CONCAT(C2:C4),INDEX(A1:A13,SEQUENCE(13)),""))&"</s></t>","//s")
我可以在线测试的东西(更丑陋)
=FILTER(IF(MID(CONCAT(A2:A14),SEQUENCE(13),3)=CONCAT(C2:C4),INDEX(A1:A13,SEQUENCE(13)),""),IF(MID(CONCAT(A2:A14),SEQUENCE(13),3)=CONCAT(C2:C4),INDEX(A1:A13,SEQUENCE(13)),"")<>"")
答案3
据我理解,目标是在较长的列表中找到搜索到的数字列表。如果找到搜索到的列表,则从较长的列表中返回找到的列表上方单元格中的数字。
我决定将问题分解为几个步骤。首先,使用公式来查找三个数字的列表。这使用 OFFSET,并且在某种程度上与 3 个数字有关,但它有效并且可以在必要时进行扩展。
这是我的图像 D 列中的公式:
=AND(C4=$A$4,OFFSET(C4,1,0)=OFFSET($A$4,1,0),OFFSET(C4,2,0)=OFFSET($A$4,2,0))
该公式的基本含义是“如果 C 列中当前行 (4) 的值等于 A 列中列表中的第一个值,并且该值下方的值等于第二个值,并且该值下方的值等于那等于第 3 个值,则为 TRUE,否则为 FALSE”。通过向下拖动,我们得到一列 TRUE 和 FALSE。TRUE 表示找到的子列表的顶部。
为了获取找到的子列表上方的数字,我们可以再次使用 OFFSET。我图片中 E 列的公式是:
=IF(D4,OFFSET(C4,-1,0),"")
因此,如果 D 列为 TRUE(我们找到了子列表),则从上面一行的单元格中获取值。
您可以将 D 列和 E 列的公式合并为一个公式:
=IF(AND($C4=$A$4,OFFSET($C4,1,0)=OFFSET($A$4,1,0),OFFSET($C4,2,0)=OFFSET($A$4,2,0)),OFFSET($C4,-1,0),"")
如果您需要将输出返回到连续单元格的短列表中,则可以在 Excel 365 之前的版本中使用此功能:
={IFERROR(IF(COUNTIF($E$3:$E$16,"?*")<1,"",INDEX(E:E,SMALL(IF($E$3:$E$16<>"",ROW($E$3:$E$16)),ROWS(E$3:E3)))),"")}
(说实话,这很困难而且模糊)
或者,如果您拥有最新版本的 Excel 365 并且可以使用动态数组,则您可以直接使用以下命令:
=FILTER($E$4:$E$16,$E$4:$E$16<>"")
当然,可以在 E 列或 F 列上完成。
编辑:
要将其扩展为四个数字的列表,只需向 AND 函数添加一个新子句:
=IF(AND($C4=$A$4,OFFSET($C4,1,0)=OFFSET($A$4,1,0),OFFSET($C4,2,0)=OFFSET($A$4,2,0),OFFSET($C4,3,0)=OFFSET($A$4,3,0)),OFFSET($C4,-1,0),"")