2016-07-26 109 views
0

这看起来非常简单,但我似乎无法摆脱困境。所以我有两列。 A有名字,B有值。所有我想要做的就是复制这个列表(成列d和E)刚刚在B列不包括0值(我把我所期待下面的例子)创建一个不包含0值的两列列表

enter image description here

我不是擅长excel,所以这是一个挑战。我试图让它与公式一起工作,因为我需要它在列B中的值更改时自动更新。 任何帮助将不胜感激。

+0

岂不的[高级筛选](https://support.office.com/en-us/article/Video-Advanced-filter-details-BBD0CB0A-8F90-43DF-BF77-6AD3774DC420 )适合这个吗? – Jeeped

+0

您可以过滤原始范围,然后仅将其用于复制可见单元格 https://support.office.com/zh-cn/article/Copy-and-paste-visible-cells-only-6F655372-4EA0- 4221-BF68-272422419B59 – dgorti

+0

我试过@Jeeped,但数据不会自动更新,你需要手动刷新过滤器。 –

回答

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公式开始搜索刚刚在前面列出的结果下面的非零值。

+0

非常感谢你!这正是我正在寻找的:D –

2

您可以使用数据透视表。将目标拖到行中,将值更改为值字段。然后,右键点击数据透视表中的任何目标,然后选择过滤器>值过滤器,然后过滤总值不为零。

enter image description here

当更多的数据被添加到片材,只是刷新透视表,其可以与VBA被自动化。

0

你可以简单地使用,如果公式来检查这样的价值...

'Column D formula: 
=IF(E1="","",A1) 

'Column E Formula: 
=IF(B1=0,"",B1) 

虽然我怀疑这是你在找什么,因为它会见好就收在列d和e如果空白单元格B列中的值为0.

我会推荐使用一个可以更加动态化的宏。

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,并分配一个命令按钮,并应为你工作。

祝你好运!

0

我的努力...

使用按Ctrl + Shift回车进入D2 + Enter键:

=INDEX(A:A,SMALL(IF($B$2:$B$20<>0,ROW($A$2:$A$20),999),ROWS(A$2:A2)),1)&"" 

然后填写纵向和横向。

使“999”足够大,始终超出值列表。

缺点:追加“”以防止零显示使数字表现为文本。

enter image description here

相关问题