• ベストアンサー

EXCELで条件に合わない行を削除して詰めて新しいシートに表示したいのですが

A  B   C   D 1 任意 任意 合格 2 任意 任意 FALSE 3 任意 任意 合格 4 任意 任意 FALSE PC2台ありますのでEXCEL2003か2007が操作環境です. 上記のようなシートがあった場合に(Dにはif関数が入力されています)別のシートにFALSEの行のみ削除して1行目から詰めて表示させたいのですが,それってどうやったらいいのでしょうか?if関数使うとしても詰めるのはできそうにないし・・・VBAですか?どうしてもわかりませんでしたので教えていただきたいです.よろしくお願いいたします.

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

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.9

解答No1です。 FALSE以外の場合に別のシートに表示させるのでしたら、先に示したシート1でのE2セルへの入力の式を次のようにして下方にオートフィルドラッグすればよいでしょう。 =IF(A2="","",IF(D2<>"FALSE",MAX(E$1:E1)+1,"")) シート2の式は先に示した通りです。

maomao0115
質問者

お礼

できました!ありがとうございます. マクロよりもこれの方が何も操作しなくていいからいいですね. 皆さん色々教えてくださりありがとうございました.

その他の回答 (8)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.8

表示させたくない条件はFALSEのみなので,オートフィルタでは難しそうです. オートフィルタで D列のプルダウンから(オプション...)を選択 【FALSE】【と等しくない】 を抽出 すればできますよ。

maomao0115
質問者

補足

できました!ありがとうございます.この操作をマクロ記録すればいいような気がしました.

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.7

これまでの経過を見ていると、エクセルの基本操作を正しく理解できていないような気がします。 まず基本的なことですが、なぜ「FALSE」などと分かりにくい表示になっているのでしょうか? 通常なら、Falseの場合は空白("")を表示するようにしたほうが良いと思うのですが・・・ また例示のデータですが、1行目に項目名があるのでしょうか? 項目名が入っていれば、まず基本操作のオートフィルタで該当データを抽出して、それを別シートに、そのまま(データ範囲を大きめに選択して)コピー貼り付けするのが簡単です。 >表示させたくない条件はFALSEのみなので,オートフィルタでは難しそうです. オートフィルタの▼をクリックして表示される「オプション」を選択し「False」と「等しくない」条件で抽出します。 >VBAですか?どうしてもわかりませんでしたので教えていただきたいです. 上記の操作を「新しいマクロの記録」でコードを記録します。 2003の場合、「ツール」「マクロ」「新しいマクロの記録」でリスト範囲のセルにカーソルを移動し、項目名を含めたデータ範囲を大きめに選択し(今後のデータの追加に対応できるように)、「データ」「フィルタ」「オートフィルタ」で上記のオプション操作でFalse以外のデータを表示させます。 抽出されたデータを下の空白行を含めて大きめに選択して、「コピー」し、抽出データを表示したいセルに「貼り付け」ます。 最後に「データ」「フィルタ」でフィルタモードを解除すれば(必要なら抽出データシートに移動)、別シートに該当データを表示させることができます。 >最終的にFALSEだった場合には削除して詰めて表示させたいので,オートフィルドラッグが使えません.シンプルに「FALSEの場合表示しない」という関数でもできるのでしょうか? この意味がよくわからないのですが「合格」以外の値もあるということでしょうか? その場合は、私の回答の補助列を使うときの関数の場合なら、たとえば以下のように変更します。 =COUNTIF($E$1:E1,"<>False")*(E1<>"") いずれにしろ、例示のデータは、表のレイアウトを含めて実際のリストに対応したデータにしないと(できる限り実際のデータをコピー貼り付けする)、回答者が混乱するだけでなく数式でも的確な回答ができませんので注意してください。

maomao0115
質問者

お礼

何度もありがとうございます!なるほど.FALSEは空白にしたほうがいいのですね.マクロも使ってやってみます. >例示のデータは、表のレイアウトを含めて実際のリストに対応したデータにしないと(できる限り実際のデータをコピー貼り付けする)、回答者が混乱するだけでなく数式でも的確な回答ができませんので注意してください。 この点は非常に納得ができました.いろいろとご迷惑をおかけしました.ありがとうございました.

  • myRange
  • ベストアンサー率71% (339/472)
回答No.6

なぜオートフィルターを利用してできないのか分かりませんが。。。 次のようなことではないのですか? D列にIFがあり、 条件が真の結果が複数ある、例えば、X,Y,Z 条件が偽の結果は、False 上記で、False以外を別シートに転記する で、あれば、 (1)表を別シートにコピー、又は、シートごとコピーする (2)コピーしたシートのD列で、Falseのオートフィルターをかける (3)抽出されたデータのみ(見出しは除く)選択      > 右クリック          >行の削除             >オートフィルターの解除 これでいいような気もしますが。。。 以上です。  

