如何在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