正直な出発点
予算と実績は、たぶん完全には合わない
予算表と実績データを扱っていると、
最初からこう思ってました。
-
どうせ全部は合わない
-
部門も科目もズレる
-
最後は人が直す
なので今回も、
きれいに一致させることは目標にしない
という前提で始めました。
やりたかったのはただ一つ。
「合ってないところが、すぐ分かる状態」にする
Before:
何が合ってないのか、毎回探していた
これまでの作業はこんな感じ。
-
予算Excelを開く
-
実績データを開く
-
VLOOKUPがズレる
-
「どこが合ってない?」を目で探す
-
気づいたら30分経過
一番つらいのは、
合ってない“理由”がすぐ分からない
ことでした。
今回のテーマ
「自動で合わせる」より「ズレを可視化する」
今回の方針はこれ。
-
合うところは機械に任せる
-
合わないところは“印をつける”
-
判断は人がやる
DXっぽいことは、
正直ほとんどしてません。
全体構成(シンプル)
SharePoint
├ 予算表(Excel)
└ 実績データ(CSV / Excel)
↓
Power Automate
↓
Python(紐づけ・判定)
↓
比較用Excel(色付き)
Power Platformは
「置いたら回る」だけ。
工夫したのは、出力結果のほうです。
Pythonでやったこと(今回の肝)
① まずは普通につなげる
merged = budget_df.merge(
actual_df,
on=["部門", "科目"],
how="left",
indicator=True
)
ここで使ったのがindicator=True。
これで、
-
両方にある
-
予算だけある
-
実績だけある
が区別できるようになりました。
② 「合ってない理由」を列として出す
ここが一番やってよかったところ。
def judge_status(row):
if row["_merge"] == "both":
return "OK"
elif row["_merge"] == "left_only":
return "実績なし"
else:
return "予算なし"
merged["判定"] = merged.apply(judge_status, axis=1)
これでExcel上に、
-
OK
-
実績なし
-
予算なし
という列が一つ増えます。
👉 ここを見れば、どこでズレてるか即分かる
③ 差額だけじゃなく「未紐づけ」も数値化
merged["実績"] = merged["実績"].fillna(0)
merged["差額"] = merged["予算"] - merged["実績"]
-
実績が0なのか
-
そもそも無いのか
判定列と合わせて見ると、
意味が全然違って見えるようになりました。
④ Excel側で“見るだけで分かる”工夫
Pythonで出したExcelに、
ちょっとだけ仕込みました。
-
判定が「実績なし」 → 行を薄赤
-
判定が「予算なし」 → 行を薄黄
-
OK → 何もしない
細かい説明は不要で、
開いた瞬間に「ここ見て」って分かる
これだけで、
確認作業が一気に楽になります。
実際に回してみて
最初に出てきたExcelを見たとき、
「あ、探さなくていい」
と思いました。
-
合ってるところは流し見
-
色がついてるところだけ見る
-
理由も列に書いてある
見る順番が自然に決まるのが大きかったです。
合ってないところが見えると、会話が変わる
面白かったのはここ。
「ここ合ってないですね」で終わらずに、
-
この科目、予算の切り方おかしくない?
-
部門コード、そろそろ整理する?
-
来月はルール追加する?
という話になる。
前は
合わせる作業が目的だったので、
この話に行く前に疲れてました。
Power Platformを使った意味
Pythonだけで回してたら、
多分こうなってました。
-
実行が面倒
-
いつのデータか分からない
-
属人化する
Power Platformに載せたことで、
-
ファイル置くだけ
-
毎回同じ流れ
-
「とりあえず回す」が軽い
この軽さが、
「ズレを見る」作業と相性がよかったです。
うまくいかなかったところ
もちろん課題もあります。
-
科目名が完全に別物だと拾えない
-
粒度が違うとズレ続ける
-
例外ルールが増えすぎると辛い
ただ、
どこがダメかはすぐ分かる
ようになったので、
対応の判断は早くなりました。
まとめ:やってみた結論
-
予算と実績は、完全には合わない
-
でも 合ってない場所が分かるだけで十分
-
探す時間が減ると、考える余裕が出る
今回やったのは、
自動化というより、可視化
でもこの可視化、
始めてから3か月ほど過ぎたけど、毎月ちゃんと効いてます。