我有一个Excel工作簿,工作表看起来像这样:
Apple | 15 | Bob
Banana | 20 | Tim
Apple | 19 | Mary
Banana | 25 | Kate
我想要创建另一张工作表,该工作表仅显示第一张工作表中第一列中包含“Apple”的行:
Apple | 15 | Bob
Apple | 19 | Mary
在某种意义上,这类似于SQL SELECT查询,我们在第一个表(表)中选择具有给定值的所有条目。
问题在于我不想不断维持第二张纸。如果我更改第一张纸 - 例如,将第一行中的“Apple”更改为“Grape” - 我希望第二张纸自动更新,以便它只显示“Apple”行 - 在该示例中,仅显示“Mary”现在将显示行。
这似乎是一个非常有用的功能。是否可以在不使用Visual Basic脚本的情况下执行此操作?
答案 0 :(得分:5)
您可以使用复杂的非数组标准公式执行此操作,但您必须填写超出最初返回的行数,以便自动补偿将来的添加/删除/修改。
我已将目标表放在与源表相同的工作表上,以节省此样本的空间,但我已调整了公式中的单元格范围引用,以便您可以轻松判断哪个是哪个。 / p>
首先在E4中键入 Apple ,然后将此公式放入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中输入任何新的水果值会立即改变返回数据的性质。
对此的计算并不是非常复杂,指向源数据的单元格区域应该能够轻松处理几千行,但随着源数据的增长,您将开始看到计算延迟。
我见过一些用户对COUNTIF或COUNTIFS function使用条件格式检查,以确保他们收集所有可能的行。这将指示何时没有足够的公式来捕获所有结果。实现类似的东西完全取决于用户。如果那是您想要使用的内容,请回复具体内容。
我已将此示例工作簿(包含不同的源工作表和目标工作表)放在我的Office Cast上:Excel_Formula_to_Mimic_SQL_Query.xlsx。
答案 1 :(得分:0)
将以下代码复制到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