我有一个表,其中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中的解决方案都受到欢迎,并表示赞赏!
如果这个问题不符合我在这里所说的新标准,我预先表示歉意:)提前谢谢!
答案 0 :(得分:0)
修订后的答案
因此,在您感到惊讶之后,我研究了一个公式,该公式将为您提供当前行B值的差值减去该值之前出现的A值的B值。
=IFERROR(B2-LOOKUP(2,1/($A$1:A1=A2),$B$1: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)
调用它,然后向下拖动。应用过滤器后,单元格将更新。
请注意,这需要很长时间才能在大型数据集上进行更新!
答案 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
上面是我的宏代码,试图减少内存使用...感谢任何反馈!