はもちくわ

コードについて自分なりの解釈を書いてます。

EXCEL】関数で万年業務カレンダー(日付固定)を作ってみる〜第5回〜セルに2つの結果を併記する方法

全5回に渡って、下のような万年業務カレンダーをつくっています。

記事の構成は下のようになっています。内容が重なるものはサラッと書きますので、詳しく知りたい方は、過去回をご確認ください。

万年業務カレンダーの作成全5回

今回で最後になります。
第2〜4回で、カレンダーに反映させる予定の指定方法を、日付によるものと、曜日によるものの2つを作りました。
こういった予定の決め方は、正社員で勤めていたときは、結構みたな〜という印象で、割と第2月曜と10日、第3月曜と20日なんかが、がかぶりやすかったな、、、みたいな思い出があります。みなさんはいかがでしょうか?!

はい!そういうわけで、今回は、違う指定方法の予定が重なってしまっても、両方表示できるカレンダーにしていきます。
また、予定が重なったら、予定変更をする可能性もあるので、重複がわかりやすいように、アラートもつけましょう!


完成はこのようにします。

ちょっと見にくいですが、画像のように月を4月から8月に変えると、8月のほうは、第3月曜と、20日(翌営業日)と設定した予定が重なりました。
この場合は、上のように、1つのセルに予定が並んで表示されるようにします。
また、予定設定欄の欄外に重複したことがわかるように、「※マーク」を出します。

こういった2つの結果を、Excel関数で表示しようと考えた時、真っ先に思いつくのは、結果ごとにセルを分ける手法じゃないでしょうか?
Excel表計算ソフトなので、そうなるのは当たり前といえば当たり前ですよね。
でも、今回のカレンダーのようなものや、契約書、納品書のように文面として書式を気にするものって、それだと不便なときがあります。
例えば、

こういったことです。
まあ、好みといえば好みですが、いかにもExcelの列が邪魔した書式形式はどうもな、、、、という方、いらっしゃるのではないでしょうか?私はそうです(笑)

なので、今回は1つのセルに併記できるようにしていきます。
まずは、それぞれの予定を抽出する式を考えます。
日付指定の予定は、

こうすれば、日付指定した予定は抽出できますね。関数の使い方などの詳細は「関数で万年カレンダー(曜日固定)をつくってみる(後編)」で書いてますので省きますが、意味は図の通りです。
さて、もうひとつの曜日指定ですが、指定場所が日付指定の下にズレているだけです。なので、関数式の形は同じで、参照先だけ下のように変えればいいです。

はい、これで各予定は抽出できました。
あとはこれを併記するだけですね。
さあ!いよいよ、タイトルにするぐらいですから、何か必殺技がっ!!

、、、と、そんなものは無くて、、、ただ文字列を結合するだけです。
文字列の結合は「&」を使えばよいですね。数値計算の「+」と一緒です。
ただ、この2つの式をそのまま「&」で結合しただけですと、下のようになってしまいます。

このように、予定が1つの時と、無い時はうまく表示されるのですが、予定が2つあるときは、予定同士がくっついてしまい不自然です。もし、予定内容がうまくくっついて別の意味を持ってしまうと、「予定が1つにしか見えない」なんてこともあるかもしれませんね(笑)

なので、もうひと手間加えます。

方法としてはいくつかあるのですが、手っ取り早いのは、表示予定の「後ろに必ず」文字列スペース(””でくくられたスペース) を入れておく方法です。これなら続く予定が無く、予定のあとにスペースが残ったとしても見えないので、予定が1つの時でも、不自然な空白になりません。さらに、併記する予定が3つ、4つ・・・と増えても、対応できますし、スペースを調整すれば好きな間隔にできます。簡単ですね!
逆に、前につけては駄目ですよ。条件によっては、不自然な空白が前に出てしまいますからね。
ブロックとか積み木をイメージして関数書くと良いと思います。

「いや〜、違うんだよな。スペースじゃなくて、スラッシュとか中点とかハイフンで、区切りをつけたいんだよなぁ!」って思われた方。今回はその方法にします(笑)
このサンプルは予定が2つですが、3つ、4つになる場合も含めて説明していきます。

先程のスペースと違う点は、区切り文字は「見える」ということです。なので、条件によって、表示したり、消したりをする必要があるということです。
気づかれた方もいらっしゃいますかね。。。そうです。予定と同じ事をすればいいんです。では、条件を考えていきます。
まずは、予定を2つ並べる時の条件になります。

見てのとおりです。区切り文字の前後に予定があるときは表示という条件でいいですね。
では、3つ以上の予定を並べるときはどうなるのでしょうか?考えてみます。

こうなります。予定によって組み合わせが発生しているように見えますが、先程と考え方は同じで、区切り文字の前後に予定があれば表示です。
区切り文字の前の予定が複数あるので、迷いそうですが、結局、前の予定全部のうち、どれか1つでも表示されていたら表示になるだけです。

このように、関数で表示をコントロールするには、判定する予定の数だけ表示する準備が必要になります。
予定が2つのときはこう、予定が3つのときはこう。。。のように予定をみて判断するわけではありません。表示されている予定表には、予定のあるもののみが並んでいるように見えても、実際は予定がないものも、見えないけど、全部表示されているというわけです。
VBAなどのコードで書けば予定の数だけループしながら表示される内容をつくればいいですが、関数はそれができないので、すべて準備しておくということです。

それでは、ここのカレンダーではどうすればいいのか下に関数式を書いてみます。

=IF(COUNTIF($O$3:$O$7,A3)=0,””,INDEX($L$3:$L$7,MATCH(A3,$O$3:$O$7,0),1)) & 
    IF(AND(COUNTIF($O$3:$O$7,A3)<>0,COUNTIF($O$9:$O$13,A3)<>0)," ・ ","") & 
    IF(COUNTIF($O$9:$O$13,A3)=0,””,INDEX($L$9:$L$13,MATCH(A3,$O$9:$O$13,0),1))

となります。これをカレンダーの予定欄にいれ、コピーしたら完成です!

いかんいかん。。。一応重複チェックも書いておきますか。
予定を作っている人からすれば、間違えないように人の目でみるって結構大変です。今回のように、ある程度自動化してしまうと「PCだから間違いないよね。」みたいな考えが頭の片隅に知らぬ間にいて、間違えちゃいます(笑)ちょっとしたアラート出しておくだけでも結構助かるもんです。ちゃちゃっと下のようにします。

ちょっと手抜きだな。。。。まあ、これはおまけということで。。。。

さあ、これで全5回が終わりました!
どれか一つでもなにかの参考になれば嬉しいです。
ここまで読んでいただきまして、本当にありがとうございました。

最後に、他の記事では、マクロを使ってないExcelファイルは、サンプルを準備して私のサイトにアップしたりしてましたが、全く需要がないみたい(笑)なので、今回はやめました。
自分のページはフリーサーバーなんで、需要なし、意味無しでは、容量がもったいないですしね(笑)
もし、ファイルでほしい方はここのコメントかTwitterからDMください。何かお届けする方法を考えます。まあ、ファイル転送サービスかなぁ。。。

それではまた。