创build一个表格,显示另一张表格中的选定行

我有一个Excel工作簿的工作表,看起来像这样:

Apple | 15 | Bob Banana | 20 | Tim Apple | 19 | Mary Banana | 25 | Kate 

我想创build另一个工作表,只显示第一列中具有“Apple”的第一列的行:

 Apple | 15 | Bob Apple | 19 | Mary 

从某种意义上讲,这类似于SQL SELECT查询,我们在第一个表(表)中select具有给定值的所有条目。

问题是我不想不断维护第二张纸。 如果我改变第一张纸 – 例如,把第一行中的“苹果”改为“葡萄” – 我希望第二张纸自动更新,以便只显示“苹果”行 – 在这个例子中,只有“玛丽”现在将显示行。

这似乎是一个常用的function。 有没有可能做到这一点,而不使用Visual Basic脚本?

您可以使用复杂的非数组标准公式来实现这一点,但是您必须填写超出最初返回的行数,以便自动补偿将来的添加/删除/修改。

列出第一,第二,第三行的标准

我已经将目标表放在与源表相同的工作表上以节省此示例的空间,但是我已经调整了公式中的单元格区域引用,以便您可以轻松地确定哪个是哪个。

首先在E4中inputApple,然后将这个公式放到F4中。

 =IF(LEN($E4), IFERROR(INDEX('first sheet'!B$1:B$999, SMALL(INDEX(ROW($1:$999)+('first sheet'!$A$1:$A$999<>$E4)*1E+99, , ), ROW(1:1))), ""), "") 

填写G4的权利,然后填写F4:G4一行到F5:G5。 把这个公式放进E5。

 =IF(COUNTIF('first sheet'!A:A, E4)>(COUNTIF(E$4:E4, E4)), E4, "") 

现在填写E5:G5以从源工作表中捕获所有可能的返回(加上几行)。

在E4中input新的水果价值将立即改变返回数据的性质。

关于这个的计算不是非常复杂,指向源数据的单元格范围应该能够轻松地处理几千行,但随着源数据的增长,您将开始看到计算滞后。

我已经看到一些用户对COUNTIF或COUNTIFS函数使用条件格式检查来确保它们正在收集所有可能的行。 这将表明何时没有足够的公式来捕获所有的结果。 实现类似的东西是严格的用户。 如果这是你想要使用的东西,请回顾一下具体情况。

我已经把这个示例工作簿(具有不同的源和目标工作表)放在我的Office Cast上: Excel_Formula_to_Mimic_SQL_Query.xlsx 。

将以下代码复制到sheet1代码部分。

 Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False On Error Resume Next Dim lastRow As Long lastRow = Range("A" & Rows.Count).End(xlUp).Row Dim rng As Range, cell As Range Set rng = Range("A1:A" & lastRow) Sheets("sheet2").Cells.Clear If Not Intersect(rng, Target) Is Nothing And Target.Value <> "" Then For Each cell In rng If Trim(LCase(cell.Value)) = Trim(LCase(Range("A1"))) Then With Sheets("sheet2") cell.Resize(, 3).Copy .Cells(.Range("A" & .Rows.Count).End(xlUp).Row + 1, 1) End With End If Next End If Application.EnableEvents = True End Sub