Excel:在自动筛选的表格中计算单元格与上面的单元格之间的差异

时间:2018-08-15 08:40:26

标签: excel vba filter subtotal

我有一个表,其中A列包含递增的数值,B列是一堆名称。我需要根据名称过滤表,并使C列更新为当前行A列中的值与上方单元格之间的差。.

For example, I'd like to have something like this 哪一个, when filtered according to the Name column, should update the difference like so

我尝试以几种不同的方式使用SUBTOTAL函数,但无济于事。理想情况下,一旦更改表中的过滤器,它就会更新。我曾尝试在VBA中执行此操作,但到目前为止,我已经获得了仅使用硬编码过滤条件进行过滤的宏。

任何一种excel公式/ python / vba中的解决方案都受到欢迎,并表示赞赏!

如果这个问题不符合我在这里所说的新标准,我预先表示歉意:)提前谢谢!

@JvdV:This是我尝试实现您的公式的结果,This是经过过滤的结果。

2 个答案:

答案 0 :(得分:0)

修订后的答案

因此,在您感到惊讶之后,我研究了一个公式,该公式将为您提供当前行B值的差值减去该值之前出现的A值的B值。

=IFERROR(B2-LOOKUP(2,1/($A$1:A1=A2),$B$1:B2),0)

获取示例数据,看起来像这样:

enter image description here

然后,当您应用过滤器时,它将看起来像这样:

enter image description here

因此,使用此替代方法时,如果未应用过滤器,则没有正确的值,但是在这种情况下,我认为您对过滤 IS 时的差异感兴趣!

将公式输入到单元格C2中并向下拖动。

编辑

如果这不是您想要的答案,并且 DO 在未过滤时需要这些值,请使用如下所示的UDF:

Public Function LastVisibleCell(CL As Range) As Long

Dim RW As Long, X As Long
RW = CL.Row - 1
On Error GoTo 1

If RW > 1 Then
    For X = RW To 1 Step -1
        If ActiveSheet.Rows(X).EntireRow.Hidden Then
        Else
            LastVisibleCell = Cells(CL.Row, 2).Value - Cells(X, 2).Value
            Exit For
        End If
    Next X
Else
1:    LastVisibleCell = 0
End If

End Function

从像元C2的单元格=LastVisibleCell(A2)调用它,然后向下拖动。应用过滤器后,单元格将更新。

请注意,这需要很长时间才能在大型数据集上进行更新!

答案 1 :(得分:0)

经过3天的紧张(尽管无效)的Googleing,我终于在堆栈溢出时也遇到了这个answer

但是,当我处理大量数据(> 150,000行)时,问题中的方法使用了过多的内存。使用VBA将公式粘贴到可见单元格中似乎并不能缓解问题。

Sub CopyPasteFormula()
    Dim Ws As Worksheet
    Dim LRow As Long
    Dim PasteRng As Range

    Set Ws = Worksheets("Translated Data")
    Ws.Range("$D$2:$D$200000").AutoFilter Field:=4, Criteria1:="<>-", Operator:=xlFilterValues
    LRow = Ws.Range("D" & Rows.Count).End(xlUp).Row
    Set PasteRng = Ws.Range("A3:A" & LRow).SpecialCells(xlCellTypeVisible)
    Ws.Range("A3").Copy
    PasteRng.PasteSpecial xlPasteFormulas
    Application.CutCopyMode = False
End Sub

上面是我的宏代码,试图减少内存使用...感谢任何反馈!