如何忽略Excel公式中的滤除数据

问题描述 投票:5回答:4

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

这是我目前的公式:

=INDEX(Table_owssvr__1[MyValues],MATCH([@[ID]],Table_owssvr__1[ID],0))
excel
4个回答
2
投票

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

但如果这不足以满足您的需求,here's如何检查某个细胞是否被过滤掉。

使用这个,我写了一些VBA代码来汇总一个只汇总可见单元格的列。做任何你需要做的事情都应该是一个非常有用的开始。

如果对单元格求和不是您想要的,只需更改注释中指示的部分即可。 (显然你必须将函数的名称从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更通用的功能,它具有隐藏和过滤单元的知识(有区别)。他们会在没有addins或VBA的情况下做到这一点,尽管有一些难以阅读的公式。

我是从here学到的。


1
投票

我已经能够通过以下方式实现这一目标:

1)创建三个工作表,一个用于客户,一个用于购买,一个用于purchaseforclient。

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)我使用customersforclient工作表中的now filtered值来获取客户端工作表中的索引/匹配公式。这允许我按日期,购买类型等动态过滤,并在客户端工作表中更新信息


0
投票

这个答案需要MOREFUNC插件*

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

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


* MOREFUNC ADDON

© www.soinside.com 2019 - 2024. All rights reserved.