如何在Excel公式中忽略过滤掉的数据

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

这是我目前的公式:

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

您可能会发现SUBTOTAL函数有用,因为它只能在可见行上工作。 ( 这是关于SUBTOTAL的一些更一般的讨论)

但是,如果这不够灵活,以满足您的需求,以下是如何检查某个单元格是否被过滤掉。

使用这个,我已经写了一些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, eg 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 

我已经能够通过以下工作得到这个工作:

1)创build三个工作表,一个用于客户,一个用于采购,另一个用于采购客户。

2)创build一个macros将过滤的值复制到一个新的工作表中:

 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)当我通过filter更新购物时,我通过创build一个小计字段并按如下所示触发macros来在步骤2中运行macros。 由于这是一个公式,所以需要进行计算。 这是作为过滤发生的VBAembedded到采购工作表中,其中B23是在应用filter后计算项目数量时更改的小计字段:

 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)我使用客户工作表中的索引/匹配公式中purchaseforclient工作表中现在过滤的值。 这使我可以按date,购买types等进行dynamic过滤,并在客户端工作表中更新信息

LondonRob提到了SUBTOTALfunction。 AGGREGATE是一个比SUBTOTAL更为普遍的function,它可以同时知道隐藏和过滤的单元格(有区别)。 他们会这样做,没有插件或VBA,虽然有些难以阅读的公式。

我从这里学到了

你确实想让你的生活复杂化…

“不要试图重新发明轮子”,因为他们说…

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

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

我的回答需要MOREFUNC插件*


MOREFUNC ADDON

  • Morefunc Addon是一个包含66个新工作表函数的免费库。
  • 这里是一些信息(由原作者)
  • 这里是我发现的最后一个工作下载链接
  • 这里是一个很好的安装步行video