営業成績表から支店名を抜き出すには

全部で47人の社員がいて、エリアごとに管理された営業拠点に所属しています。
さて、いったいいくつの営業拠点があるのか、一つずつ抜き出してみればいいのでしょうが、手で抜き出すのは、結構面倒です。
そんなときは、こうしては如何でしょうか?

送信者 OpenOffice
このファイルはSKYDRIVEからcalc164.odsをダウンロードしてください。

まずは、エリア名を抜き出してみます。-上の画像のI2セルの場合↓↓↓↓↓

=INDIRECT(ADDRESS(MATCH(I1;$A$1:$A$301;0)+COUNTIF($A$1:$A$301;I1);1))
の数式の処理結果として、I2セルに北部を返しています。
この数式では、I2セルのひとつ上のセル(ここではI1セル)の値が表のA列の何行目から始まっているかを求めて
=MATCH(I1;$A$1:$A$300;0)

I1セルの値がA1:A300 の範囲内に何個あるかを数えます。
=COUNTIF($A$1:$A$300;I1)

I2セルでの処理の場合、ひとつ上のI1セルには「エリア」が入っています。
「エリア」は、A列で1行目から始まっていて、一個だけあります。
ここで1+1=2より、2をADDRESS関数に当てはめます。エリア名が入力されているA列を処理対象にするので、ADDRESS関数に組みいれる列番号は1にします。
=ADDRESS(MATCH(I1;$A$1:$A$300;0)+COUNTIF($A$1:$A$300;I1);1)
これで$A$2がADDRESS関数の処理結果として返されるので、INDIRECT関数に当てはめて、A2セルの値「北部」を表示させます。
=INDIRECT(ADDRESS(MATCH(I1;$A$1:$A$300;0)+COUNTIF($A$1:$A$300;I1);1))



子供だましのような?
と思われてしまう方のために、I3セルを例にとってもう一度説明します。
=INDIRECT(ADDRESS(MATCH(I2;$A$1:$A$300;0)+COUNTIF($A$1:$A$300;I2);1))
I2セルの値が、A1:A300の範囲内で何行目から始まっているかをMATCH関数を使って調べ、ここでは2が返されます。
I2セルの値がA1:A300の範囲内で何個あるかを数えます。ここでは20が返されます。
2と20を足すと22になるので、この値をADDRESS関数の行番号として、列番号を1として、=ADDRESS(22;1) で$A$22 が返されます。これをINDIRECT関数に当てはめると、A22セルの値「中部」がI3セルに返されます。



同様にして、支店名を抜き出してみましょう。

送信者 OpenOffice
L2セルの場合↓↓↓↓↓
=INDIRECT(ADDRESS(MATCH(L1;$B$1:$B$301;0)+COUNTIF($B$1:$B$301;L1);2))

仕組みは、エリアを抜き出したときとまったく同じです。
L2セルのひとつ上のセル(ここではL1セル)の値が表のB列の何行目から始まっているかを求めて
=MATCH(L1;$B$1:$B$300;0)

L1セルの値がB1:B300 の範囲内に何個あるかを数えます。
=COUNTIF($B$1:$B$300;L1)


L2セルでの処理の場合、ひとつ上のI1セルには「支店名」が入っています。
支店名はB1:B300セルの中で1行目にあって、一個だけです。
ここで1+1=2より、2をADDRESS関数に当てはめます。支店名が入力されているB列を処理対象にするので、ADDRESS関数に組みいれる列番号は2にします。
=ADDRESS(MATCH(L1;$B$1:$B$300;0)+COUNTIF($B$1:$B$300;L1);2)
これで$B$2 が返されるので、これをINDIRECT関数に当てはめて
=INDIRECT(ADDRESS(MATCH(L1;$B$1:$B$300;0)+COUNTIF($B$1:$B$300;L1);2))
でL2セルに「北部第一支店」が返されます。

以下そのままコピー&ペーストです。




上の処理の結果で返されたエリアの中に、いくつの支店があるか数えたい というときは
「 OpenOfficeで北部エリアに何個の支店があるかを調べる 」をごらんください。