maomao0115
質問者

お礼

ありがとうございます!このやり方でもできました. オートフィルターをあまりよくわかっていませんでした.

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.5

No4ですが、FALSEを表示するのではなく、「合格」を表示したかったのですね。 その場合の一発で表示する数式は以下のように変更する必要があります。 =INDEX(Sheet1!A:A,SMALL(INDEX((Sheet1!$D$1:$D$10=FALSE)*1000+ROW($A$1:$A$10),),ROW(A1)))&"" 補助列を使う場合は元シートのA列に =COUNTIF($E$1:E1,"合格") 表示したいシートの数式には少し意味のない部分が入っていたので、ついでに修正すると =IF(MAX(Sheet1!$A:$A)>=ROW(A1),VLOOKUP(ROW(A1),Sheet1!$A:$E,COLUMN(B:B),0),"")

maomao0115
質問者

お礼

ありがとうございます.やはりA列を変えるのですね.

  • MackyNo1
  • ベストアンサー率53% (1521/2850)
回答No.4

このような場合はオートフィルタを利用するのが基本操作だと思いますが、関数で表示したい場合、表示データ数が少なければ以下のような数式で一発で該当データを表示することができます(元シートがSheet1の場合)。 =INDEX(Sheet1!A:A,SMALL(INDEX((Sheet1!$D$1:$D$10<>FALSE)*1000+ROW($A$1:$A$10),),ROW(A1)))&"" 表示データ数が多い場合は、補助列を使う方法が無難です。 元シートのA列に1行列を挿入し、このA1セルに以下の式を入力して下方向に適当数(今後のデータの増加に対応できるように)オートフィルします(このA列は最終的に非表示にする)。 =COUNTIF($E$1:E1,FALSE) 表示したいシートには以下の式を入力し右方向に4つ、下方向に適当数オートフィルします。 =IF(MAX(Sheet1!$A:$A)>=ROW(A1),VLOOKUP(ROW(A1),Sheet1!$A:$E,COLUMN(Sheet1!B:E),0),"")

maomao0115
質問者

お礼

ありがとうございます.やってみましたが,FALSEの行だけが別シートにでました.

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

Googleででも。「imogasi方式」で照会すれば、私のこのコーナーに回答した、条件による抜き出し問題が多数出てくる。 ぜひそれを参考に。その際他の回答者が回答された、方式回答も出てくる。代表的なものは作業列を使わずSMALL関数などを使うやり方である。式が長いのと、初めての人には式の理解が難しかろう。 関数の組み合わせとしては最難関の1つだろう。 VBAでやれば簡単だが、この同類の質問をする質問者はVBAの経験が無い人が多い。関数では式が複雑になって、抜き出し問題は不得手だと思うのでVBAでやればと思う。関数は即時反応の良い点もある。それだけに、行数が多いと動きが重くなるかも。 「imogasi方式」は作業列を1列使う。そして条件に合う行に、上の行から連番を関数で振る。その連番を元に、他シートなりに、他シートの行番号と関連させて、元データシートのデータを参照してデータを持ってくる。条件に合わないものは、持ってこない。従って結果として、「データを捨てた」ことになる。 元データの連番1  -->他シートの第1行目 元データの連番2  -->他シートの第21行目 ・・・ に持ってくる。元シートデータで、連番1、2・・などを探すにはMATCH関数を使う。

maomao0115
質問者

お礼

ありがとうございます.imogasi方式で調べてみます!

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.2

【オートフィルタ】でD列をフィルタかけて、別のシートにコピペする。

maomao0115
質問者

お礼

ありがとうございます.表示させたくない条件はFALSEのみなので,オートフィルタでは難しそうです.

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.1

D列にFALSEなどのデータがあるのでしょうか。なお、すべてのデータが2行目から下方にあるとします。そうでしたらE2セルに次の式を入力して下方にオートフィルドラッグします。 =IF(A2="","",IF(D2="合格",MAX(E$1:E1)+1,"")) 今のシートをシート1としてまとめのシートは次のようにします。 1行目はシート1の1行目と同じにします。 A2セルには次の式を入力して右横方向にオートフィルドラッグしたのちに下方向にもオートフィルドラッグします。 =IF(OR(A$1="",COUNTIF(Sheet1!$E:$E,ROW(A1))=0),"",INDEX(Sheet1!$A:$D,MATCH(ROW(A1),Sheet1!$E:$E,0),COLUMN(A1)))

maomao0115
質問者

補足

ありがとうございます!例でやってみたらできました!すごい^^ 実際はD列にのみFALSEがあり,FALSEでないデータは1つのセルにIF関数を複数使っていて複数あり,さらに行ごとにIF関数の内容は違い,最終的にFALSEだった場合には削除して詰めて表示させたいので,オートフィルドラッグが使えません.シンプルに「FALSEの場合表示しない」という関数でもできるのでしょうか?