我正在使用索引/匹配来从相关表中获取数据以填充第一个表。在我的相关表中,我已经过滤掉了值,但过滤掉的值仍在我的第一个表中填充。如果索引/匹配不够智能,只能获取过滤后的值,我该如何解决此问题(首选公式,但VBA可接受)才能获得过滤后的值。
这是我目前的公式:
=INDEX(Table_owssvr__1[MyValues],MATCH([@[ID]],Table_owssvr__1[ID],0))
答案 0 :(得分: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
答案 1 :(得分:2)
LondonRob提到了SUBTOTAL功能。 AGGREGATE是一个比SUBTOTAL更通用的函数,它在隐藏和过滤单元格的知识下运行(存在差异)。他们会在没有addins或VBA的情况下做到这一点,尽管有一些难以阅读的公式。
我是从here了解到的。
答案 2 :(得分: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滤波值作为客户端工作表中的索引/匹配公式。这允许我按日期,购买类型等动态过滤,并在客户端工作表中更新信息
答案 3 :(得分:0)
此答案需要MOREFUNC插件*
=INDEX(ARRAY.FILTER(Table_owssvr__1[MyValues]),MATCH([@[ID]],ARRAY.FILTER(Table_owssvr__1[ID]),0))
ARRAY.FILTER()
function&#34;仅存储数组中范围的可见单元格(例如过滤范围)并返回此数组。 &#34;
* MOREFUNC ADDON