http://www.simple-sys.com/blog/2008/03/22/97/

前の記事の。

http://q.hatena.ne.jp/1206174892

他の回答者さんの回答を見て、知らない関数が出てきました。

まず、COUNTIF関数。名前からして便利そうですね(^^)

countif excel」で検索すると、こちらのページが見つかりました。

=COUNTIF(範囲,検索条件)

が使い方ですね。検索条件に、ただの値だけでなく、いろいろな比較式が使えて便利そうです(^^)。

4番目の回答者さんの式を参考に、COUNTIFを使って、そのAが何個目のAかを出してみます。 Sheet3のA2の計算式を以下のように直して、A8までコピーします。

=IF(Sheet1!B2=”A”,COUNTIF(Sheet1!B$2:B2,”A”),”")

もし、Sheet1のB列が「A」だったら、その行までに出現する「A」の数をカウントする、って感じですね。

112-01.jpg

ん、いい感じ(^^)

前の式だと、Aではない列にも値を入れておかなきゃいけなかったですが、こっちのほうがより美しい感じですね。

次は、COLUMN関数。

column excel」で検索してみると、 こちらのページが見つかりました。

=COLUMN(範囲)

で、範囲を省略すると、その関数を設定したセルの列の番号が求められる、ということのようです。

さっき、Sheet2のVLOOKUP関数で、1つめのパラメータを入力するのが面倒だから、ということで、Sheet3のB1~P1まで数字を入れました(この作業をオートフィルというんですね。これも勉強になりました(^^) ) この作業もあんまり美しくないですが、COLUMN関数でうまいことできそうですね。 Sheet3の1行目はもう使いませんので、消しちゃいます。

んで、Sheet2のB1の計算式を以下のように直し、P1までオートフィルします。

 
 =IF(ISERROR(VLOOKUP(COLUMN()-1,Sheet3!$A$2:$B$8,2,FALSE)),"",VLOOKUP(COLUMN()-1,Sheet3!$A$2:$B$8,2,FALSE))
 
 

そうすると、こんな感じ。

112-02.jpg

ん、できてますね(^^) B1のセルでは、COLUMN関数は2の値を返します。

このセルでは、1つ目の「A」の値を返す必要があるので、COLUMN()-1を探す値として使う、ということですね。

これまた、余計なセルを使わなくて済むようになりました。美しいですね(^^)

とりあえず、ここまでの内容でアップしておきます→vbastudy_0011.xls

あと、INDEXとMATCH関数。まず、MATCH関数ですが、 「excel match」で検索すると、こちらのページが見つかりました。

=MATCH(検索値,範囲 [,照合の型])

が使い方です。

範囲内で値を検索し、見つかった値が何番目に位置するかを数値で返す。

ということは、○こ目のAを探す時に使えそうですね。 同じく、今のページのすぐ下に、INDEX関数ものってます。

=INDEX(範囲,行位置,列位置 [,領域番号])

が使い方で、

範囲の中から、行位置と列位置を指定して値を取り出す

ということですから、これは動物の名前を抜き出すのに使えそうですね。 Sheet2のB1の式を以下のように直します。

=INDEX(Sheet3!$B$2:$B$8,MATCH(COLUMN()-1,Sheet3!$A$2:$A$8,0),1)

MATCH関数で、○こ目の「A」を、数値で探します。その見つかった値を使って、 INDEX関数で、抜き出してくる、という感じですね。

ということは、今、INDEX関数で、Sheet3のB列の範囲から抜き出してますが、このSheet3のB列って、VLOOKUP関数で使うためにコピーしたものですから、直接Sheet1を見るようにすれば、Sheet3にコピーする必要もなくなりますね。 Sheet3のB列を消して、Sheet2のB1の式を以下のようにします。

=INDEX(Sheet1!$A$2:$A$8,MATCH(COLUMN()-1,Sheet3!$A$2:$A$8,0),1)

んで、B1の式をP1までオートフィル。

   112-03.jpg

ん、#N/Aが出てますが、B1~D1まではおっけい(^^) では、#N/Aを出ないようにします。 MATCH関数も一致するものがなかったらエラーになるのかな? E2のセルに、

=MATCH(COLUMN()-1,Sheet3!$A$2:$A$8,0)

と入れてみると、

112-04.jpg

ん、エラーになるようです。ということで、B1のセルの式を


 
 =IF(ISERROR(MATCH(COLUMN()-1,Sheet3!$A$2:$A$8,0)),"",INDEX(Sheet1!$A$2:$A$8,MATCH(COLUMN()-1,Sheet3!$A$2:$A$8,0),1)) 
 
 

とすると、

112-05.jpg

ん、いいんでないかい?(^^)

ここまででアップしておきます→vbastudy_0011_2.xls

あと気づいたのは、探すセルの範囲の指定方法です。

私の場合、あらかじめセルの範囲をA2~A8などと固定していますが、5番目の回答者さんは、 縦に行数が増えても問題ないような書かれ方をしていますね。

セルの範囲をA2:A8のように行数を指定してしまうと、行が増えたり減ったりしたき、面倒ですね(^^;)。 これを、A:Aのように記述すれば、Sheet1の行数が増えても、セルの範囲をいちいち直す必要はなくなりそうです。

Sheet2のB1の式を


 
 =IF(ISERROR(MATCH(COLUMN()-1,Sheet3!$A:$A,0)),"",INDEX(Sheet1!$A:$A,MATCH(COLUMN()-1,Sheet3!$A:$A,0),1))
 
 

でC1~P1までコピー。 Sheet1にパンダを追加し、

112-06.jpg

Sheet3のA9のセルにA8の計算式をオートフィルし、

112-07.jpg

ん、4が入ってます。んで、Sheet2を見てみると、


 

112-08.jpg 
 
 

ん、よいですね(^^)

ふぅ。以上で完成かな?とりあえず、アップしておきます→vbastudy_0011_31.xls

他の回答者さんの回答を見てみると、自分とは違う考え方でやったり、知らない関数が出てきたりしますので、自分で考えるときとは別の部分の脳を使ってる感じがします(^^;)

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2011 simple blog いろいろ勉強中 Suffusion theme by Sayontan Sinha