大学時代の友人から電話がありました。
友人「あ、もしもし田中?ご無沙汰。元気?」
田中「おお、久しぶり。どうした?」
友人「あのさ、ちょっとExcel教えてくんね?」
田中「いいけど、何?」
彼は仕事で、毎月の日別データを下図のようなワークシートで管理しているらしいです。
A列に1ヶ月分の日付を入れて、B列に何かの数値を入力すると。で、33行目にSUM関数だとかAVERAGE関数だとかを入れて、いろいろと計算していると。なお、画面の都合で途中の行を非表示にしていますが、実際にはもちろん表示されています。
友人「月が変わったら、前月のシートをコピーするんだよ」
田中「ふむふむ」
友人「で、前のデータ消して、1日の日付を入れ直すんだけどさ」
田中「ふむふむ」
友人「これさ、シート名を変えたらカレンダーも自動的に変わるようになんない?」
つまり、こういうことでした。前月のシート(たとえば[2010-08])をコピーして今月のシート(たとえば[2010-09])を作ると、セルA2の日付が自動的にその月の1日(たとえば"2010/09/01")にならないかと。
そのくらい、手でやればいいんじゃね?どうせ月に1回の作業でしょ?何でもかんでも楽しようと思わない方がいいっしょ。だいたい、お前昔からそうじゃん。3年のとき一緒に行った与論島でさ、あのとき確かお前さ・・・
友人「なぁ、頼むよ。今度一杯おごるからさ」
田中「よ、喜んでぇ」
幸いなことに、シート名の「年-月」のうち「月」は2桁(01~09)にするルールだそうです。それなら、かなり式が短くなりますね。
まず、シート名を取得します。これは定番のCELL関数を使います。
=CELL("filename",A1)
ここからシート名を抜き出すのに、一般的には「]」の位置を調べて、そこから後ろがシート名…と判定するのですが、今回「年-月」は必ず7文字になるということですから、RIGHT関数で一発です。
これに、文字列の"-1"を結合させれば、その月の1日が作成できます。
=RIGHT(CELL("filename",A1),7)&"-1"
ただし、これでは「2010-09-1」という文字列を作っただけですから、この文字列をシリアル値に変換してやります。これには、DATEVALUE関数を使います。
=DATEVALUE(RIGHT(CELL("filename",A1),7)&"-1")
あとは、セルA3に「=A2+1」と入力してセルA32までコピーすれば完了です。
これで、シート名を変更すれば、セルA2の日付も自動的に変わります。
最後に、翌月の日が表示されないようにします。
これには、いろいろなやり方がありますけど、今回はIF関数でやりましょうか。翌月の日になるのは29日以降ですから、その日の「月」が、セルA2の「月」と等しくなかったら、何も表示しなければいいです。セル範囲A30の式を次のように変えて、セルA32までコピーします。
=IF(MONTH(A2)<>MONTH(A29+1),"",A29+1)
友人「おお、すげぇ!できた。サンキュな」
田中「常識でしょ」
友人「じゃ、今度マジで飲みに行こうぜ。時間できたら電話するから。じゃあ!(ツー)」
田中「あ、ちょっ・・・」
彼も忙しいですから、(今回のような質問も含めて)何か特別な用事がないと、最近は連絡もありません。前回電話をもらったのは半年以上前ですし、実際に会って飲んだのは数年前が最後です。一杯ごちそうになるのは、いつになることやら(笑)。