• ベストアンサー

Excel ゼロ以外の数字を抜き出す方法

すごく単純かもしれませんが、 A列に 4,0,5,6,0,8,6,0(各縦方向にですね) というように、ゼロ以上の数値とゼロが混在しているとします。 そのゼロの行が必要ないので、 B列に 4,5,6,8,6 というようにゼロのない数値だけを並べて表示したいのです。 どのようにすればよいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • bunjii
  • ベストアンサー率43% (3589/8249)
回答No.7

次の数式を提言します。 B1=IF(COUNTIF(A:A,">0")>=ROW(),INDEX(A:A,LARGE(INDEX((A$1:A$1000>0)*ROW(A$1:A$1000),0),COUNTIF(A:A,">0")+1-ROW())),"") または B1=IFERROR(INDEX(A:A,SUMPRODUCT(LARGE((A$1:A$1000>0)*ROW(A$1:A$1000),SUMPRODUCT((A$1:A$1000>0)*1)+1-ROW()))),"") B1セルを下へオートフィルコピーします。 数式の解説が必要でしたら補足で要請してください。

その他の回答 (7)

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.8

無料のグーグルスプレッドシートを使い,B1に単純に =filter(A:A,A:A>0) と記入すると,勝手に所定の数字が並びます。 エクセルには残念ですが,こういうカンタンな関数はありません。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.6

すみません。 やはり、関数では、分かりませんでしたので、VBAで、 Option Explicit Sub Test() Dim c, i As Long c = 0 For i = 1 To Range("A1").End(xlDown).Row If Cells(i, 1).Value > 0 Then c = c + 1 Cells(c, 2).Value = Cells(i, 1).Value End If Next i End Sub

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

質問者はエクセルの関数しかなじみがないのだろうが、関数でやることが、やさしいと思うのは間違い。非常な技巧を要する課題も多い。 この、「条件を付けて抜き出す」課題は、それに該当するのだ。今までもこのタイプの質問は相当あったが、下記のように「作業列を使う方法」でない方法でやる方法の式は、初心者や中級者には、むつかしすぎる式になる。 (興味があれば、Googleで「imogasi方式」で照会すれば、私以外の回答の中に、むつかしく長い式の回答が出ているものが多い。本質問にもそういう回答が、出るかもしれない。) 私には、VBAでやる方が考えやすい。 ーー それで関数を使いかつ作業列を使う方法で、やってみる。これで中級クラス向けの回答かなと思う。 ーー 例データ 式の結果(C,D,E列)も、下記には載せている A1:B10 A列  B列  C列 D列 E列 項目 数値 作業列 抜出後項目 抜出後数値 a1  12  1    a1 12 a2  0  a3 23 a3  23  2  a6 21 a4  0   a7 16 a5  0  a9 42 a6  21  3 a7  16  4 a8  0 a9  42  5 関数式 C2の式は =IF(B2<>0, MAX($C$1:C1)+1,"") 下方向に式を複写。 B列が0でない行に 上から連番を振っている。 E2の式は =INDEX($A$1:$A$10,MATCH(ROW()-1,$C$1:$C$10,0),1) F2お式は =INDEX($A$1:$B$10,MATCH(ROW()-1,$C$1:$C$10,0),2) それぞれ5行分(C列のMAX値)式を複写。 結果は上記の通り。 10行目まで式を複写しても、#N/Aが出ない式もできるが、 E2の式は、=IF(ROW()-1<=MAX(C1:C10),INDEX($A$1:$A$10,MATCH(ROW()-1,$C$1:$C$10,0),1),"") とでもすればよい

  • msMike
  • ベストアンサー率20% (364/1804)
回答No.4

[No.2補足]へのコメント、 》 B列に関数でやりたいのです 関数が苦手と推察して、関数なしの方法をご案内したまで。 「B列に」がメインなら、A列をB列にコピーして実行すれば好いのです。 どうしても難解な関数に固執するなら・・・ B1: =IFERROR(INDEX(A$1:A$100,SMALL(IF(A$1:A$100,ROW(A$1:A$100),""),ROW(A1))),"") 【お断り】上式は配列数式として入力すること

回答No.3

直接的にはマクロになるのではないでしょうか。 作業列をCに作りBに表示するというのでしたら Bに=IF(ROW()>=MAX($C:$C),"",INDEX(A:A,SMALL($C:$C,ROW(A2)))) Cに=IF(A1<>0,ROW(),"") という感じでできなくもないようですが。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1269557477?__ysp=RXhjZWwgMOS7peWkliDmipzjgY3lh7rjgZc%3D ご参考に。試して見るとnullが出ましたが一応出来ていました。 vbaでしたら Sub 抽出転記() Dim data(), tbl Dim i As Long, j As Long With Sheets("sheet1") tbl = .Range("a1:a" & .Range("a65536").End(xlUp).Row).Value For i = 1 To UBound(tbl, 1) If Val(StrConv(tbl(i, 1), vbNarrow)) <> 0 Then j = j + 1 ReDim Preserve data(1 To UBound(tbl, 1), 1 To 2) data(j, 1) = tbl(i, 1) End If Next i End With Sheets("sheet1").Range("b1").Resize(j, 2) = data End Sub ですとか Sub try()  Dim i As Long  With Sheets("sheet1")   endlow = Cells(Rows.Count, 1).End(xlUp).Row  For i = 1 To .Cells(Rows.Count, 1).End(xlUp).Row   If .Cells(i, 1) <> 0 Then     .Cells(i, 1).Resize(, 1).Copy _    Sheets("sheet1").Cells(i, 2).End(xlUp).Offset(1)   End If  Next i End With End Sub などで可能です。 たどりつけなくなってしまったので参考URLの表示ができませんが、tryの方は上記参考URLの回答者の方のものです。 「Excel 0以外 抜き出す」 などで検索されると色々でてきます。 ご参考になれば幸いです。

  • msMike
  • ベストアンサー率20% (364/1804)
回答No.2

添付図左からの手順です。 1.[置換]コマンドで 0 を空白に置換 2.列Aを選択して、[ジャンプ]コマンドで空白セルを選択 3.[編集]→[削除]→[上方向にシフト] で「エイヤッ!」と右端図を得ます。

pluto1991
質問者

補足

ありがとうございます。 すみません、B列に関数でやりたいのです。

  • masnoske
  • ベストアンサー率35% (67/190)
回答No.1

表示するだけなら、フィルターで0以外を選択してはどうでしょうか。

pluto1991
質問者

補足

ありがとうございます。 すみません、B列に関数でやりたいのです。

関連するQ&A