Excel: 计算自动过滤后单元格与上面单元格的差异 table
Excel: Calculate difference between cell and cell above in an auto filtered table
我有一个 table,其中 A 列包含递增的数值,B 列是一堆名称。我需要根据名称过滤 table,并使用当前行中 A 列中的值与上方单元格中的值之间的差异更新 C 列..
For example, I'd like to have something like this
哪个,
when filtered according to the Name column, should update the difference like so
我曾尝试以几种不同的方式使用 SUBTOTAL 函数,但无济于事。理想情况下,它会在 table 中的过滤器更改后更新。我尝试在 VBA 中执行此操作,但到目前为止我得到的宏仅使用硬编码过滤条件进行过滤。
excelformulas/python/vba中的解决方案都受到欢迎和高度赞赏!
如果这个问题不符合标准,我提前道歉,因为我是新来的:)提前谢谢你!
@JvdV: This is the outcome of me trying to implement your formula, This过滤后
修改后的答案
所以在你解释之后我研究了一个公式,它会给你当前行 B 值减去之前 A 值出现的 B 值的差值。
=IFERROR(B2-LOOKUP(2,1/($A:A1=A2),$B:B2),0)
根据您的样本数据,它看起来像这样:
然后当你应用过滤器时,它看起来像这样:
因此,使用此变通方法,当未应用过滤器时,您没有正确的值,但在这种情况下,我假设您对 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)
并向下拖动。当您应用过滤器时,单元格将更新。
注意,这需要很长时间才能更新大型数据集!
经过 3 天的紧张(尽管无效)Google-ing,我终于在堆栈溢出时遇到了这个 。
但是,由于我正在处理大量数据(>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:$D0000").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
以上是我尝试减少内存使用的宏代码...感谢任何反馈!
我有一个 table,其中 A 列包含递增的数值,B 列是一堆名称。我需要根据名称过滤 table,并使用当前行中 A 列中的值与上方单元格中的值之间的差异更新 C 列..
For example, I'd like to have something like this 哪个, when filtered according to the Name column, should update the difference like so
我曾尝试以几种不同的方式使用 SUBTOTAL 函数,但无济于事。理想情况下,它会在 table 中的过滤器更改后更新。我尝试在 VBA 中执行此操作,但到目前为止我得到的宏仅使用硬编码过滤条件进行过滤。
excelformulas/python/vba中的解决方案都受到欢迎和高度赞赏!
如果这个问题不符合标准,我提前道歉,因为我是新来的:)提前谢谢你!
@JvdV: This is the outcome of me trying to implement your formula, This过滤后
修改后的答案
所以在你解释之后我研究了一个公式,它会给你当前行 B 值减去之前 A 值出现的 B 值的差值。
=IFERROR(B2-LOOKUP(2,1/($A:A1=A2),$B:B2),0)
根据您的样本数据,它看起来像这样:
然后当你应用过滤器时,它看起来像这样:
因此,使用此变通方法,当未应用过滤器时,您没有正确的值,但在这种情况下,我假设您对 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)
并向下拖动。当您应用过滤器时,单元格将更新。
注意,这需要很长时间才能更新大型数据集!
经过 3 天的紧张(尽管无效)Google-ing,我终于在堆栈溢出时遇到了这个
但是,由于我正在处理大量数据(>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:$D0000").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
以上是我尝试减少内存使用的宏代码...感谢任何反馈!