【问题标题】:How to ignore filtered-out data in Excel formula如何在 Excel 公式中忽略过滤掉的数据
【发布时间】:2018-09-18 11:06:17
【问题描述】:

我正在使用索引/匹配从相关表中获取数据以填充到第一个表中。在我的相关表中,我已经过滤掉了值,但过滤掉的值仍然填充在我的第一个表中。如果 Index/Match 不够聪明,只能抓取过滤后的值,我该如何解决这个问题(首选公式,但 VBA 可接受)以仅获取过滤后的值。

这是我目前的公式:

=INDEX(Table_owssvr__1[MyValues],MATCH([@[ID]],Table_owssvr__1[ID],0))

【问题讨论】:

  • =INDEX(Table_owssvr__1[MyValues],MATCH([@[ID]],Table_owssvr__1[ID],0​​))
  • 按下编辑按钮并将其放入问题中
  • 我认为 excel 公式从隐藏区域获取数据的方式很聪明,而不是相反。这意味着我们可以隐藏我们的工作,并且仍然有引用这些隐藏区域的公式。
  • 您必须将过滤条件添加到您的索引/匹配公式中,以便它知道要忽略什么
  • 你有如何做到这一点的例子吗?

标签: excel


【解决方案1】:

您可能会发现SUBTOTAL 函数很有用,因为它仅适用于可见行。 (HereSUBTOTAL 的一些更一般的讨论)

但如果这对您的需求不够灵活,here's 如何检查某个单元格是否被过滤掉。

使用它,我编写了一些 VBA 代码来对仅对可见单元格求和的列求和。应该是做任何你需要做的事情的一个非常有用的开始。

如果对单元格求和不是您想要做的,只需更改 cmets 中指示的部分。 (显然,您必须将函数名称从 sumFilteredColumn 更改为其他名称!)

Public Function sumFilteredColumn(startCell As Range)

    Dim lastRow As Long ' the last row of the worksheet which startCell is on
    Dim currentCell As Range
    Dim runningTotal As Long ' keeps track of the sum so far

    lastRow = lastRowOnSheet(startCell)
    Set currentCell = startCell

    ' Loop until the last row of the worksheet
    Do While currentCell.Row <= lastRow
        ' Check currentCell is not hidden
        If Not cellIsOnHiddenRow(currentCell) Then
            ' -------------------------------------------------
            ' Here's where the magic happens. Change this to
            ' change sum to, e.g. concatenate or multiply etc.
            If IsNumeric(currentCell.Value) Then
                runningTotal = runningTotal + currentCell.Value
            End If
            ' -------------------------------------------------
        End If
        Set currentCell = currentCell.Offset(1) ' Move current cell down
    Loop

    sumFilteredColumn = runningTotal

End Function

' return the number of the last row in the UsedRange
' of the sheet referenceRange appears in
Public Function lastRowOnSheet(referenceRange As Range) As Long

    Dim referenceSheet As Worksheet
    Dim referenceUsedRange As Range
    Dim usedRangeCellCount As Long
    Dim lastCell As Range

    Set referenceSheet = referenceRange.Parent
    Set referenceUsedRange = referenceSheet.usedRange
    usedRangeCellCount = referenceUsedRange.Cells.CountLarge

    Set lastCell = referenceUsedRange(usedRangeCellCount)
    lastRowOnSheet = lastCell.Row

End Function

' Is the row which referenceCell is on hidden by a filter?
Public Function cellIsOnHiddenRow(referenceCell As Range) As Boolean

    Dim referenceSheet As Worksheet
    Dim rowNumber As Long

    Set referenceSheet = referenceCell.Parent
    rowNumber = referenceCell.Row

    cellIsOnHiddenRow = referenceSheet.Rows(rowNumber).EntireRow.Hidden

End Function

【讨论】:

    【解决方案2】:

    LondonRob 提到了SUBTOTAL 函数。 AGGREGATE 是一个比 SUBTOTAL 更通用的函数,它使用隐藏和过滤单元格的知识进行操作(有区别)。他们会在没有插件或 VBA 的情况下做到这一点,尽管使用了一些难以阅读的公式。

    我是从here那里学到的。

    【讨论】:

    • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
    【解决方案3】:

    我已经能够通过以下方式完成这项工作:

    1) 创建三张工作表,一张用于客户,一张用于采购,一张用于采购。

    2) 创建宏以将过滤后的值复制到新工作表:

    Sub Purchases()
    Dim Rng As Range
    Set Rng = Worksheets("Comments").Columns("A")
    Set Rng = Rng.Resize(65535, 1).Offset(1, 0)
    Set Rng = Rng.Resize(, 5).SpecialCells(xlCellTypeVisible)
    Rng.Copy Worksheets("PurchasesforClient").Range("A2")
    End Sub
    

    3) 当我通过过滤器更新购买时,我在步骤 2 中通过创建小计字段并触发宏来运行宏,如下所示。由于它是一个公式,因此需要进行计算。这作为 VBA 嵌入在采购表中,其中 B23 是在应用过滤器后计算项目数量时发生变化的小计字段:

    Public CurrentValue As Double
    
    Private Sub Worksheet_Activate()
    CurrentValue = Application.WorksheetFunction.Sum(ActiveSheet.Range("B23"))
    End Sub
    
    Private Sub Worksheet_Calculate()
    If Application.WorksheetFunction.Sum(Range("B23")) <> CurrentValue Then Purchases
    End Sub
    

    4) 我在客户工作表中为我的索引/匹配公式使用采购工作表中现在过滤的值。这使我可以按日期、购买类型等动态过滤,并在客户工作表中更新信息

    【讨论】:

      【解决方案4】:

      此答案需要 MOREFUNC 插件*

      =INDEX(ARRAY.FILTER(Table_owssvr__1[MyValues]),MATCH([@[ID]],ARRAY.FILTER(Table_owssvr__1[ID]),0))

      ARRAY.FILTER() function "仅将范围的可见单元格(例如过滤范围)存储在数组中并返回此数组。"



      *MOREFUNC 插件

      【讨论】:

      • 那个下载链接不是原作者网站。我不相信像这样的随机下载站点有干净的文件。此加载项仅适用于 Excel 2007 及更早版本。看起来您可能不得不在最新版本的 Excel 中“重新发明这个轮子”。
      • 来源不可用。隐藏。
      猜你喜欢
      • 2021-06-20
      • 1970-01-01
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-06
      • 2020-12-02
      • 1970-01-01
      • 2022-12-21
      相关资源
      最近更新 更多