如何在Excel公式中忽略筛选出的数据

如何在Excel公式中忽略筛选出的数据,excel,Excel,我使用索引/匹配从相关表中获取数据以填充到第一个表中。在我的相关表中,我已经过滤掉了值,但是过滤掉的值仍然填充在我的第一个表中。如果索引/匹配不够智能,无法仅获取过滤的值,我如何解决此问题(首选公式,但VBA可接受),以仅获取过滤的值 以下是我目前的公式: =INDEX(Table_owssvr__1[MyValues],MATCH([@[ID]],Table_owssvr__1[ID],0)) 我已经能够通过以下方式实现这一点: 1) 创建三个工作表,一个用于客户,一个用于购买,另一个用于P

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

以下是我目前的公式:

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

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

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
Public CurrentValue为双精度
专用子工作表_Activate()
CurrentValue=Application.WorksheetFunction.Sum(ActiveSheet.Range(“B23”))
端接头
专用子工作表_Calculate()
如果Application.WorksheetFunction.Sum(范围(“B23”)CurrentValue,则购买
端接头
4) 我使用purchasesforclient工作表中现在过滤的值作为客户工作表中的索引/匹配公式。这允许我按日期、购买类型等进行动态筛选,并在客户工作表中更新信息。您可能会发现该函数很有用,因为它只适用于可见行。(《代码》小计的一般性讨论)

但如果这不够灵活,无法满足您的需要,那么如何检查某个单元格是否被过滤掉

使用此方法,我编写了一些VBA代码,以便在一列上求和,只求可见单元格的和。在做任何你需要做的事情时,这应该是一个非常有用的开始

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

公共函数sumFilteredColumn(startCell作为范围)
将lastRow变暗为“startCell所在工作表的最后一行”
小电流单元作为量程
Dim runningTotal,只要“记录到目前为止的金额”
lastRow=lastRowOnSheet(startCell)
设置currentCell=startCell
'循环直到工作表的最后一行

当currentCell.Row时执行此操作此答案需要MOREFUNC插件*

=索引(ARRAY.FILTER(Table_owsvr_uu1[MyValues]),匹配([@[ID]],ARRAY.FILTER(Table_owsvr_u1[ID]),0))

“在数组中仅存储区域(例如筛选区域)的可见单元格,并返回此数组。”



*MOREFUNC插件

  • Morefunc插件是一个包含66个新工作表函数的免费库
  • 是一些信息(由原作者提供)
  • 这是我找到的最后一件作品
  • 这是一个好主意
伦敦罗布提到了这个功能。是一个比小计更通用的函数,它使用隐藏单元格和过滤单元格的知识进行操作(有区别)。他们在没有ADDIN或VBA的情况下也能做到这一点,尽管有一些难以理解的公式


我是从.

=索引(表1[MyValues],匹配([@[ID]],表1[ID],0])按下编辑按钮,并将其放入问题中我认为excel公式从隐藏区域获取数据的方式是聪明的,而不是相反。这意味着我们可以隐藏我们的工作,并且仍然有引用这些隐藏区域的公式。您必须将筛选条件添加到索引/匹配公式中,以便它知道应该忽略什么。您有一个如何做到这一点的示例吗?虽然这在理论上可以回答问题,但在这里包括答案的基本部分,并提供链接以供参考。该下载链接并非指向原始作者网站。我不相信像这样的随机下载网站有干净的文件。此加载项仅适用于Excel 2007及更早版本。看起来您可能必须在最新版本的Excel中“重新发明这个轮子”。源代码不可用。隐藏的。
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