7

我有一个 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 脚本的情况下做到这一点?

4

2 回答 2

5

您可以使用复杂的非数组标准公式来执行此操作,但您必须在最初返回的内容之外填充几行,以便自动补偿未来的添加/删除/修改。

        列出第一、第二、第三行和条件

我已将目标表与源表放在同一个工作表上以节省此示例的空间,但我已调整公式中的单元格范围引用,以便您可以轻松分辨哪个是哪个。

首先将Apple输入 E4,然后将此公式输入 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 函数使用条件格式检查,以确保他们正在收集所有可能的行。这将表明何时没有足够的公式来捕获所有结果。实现类似的东西完全取决于用户。如果这是您想要使用的东西,请回复详细信息。

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

于 2015-04-26T02:07:38.123 回答
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
于 2013-05-25T03:21:52.750 回答