Powered By Blogger

暇がない。自力じゃ無理な人はこちらへ。

2015年5月6日水曜日

シートを跨いだ集計

状況:

タイトルが解りづらいかもしれないが、要はこういう事。
月ごとの集計をする、1月、2月、3月といった名前のシートがあり、そして年間の集計をする集計という名前のシートで、各月シートの集計から年間集計を求めるような場合だ。



こんな感じ。
すなわち、集計シートのB4:G4に各月の集計結果を表示したい場合だ。

単純に、'4月'!G4、'5月'!G4と打ち込んでいってもいいが、かなり面倒な作業だ。
この例では大したことはないが、毎日の月集計ともなると・・・気が遠くなる・・・
ここはなんとか数式のコピーでできないか?

一応、直に打ち込んだ'4月'!G4をこのままコピーするとどうなるかを確認しておこう。
'4月'!G4をC4~G4にコピーすると、
'4月'!H4~'4月'!L4
となってしまうな。これじゃダメ。

ここで問題は、
1.'4月'!の部分はシートを判別するためのところなので、ここはコピーした時に変わってほしい。
2.G4の部分は各月のシートの同じ列を参照するので、行は下にコピーした時に変わってほしいが、列は変わってはダメ。
この2点だ。

つまり、
 '4月'! → 列可変、行固定
 G4 → 列固定、行可変
になるような数式を考える。

考え方:

まず、式全体について、
各月のG4の値を参照してきたいので、
 INDIRECT(各月の集計セルを示す参照の文字列)
というふうに、INDIRECT関数を使うといいだろう。

そして、”各月の集計セルを指し示す参照の文字列”には
 CONCATENATE(各月シートを示す可変文字列,"!G",集計セルの行を示す可変文字列)
とCONCATENATE関数を使う。

そして、
各月シートを示す可変文字列
集計セルの行を示す可変文字列
この2つを数式で表すことを考える。

実際の式:

1.集計セルの行を示す可変文字列
   ROW('4月'!$G4)
 これじゃ4月固定にならないのか?
 まあそうだが、ここは各月のシートは同じ構造をしているという前提を付けると、これでいい。
 しかしここで問題が1つ。
 これだと月シートのG4より前に列が追加されたときに対応できない。そこで列も可変にするために、ROW,COLUMN,ADDRESSと3つの関数を組み合わせて、
  ADDRESS(ROW('4月'!$G4),COLUMN('4月'!$G4),1,1)
とする。
ちなみに、上の式単独の戻り値は$G$4という文字列
またこれに伴い、CONCATENATE関数の引数の1つ"!G"を"!"に変更する。

2.各月シートを示す可変文字列
 表のヘッダー行に注目する。

これはシート名と同じだ。(まあ、普通はそう設計するだろうが。)
 と言うわけで、これを利用する。
 すなわち、B3~G3を参照すると、それぞれ4月~9月という文字列が返ってくるということだ。
 従って簡単に、
  B$3

 これらを合わせて、
  INDIRECT(CONCATENATE(B$3,"!",
    ADDRESS(ROW('4月'!$G4),COLUMN('4月'!$G4),1,1)))

この式をB4に入力して、それを残りのセルにコピーすればOK。

結果:


各月シートに行や列を追加してテストしてみたが、これもOK。
これでだいぶ楽になったな。

以上、完了。

0 件のコメント:

コメントを投稿