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」の数をカウントする、って感じですね。

ん、いい感じ(^^)
前の式だと、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))
そうすると、こんな感じ。

ん、できてますね(^^) 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までオートフィル。
ん、#N/Aが出てますが、B1~D1まではおっけい(^^) では、#N/Aを出ないようにします。 MATCH関数も一致するものがなかったらエラーになるのかな? E2のセルに、
=MATCH(COLUMN()-1,Sheet3!$A$2:$A$8,0)
と入れてみると、

ん、エラーになるようです。ということで、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))
とすると、

ん、いいんでないかい?(^^)
ここまででアップしておきます→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にパンダを追加し、

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

ん、4が入ってます。んで、Sheet2を見てみると、
ん、よいですね(^^)
ふぅ。以上で完成かな?とりあえず、アップしておきます→vbastudy_0011_31.xls
他の回答者さんの回答を見てみると、自分とは違う考え方でやったり、知らない関数が出てきたりしますので、自分で考えるときとは別の部分の脳を使ってる感じがします(^^;)
