2016-07-26 3 views
0

これは非常に簡単だと思われますが、私はその周りに頭を浮かべているようです。だから私は2つの列を持っています。 Aには名前があり、Bには値があります。私がやりたいすべてがちょうど列Bに0の値を除いた(列DとEに)このリストを複製である0の値を除いた2列のリストを作成する

enter image description here

私がいないことだ(私は以下を探しています何の例を置きます)それは優れていますので、これはちょっとした挑戦でした。私は列Bの値が変更されたときに自動的に更新するのに必要な数式を使用するようにしています。 ご協力いただければ幸いです。

+0

[高度なフィルタ](https://support.office.com/en-us/article/Video-Advanced-filter-details-BBD0CB0A-8F90-43DF-BF77-6AD3774DC420ないだろう)これにふさわしい? – Jeeped

+0

元の範囲をフィルタリングし、可視セルだけをコピーする場合に使用します https://support.office.com/en-us/article/Copy-and-paste-visible-cells-only-6F655372-4EA0- 4221-BF68-272422419B59 – dgorti

+0

これを試しましたが、データが自動的に更新されないため、手動でフィルタを更新する必要があります。 –

答えて

1

私は動作するはずの数式バージョンがあると思います。 D2の上に第1非ゼロの行を引っ張る:次いで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

ピボットテーブルを使用できます。 Goalsを行にドラッグし、Valuesフィールドに値を入力します。次に、ピボットテーブルのいずれかの目標を右クリックし、[フィルタ]> [値フィルタ]を選択し、値の合計がゼロでないようにフィルタします。

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にコピーし、コマンドボタンを割り当てるだけで、問題なく動作するはずです。

Good Luck!

0

私の努力は...

を入力します+ Shiftキー+ Ctrlキーを使用してD2に入力します。

=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

関連する問題