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

「ワークシート関数だけでやる」ということで、「VBAのお勉強」じゃないですが(^^;)

質問者さんの「ワークエリア」という言葉の意味がちょっとわからなかったのですが、

ワークエリア excel」で検索するとこちらのサイトが出てきました。

「一時的に用いられる記憶領域」という事ですね。
んじゃ、Sheet3を一時的に使ってみます。

さて。Sheet1からAの値を探して、Sheet2に値を出力すると言うことで。
ワークシート関数で何かを探すといったら、よく使うのはVLOOKUP関数ですね(^^)

VLOOKUP関数の書式は、「VLOOKUP関数」で検索すると、

こちらが見つかりました。

=vlookup(検索対象文字列,検索対象セル,抽出列,検索方法)

こんな感じですね。

んでも、これを普通に使ったんじゃ、複数の候補があった場合、最初の1つ目しか見つからないんじゃないかな?

VLOOKUPって、あんまり使ったことないので、ためしにやってみます。

Sheet1が

97-1.jpg

こんな状態だとします。

Sheet2のB1のセルで、VLOOKUPワークシート関数を使いたいのですが、

VLOOKUPで探すことが出来るのは、2つめのパラメータの「検索対象セル」の

左端の列だけなんですよね。。。ということは、このSheet1の形式ではB列の

値で検索したいので、使えません。

ということで、Sheet3に一時的に検索用にデータを入れてみます。

Sheet3のセルB1に

=Sheet1!B2

セルB2に

=Sheet1!A2

として、値をコピーし、その計算式を、8行目までドラッグします。

97-02.jpg

ん(^^)。これで、VLOOKUPを使えるような列の順番になりました。

とりあえず、A2~B8の範囲でA列で「A」の値を探してB列の値を返してみます。

Sheet2のB1のセルに、

=VLOOKUP(“A”,Sheet3!A2:B8,2,FALSE)

と入れてみます。

97-03.jpg

ん、とりあえずおっけい(^^)

1つめのパラメータが探したい値(”A”)、

2つめのパラメータが値を探すセルの範囲(Sheet3のA2からB8)

3つめのパラメータが見つかった行の値を返す列の番号(上で指定した範囲の中で、2列目の値を返す)

4つめのパラメータが、完全に一致するものを探す(FALSE)

という指定になっています。

ただ、、、B3の列で2つめのAの値をどうやって探すのか?

VLOOKUPワークシート関数には、「2つめに一致する行を探す」なんて機能はなさげですし。。。

探すセルの範囲を変える事はできますが、1つ前で見つかった次の行から探す?というのを、

どうやって指定すればいいか。。。

「1つめのA」、「2つめのA」、「3つめのA」という情報があれば、なんとかなるかな?

97-04.jpg

今あるのは、この情報ですから、ここでなんとか、

5行目のAが1つめのA、

6行目のAが2つめのA、

8行目のAが3つめのA

という事を導き出せば、VLOOKUPでなんとかなりそうです。

んじゃ、どうやって、5行目のAが1つめのAかを探すか、ですが。

頭の中で考えた場合、B列をB2から下に見ていって、

最初に見つかったAが1つめのA、

次に見つかったAが2つめのA、

その次に見つかったAが3つめのA

ということになります。

Aが見つかったら、値を一つ増やしてカウントしていく、、、これならなんとか計算式でできそう(^^)

分かりやすくするために、とりあえず、Sheet1でやってみます。

Sheet1のC2に

=IF(B2=”A”,1,0)

と入れて、B8までコピーします。

97-05.jpg

B列が「A」だったら1、そうでなければ0、という感じです(^^)

んで、D2に

=C2

D3には、

=C3+D2

と計算式を入れて、D3の計算式をD8までコピーすると、

97-06.jpg

こんな感じ(^^)。欲しい情報が得られました。

「Aが見つかったら1つ増やす」という列をD列に設けることで、

その行が上から何個目のAなのか、が分かるようになります。

後は、VLOOKUPワークシート関数を使って、

1つ目のA、

2つ目のA、

3つ目のA

って感じで探していけばいいですね(^^)

Sheet3でやってみます。とりあえず、今のSheet1のC列、D列と、さっき作ったSheet3の計算式は消しちゃいます。

Sheet3では、Aかどうかを判断する列とカウントする列を1つにまとめちゃいます。

Sheet3のA2に

=IF(Sheet1!B2=”A”,1,0)

A3に、

=IF(Sheet1!B3=”A”,Sheet3!A2+1,Sheet3!A2)

と入れて、A3をA8までコピーします。

B2に

=Sheet1!A2

として、B2をB8までコピーします。

97-07.jpg

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

A2の計算式は、

Sheet1のA2が「A」だったら1、そうでなければ0

という意味です。

A3の計算式は、

Sheet1のA3が「A」だったら、Sheet3のA2に1を足す、そうでなければ、Sheet3のA2の値そのまま。

という意味です。

A3の計算式をA8までコピーすることで、

Sheet1がAだったら1つ上のセルの値に1を足し、そうでなければ、1つ上のセルの値そのまま。

ということになります。

後は、Sheet2で、VLOOKUPワークシート関数を使うだけです。

Sheet2のB1のセルに、

=VLOOKUP(1,Sheet3!$A$2:$B$8,2,FALSE)

Sheet2のB2のセルに、

=VLOOKUP(2,Sheet3!$A$2:$B$8,2,FALSE)

Sheet2のB3のセルに、

=VLOOKUP(3,Sheet3!$A$2:$B$8,2,FALSE)

と入れると、、、

97-08.jpg

ん、よいようです(^^)

ただ、、、この計算式のままだと、1つめのパラメータ、

これは計算式をコピーしても1のままで変わらないので、いちいち手で直していかないといけないです。

めんどくさいですね(^^;)

ということで、Sheet3のB2からずっと右側に

97-09.jpg

こんな感じで、1からドラッグして値を入れておけば、Sheet2のB1の式を

=VLOOKUP(Sheet3!B1,Sheet3!$A$2:$B$8,2,FALSE)

とすることで、この式をC1以降にコピーしていけばよいですね(^^)

んでは、試しに、Sheet1のカバの値を「A」にしてみます。

97-10.jpg

すると、Sheet2は、、、
97-11.jpg

ん、いい感じ(^^)

ただ、D1までしか計算式を設定していないので、4つ目の値(ハシビロコウ)は出てないですね。

同じようにE1以降も計算式を設定すれば出るようになります。

E1~P1にも式をコピーしておきます。

97-12.jpg

(^^;) E1はきちんと出ましたけど、それ以降は・・・?

たぶんに、VLOOKUPワークシート関数で、5以降の値が見つからなかったということでしょう。

あまり美しくないので、#N/Aは出ないようにしたいですね。

VLOOKUP #N/A」で検索すると、こちらのページが見つかりました。ISERROR関数を使うようですね。

B1の計算式を以下のように直します。

 

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

 

んで、この式をC1からP1までコピーすると、

97-13.jpg

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

いちおう、これで完成ということで。

Sheet1で行数が増えた場合、参照するセルの範囲が変わりますので、計算式が全部変わってくることになりますが、

たぶん、検索対象の範囲を指定する際に、セル範囲の名前を指定することが出来たと思いますので(やったことないですが(^^;))

それを使えばいちいち計算式全部を直す必要はなくなると思います。

とりあえず、こちらにアップしておきます。vbastudy_0010.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