[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『空白を無視して』(アボカド)
複数シートの指定した部分を1枚のシートに抽出し、抽出もとのシートに空白があった場合空白はつめて表示させたいのですが、空白の処理が分かりません。 どなたかヒントを与えてください。
ヒントを、ということですのでご参考までに。 A1:A10にデータがあるもの(間に空白あり)を、 別のセル(例えばB1:B10)の1行目から空白を詰めて表示する例です。
B1に、=IF(COUNTA($A$1:$A$10)<ROW(),"",INDEX($A$1:$A$10,SMALL(IF($A$1:$A$10<>"",ROW($A$1:$A$10)),ROW()))) と入力して、Ctrl+Shift+Enter で確定、配列数式とします。
B1セルをB10までコピーしてください。 ご希望の処理に応用できるとよいのですが。 (sato)
解説はあまり得意ではありませんし、特に配列数式については自分でもまだ試行錯誤の段階ですが、 一応、分かる範囲で説明させていただきます。
最初のCOUNTAの部分は、そこをはずして入力してみると分かりますが、 =INDEX($A$1:$A$10,SMALL(IF($A$1:$A$10<>"",ROW($A$1:$A$10)),ROW()))・・・@ として、配列数式にすると、基本的にはCOUNAがない場合と同じ結果が得られます。 ただし、表示するデータがないセルにまでコピーするとエラーとなります。
これを避けるために、COUNTAで表示すべきデータの数を調べて、 それ以上の行になったら空白にするための、いわばエラー処理の部分です。
次に、ROW関数の説明のために、データがA1:A10にあるという仮定は前のままで、 空白をつめたデータをB2以下に表示することを考えて見ましょう。 COUNTAを除いた数式の本体部分はこうなります。
=INDEX($A$1:$A$10,SMALL(IF($A$1:$A$10<>"",ROW($D$1:$D$10)),ROW()-1))・・・A
上の@の式との違いに注意してください。
後半にある ROW($D$1:$D$10) の部分、なぜ $A$1:$A$10 ではないのでしょうか? これは説明のためにわざとA→Dに変えたんですけど、実はどちらでもいいんです。 このROWは、IF関数で$A$1:$A$10のデータが空白かどうか調べて、空白でない場合の行番号を取得しています。 したがって、$A$1:$A$10 だろうが、$D$1:$D$10だろうが、あるいはほかの列でもいい訳です。 まあ、ふつうはそんな別の列を指定する必要はないので $A$1:$A$10 とすればいいでしょう。
最後のROW()-1 はなぜ -1 をつけたのでしょうか。 これはSMALL関数の第二引数として、そこに表示するデータが何番目に小さいデータかを 指定するためのものです。 したがって、1行目に一番小さいデータを表示するならROW()でいいんですけど、 2行目以下に一番小さいデータを表示する場合は、ROW()-1のように その行の ROW()-n が1になるように調節する必要があります。 もし3行目から表示させたいなら、ROW()-2としなければなりません。
最後に、Aの数式に COUNTAのエラー処理を追加してみましょう。
=IF(COUNTA($A$1:$A$10)<ROW()-1,"",INDEX($A$1:$A$10,SMALL(IF($A$1:$A$10<>"",ROW($A$1:$A$10)),ROW()-1)))
COUNTAでのエラー処理は、空白でないデータの数を数えて、その数以上の行になったら 空白を表示するという意味ですから、表示する先頭の行が変わったら同様に =ROW()-1としないと最後に表示すべきデータが表示されなくなってしまいます。
その辺のところは、説明だけでは分かりにくいかもしれませんが、 実際にどうなるかやってみるとわかると思います。
以上、分かりにくい説明だったかもしれませんが、 自分でいろいろ変えて試してみるのが理解の早道になるかと思います。 (sato)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.