创建一个表,显示另一个工作表中的选定行

时间:2013-05-24 23:34:37

标签: excel select excel-formula

我有一个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脚本的情况下执行此操作?

2 个答案:

答案 0 :(得分:5)

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

List First, Second, Third rows with criteria

我已将目标表放在与源表相同的工作表上,以节省此样本的空间,但我已调整了公式中的单元格范围引用,以便您可以轻松判断哪个是哪个。 / 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中输入任何新的水果值会立即改变返回数据的性质。

对此的计算并不是非常复杂,指向源数据的单元格区域应该能够轻松处理几千行,但随着源数据的增长,您将开始看到计算延迟。

我见过一些用户对COUNTIFCOUNTIFS 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