这看起来非常简单,但我似乎无法理解它。所以我有两列。 A有名字,B有值。我想做的就是复制这个列表(进入D和E列),只排除B列中的0个值。(我在下面列举了一个我正在寻找的例子)
我在excel上并不是那么出色,所以这有点挑战。我正在尝试使用公式,因为我需要它在B列中的值更改时自动更新。 任何帮助将不胜感激。
答案 0 :(得分:2)
您可以使用数据透视表。将目标拖动到行,将值拖到值字段中。然后右键单击数据透视表中的任意目标,然后选择过滤器>值过滤器,并过滤值总计不为零。
当更多数据添加到工作表时,只需刷新数据透视表,这可以通过VBA自动执行。
答案 1 :(得分:1)
我相信我有一个应该有效的配方版本。将第一个非零行拉到D2:E2(手动或使用简单的索引公式),然后在D3和E3中使用以下内容:
D3=IFERROR(INDEX(OFFSET($A$1,MATCH(D2&E2,$A$1:$A$99&$B$1:$B$99,0),0,99),MATCH(TRUE,(OFFSET($B$1,MATCH(D2&E2,$A$1:$A$99&$B$1:$B$99,0),0,99)<>0),0)),"")
E3=IFERROR(INDEX(OFFSET($B$1,MATCH(D2&E2,$A$1:$A$99&$B$1:$B$99,0),0,99),MATCH(TRUE,(OFFSET($B$1,MATCH(D2&E2,$A$1:$A$99&$B$1:$B$99,0),0,99)<>0),0)),"")
然后自动填充到列表底部。
请注意,这些是数组公式,因此必须使用Ctrl + Shift + Enter输入它们。此外,如果您的列表超过99,则将公式中的所有99个更新为至少与列表长度一样大的数字。
这种方法的工作方式是使用OFFSET
公式开始搜索前面列出的结果正下方的非零值。
答案 2 :(得分:0)
你可以简单地使用if公式来检查这样的值......
'Column D formula:
=IF(E1="","",A1)
'Column E Formula:
=IF(B1=0,"",B1)
虽然我怀疑这是你正在寻找的,因为如果B列中的值为0,它只会在D和E列留下空白单元格。
我建议使用一个可以更加动态的宏。
Sub Check_Values()
Application.ScreenUpdating = False
Range("D:E").Select
Selection.ClearContents
Dim name As Integer, val As Integer
Dim name1 As Integer, val1 As Integer
Dim Emptyrw As Long, Emptyrw1 As Long, Emptyrw2 As Long
Dim i As Integer
name = 1
val = 1
name1 = 1
val1 = 1
Emptyrw = WorksheetFunction.CountA(Range("B:B")) + 1
Emptyrw1 = WorksheetFunction.CountA(Range("D:D")) + 1
Emptyrw2 = WorksheetFunction.CountA(Range("E:E")) + 1
i = 1
Do While val < Emptyrw
If Cells(val, 2) <> 0 Then
Range(Cells(name, 1), Cells(val, 2)).Select
Selection.Copy
Range(Cells(Emptyrw1, 4), Cells(Emptyrw2, 5)).Select
Selection.PasteSpecial
Application.CutCopyMode = False
End If
name = name + 1
val = val + 1
name1 = name1 + 1
val1 = val1 + 1
Emptyrw1 = Emptyrw1 + 1
Emptyrw2 = Emptyrw2 + 1
Loop
Do While i < Emptyrw1
If Cells(i, 4) = "" Then
Range(Cells(i, 4), Cells(i, 5)).Select
Selection.Delete Shift:=xlUp
End If
i = i + 1
Loop
End Sub
您可以将此代码复制到VBA中并为其指定一个命令按钮,并且应该适合您。
祝你好运!
答案 3 :(得分:0)