印刷・押印前提のExcel申請書ひな型へ一括記入するマクロを生成AIに作ってもらいました
会社員のみなさま、こんにちは。
出張やテレワークで社有PCを持ち出す際、日ごとに申請書が必要なujapaです。これを忘れてさらに顛末書を書かされ……ないように、一括作成できるしくみをつくりました。
- チームメンバーごとに、パソコン持ち出し申請が必要な日付とその日の勤務形態一覧を、在社スケジュール表からVBAコードを用いて完全に自動で抽出
- 抽出した日付と勤務形態を貼り付けて実行するだけで、VBAマクロが日付の数に応じた申請書を一括で生成
項目 | before | after |
---|---|---|
提出日 | 手動 | 自動 |
持ち出し日 | カレンダーから探す&手書き | 自動 |
持ち出し理由 | 手動 | 自動 |
持ち出し場所 | 手動 | 出張先は手動、在宅は自動 |
シートコピー&命名 | 手動 | 自動 |
1枚1分かかっていた時間が、10枚で1分くらいになりました!優しい気持ちで提出できるようになります!エクセルマクロなのでみんなに共有しやすいのもいいですね。 最終更新2011年?このひな型いつまで使い続けるの?!
在社スケジュール表から日付と勤務形態を抽出するVBA
いつも通り、やりたいことを生成AIにご相談。ざっくり方向性が2つありそうでした。
- transpose関数とfilter関数を組み合わせ。transpose関数が必要なのは、元の在社スケジュール表の日付が横に伸びていくタイプのため(PC画面が横長なので)
- シートモジュールにVBAコード
VBAを使ったことがないので今回は後者でトライ。
生成AIへのプロンプトはこちら
エクセルの入力シートからデータを抽出して新しいシートに書き込み、入力シート内容が更新されても新しいシートの値も自動で更新されてほしい。
#入力シート(シート名:2025年度)
Aさんは日付が1行目(B1、C1~HJ1)、ステータスが3行目(B3,C3、~HJ3)です。
Bさんは日付が1行目(B1、C1~HJ1)、ステータスが7行目(B7,C7、~HJ7)です。
Cさんは日付が1行目(B1、C1~HJ7)、ステータスが11行目(B11,C11、~HJ11)です。
列は増減の可能性があります。こちらは列でどんどん右に増えていきます。
ステータスは何種類か入力されますし、すでにされていますが、ステータス行のセルに「終日出張」「終日在宅」「出張&在宅」「在社&在宅」「在社&出張」の値が存在する場合のみ、その日付とその日付のステータスだけを抽出したい。
#新しいシート(シート名:PC持ち出し確認用)
新しいシートに、Aさんの抽出日付の列、Aさんのその日のステータスの列、空白列2列、Bさんの抽出日付の列、Bさんのその日のステータスの列、空白列2列、Cさんの抽出日付の列、Cさんのその日のステータスの列へ書き出したい。1列目に名前が記載済みですので、2行目以降に抽出データを書き込んでいくことになります。こちらはどんどん行が増える方向です。
困ったときでもAIが味方
出力されたVBAコードでは期待と違う挙動をした場合、プロンプトを修正しましょう。
エラーが出たら、そのまま生成AIに質問してしまいましょう。
処理ロジック
私が完全な素人のため何が行われているかわかっていませんが、以下の流れのようです。
- まず出力シートの古いデータを全てクリア
- 次に参照先シートの最終列まで横方向にループし、各日付と各個人の勤務形態を確認
- 抽出条件に合致する勤務形態が見つかった場合にのみ、各人の出力列の次に空いている行に日付と勤務形態を書き込み
処理ロジックの妥当性がわからないので、これまたそれをAIに新しいチャットでご教授いただくと、以下の回答でした。
今の方式がシンプルさ、確実性、そして実装の容易さのバランスにおいて、現状の要件には非常に「賢い」選択である。ただし今後データ量が飛躍的に増え(例えば、数十万行を超えるような場合)、処理速度が許容できなくなった場合は、配列を使った高速処理への移行を検討するのが最も現実的で効果的な次のステップです
特に速度で困らない行数なので問題なし。
抽出した日付と勤務形態を貼り付けて実行すると、申請書を一括で生成するVBAマクロ
こちらも生成AIにお願いして、VBAコードを書いてもらいました。呪文は以下。
エクセルでPC持ち出し申請書を自動入力したい。
#1枚目のシートが申請書フォーマットです(シート名:PC持ち出し申請書)。
#2枚目のシート(シート名:日付入力用)がユーザーが入力するシートです。A列(A3、A4・・・・)に持ち出し日付、B列(B3、B4・・・・)に勤務形態を入力します。
#出力してほしいシート
申請書フォーマットのF3に「本日の日付」、D12に「持ち出し日付」、D13に「勤務形態」を入力したもの。シート名は持ち出し日付とE6のセルの値を利用して「YYYYMMDD_E6」となるようにしてください(E6はメンバーの苗字)
また、申請書フォーマットのセル結合は解除し、関数を追記しました。これはマクロでD13(勤務形態)へ入力された内容に応じてE14(勤務場所)を表示させるためです。
具体的には、以下の条件でE14セルに値が返されます。出張先だけはあとで手動にて追記。
- D13の値が「終日在宅」または「在社&在宅」の場合、E14は「自宅」
- D13の値が「在社&出張」または「終日出張」の場合、E14は空白
- D13の値が「出張&在宅」の場合、E14は「と自宅」
=IF(OR(D13="在社&出張", D13="終日出張"), "", IF(OR(D13="終日在宅", D13="在社&在宅"), "自宅", IF(D13="出張&在宅", "と自宅", "")))
チームメンバーのリアクション
月曜のチーム定例MTにて、改善した在社スケジュール表と申請書マクロを直属の上司と先輩にそっと渡してみました。
上司(40代)
- これはめっちゃ使うと思う
- マクロの実行ボタンがわかりやすいといいね
- もっと限界まで省力化を突き詰めてよ。承認の押印を一括実行可能にするとか。もちろん上司だけが実施できる工夫が必要
- (ついでに)やってくれた在社スケジュール表の改良も地味に楽
先輩(50代)
- そもそも忘れないようにしたいね。どこまで申請済かわからなくなる
- 持ち出し場所の記入が漏れないようにしてほしい
概ね良好なリアクション。が、もっと作りこんで持ってきてほしいという期待も感じました。「承認の押印を一括実行」が一番の難敵そうですね。押印するとはどういう作業なのか(哲学)
わかりやすい大きさのボタンはすぐ設置しました。残りも改良中です。
まとめ:VBA×生成AIで、小さな面倒を面倒がらずに改善
出張やテレワークで社有PCを持ち出すたび、毎回の申請書作成。地味につらい状況を改善するため、在社スケジュール表から申請書を一括生成するVBAマクロを作ってみました。
具体的には、
- 日ごとの勤務形態から申請対象日をVBAで自動抽出し、
- 抽出された日数分の申請書をまとめて生成できる仕組みに
VBAの知識がなくても、生成AIの力を借りれば1日で実装。目の前のちょっと面倒なことを見過ごさずに手を打つハードルをさげてくれる力を実感しました。
しかし、本質的にはこの申請ルールを簡素化すべきとは思います。Teamsでもなんでも承認アプリを使えばいいのでは……?「お願いする人」と「許してあげる人」が設定されていて、その細かいニュアンスを保つ体裁のためにがんばるというのもあれですよね。
逆にそういう状況のとき、素人の自作が対症療法的に役立つ部分かもしれません。
最後までお読みいただきありがとうございました。
追記:2025年8月3日 上司フィードバックへの対応
上司と同僚のフィードバックを受け、以下の要望があったと理解。
修正を実施しました。
要望1 承認の押印一括実行機能と上司だけが承認実行できる制限
- 押印ではなく、セルへのサイン記入で対応
- サイン欄に申請者が勝手に記載できないよう、パスワード付でシートの保護を実施
- シート保護解除のマクロボタン設置。パスワードは上司だけが知るものに設定してもらう
- 「一括実行」については複数シートの同時選択(グループ化)で対応してもらう
要望2 持ち出し場所の記入漏れ防止
- 在社スケジュール表に出張先を記載する場所を設定し、抽出できるようマクロも変更
- 出張先含めて、手動ではなく自動で申請書作成できるように変更
要望3 どこまで申請済かの把握
- 自動作成される申請書シートたちは新しいブック(ファイル)で出力し、ファイル名に作成日時を含めるように変更することで「いつ申請したか」の記録で記憶をフォロー
- 元のマクロには出力した日付リストが残るため、次回作成時に重複削除。ただし、出張先の変更があった場合、どれが最新かだけは自身で記憶してもらう必要あり
その他変更
- 要望にはなかったが、機器管理番号、モデル番号とシリアルナンバーも別シートで管理するものをフォーマットに代入するしくみに変更。今後のリース終了・更改によるモデル変更に対応しやすくした