残業を減らす!Officeテクニック
ExcelのCopilotが提示したボックス型のカレンダーの関数が凄い! 処理を分析してみた
2024年12月16日 06:55
年末も近づき、翌年のカレンダーを準備する時期ですよね。スケジュールはスマートフォンで管理することが多いと思いますが、メモ書き用などには紙のカレンダーが欲しくなります。市販品を買うほどでなければ、Excelで作成しようと考える人もいるはずです。
昨年は万年カレンダーを作成するテクニックを紹介しましたが、今年は、Copilotに依頼して楽に作成してみたいと思います。
といっても、実際の作業はプロンプトを入力して、Copilotの回答に従って操作するだけなのですが、提示された数式が良くできていたので、処理の内容を見ていきましょう。
Copilotの回答にLET関数が含まれていた
ここではボックス型の万年カレンダーを作成したいので、以下のようなプロンプトを入力しました。環境やタイミングによっては、DATE関数やIF関数を組み合わせた回答が出力されるので、その場合はプロンプトに『LET関数を使って』とひと言、添えてみてください。
ボックス型の万年カレンダーを作成してください。月曜始まりにします
Copilotから回答された数式は以下の通り。後ほどCopilotに詳しく分析してもらうとして、Copilotの回答に従ってカレンダーの枠を作ります。
=LET(
year, $A$2,
month, $B$2,
firstDay, DATE(year, month, 1),
startDay, firstDay - WEEKDAY(firstDay, 2) + 1 + (ROW(A1) - 1) * 7 + COLUMN(A1) - 1,
IF(MONTH(startDay) = month, DAY(startDay), "")
)
LET関数とは?
LET関数は、Excel 2024/2021、Microsoft 365のExcelで利用できる関数です。利用したことのある人は少ないと思いますが、数式中に“変数”的な役割を与えて処理できるのが特徴です。構文は以下の通りです。
LET関数の数式は[名前][式][計算]の3つの引数で成り立ちます。[式]に[名前]を付けて、その[名前]を使って、[計算]に処理したい計算式を指定すると考えてください。なお、[名前]には、A1やB1などのセル番地はNG、先頭に数字も使えません。Excelの関数名との重複は問題ありませんが、[名前]同士の重複はできません。
これらをふまえて、Copilotが提示した数式を見てみましょう。数式はすでにインデントも設定されているので読みやすいと思います。
「year」「month」「firstDay」「startDay」の4つがLET関数の引数[名前]として定義されています。
・year:年を指定したセルA2
・month:月を指定したセルB2
・firstDay:DATE関数を使って「year」と「month」、「1」で月初日を求めている
・startDay:月初日(firstDay)から、WEEKDAY関数で求めた曜日の数値を引いて、カレンダー内の各行の最初の日付を求めている
6行目の数式が、LET関数の引数[計算]となります。「当月なら月初日、そうでなければ空白を表示する」というIF関数の数式です。
IF(MONTH(startDay) = month, DAY(startDay), "")
数式をコピーして完成
「startDay」で各週の始まりの日付を求めているのが気が利いていますね。数式をコピーすることを考慮して、ROW関数とCOLUMN関数でオフセットしているのが難易度高めですが、深く考えなくても数式をコピーすればカレンダーは完成します。
なお、「45658」のようなシリアル値が表示された場合は、セルの表示形式を設定してください。[Ctrl]+[1]キーで[セルの書式設定]ダイアログボックスを呼び出して、[ユーザー定義]で「d」と指定すれば、日付のみ表示されるようになります。
Copilotに数式を分析してもらうと?
もちろん、生成された数式をCopilotに分析してもらうことも可能です。追加で質問することで理解も深まります。例えば、セルA1に「年」、セルB1に「月」とした時の数式を出力し直してもらってもいいでしょう。