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