在庫管理をPythonで自動化する方法【コピペOK】Excel台帳から発注アラートまで実装

毎日、在庫チェックをしてるけど、どうしても欠品が防げない。Excelでは限界を感じるが何か方法はないかな?

こんな悩みを持っていませんか?

毎朝Excelを開いて、品番ごとに在庫数を確認して、減った分を記録して、発注点を下回っていないか目視でスクロールして……。そのうち「あ、これ見落としてた」が起きる。欠品が出た後で「先週チェックしたはずなのに」となる。

生産管理を7年担当していた中で、資材管理もしていた頃がありました。品番数が300を超えたあたりから「全部見たつもりが見れていない」という状態になっていました。

Pythonを使うと、このチェック作業が変わります。

Excelの在庫台帳をそのまま読み込んで、発注点を下回った品目だけを自動で抽出する。システムを作らなくても、今使っているExcelの延長でできます。

この記事では、製造業・小売の在庫台帳(Excel)を前提に、Pythonで在庫を自動チェック・発注アラートを出す手順を実装コード付きで解説します。

この記事を読むとできること

  • Excelの在庫台帳を自動で読み込む
  • 発注点を下回った品目を自動で抽出する
  • 「発注が必要な品目リスト」をExcelで保存する
  • (発展)発注が必要になったらメールで通知する

Pythonがまだ手元にない方は、まず環境構築からはじめてください。
WindowsPCでPythonを始める方法【現場社員向け】

在庫管理の手作業コスト

よくある在庫管理の実態

製造業・小売の現場では、こういう状況がよくあります。

  • 品番ごとにExcelの在庫台帳を手動で更新
  • 発注点(最低在庫数)を下回っているかを毎日目視で確認
  • 見落としが発生し、欠品が起きる
  • 担当者が休んだとき、在庫状況を他の人が把握できない

「発注を忘れていた」「気づいたら在庫がゼロだった」というミスは、手作業による確認漏れが原因のことがほとんどです。

品番が少ないうちはなんとかなりますが、50品番・100品番と増えていくと、目視チェックには限界があります。私も経験があるのでよくわかります。

Pythonで自動化すると何が変わるか

Pythonを使うと、この流れが変わります。

  • コードを実行するだけで、全品番の在庫を自動チェック
  • 発注点を下回った品目だけをリストアップして出力
  • 毎朝自動実行すれば、確認漏れがなくなる

「Excelで管理しているから大丈夫」という状態から「コードが確認して、必要なものだけ教えてくれる」状態になります。在庫チェックに使っていた時間が、別の仕事に使えるようになります。

準備:ライブラリと在庫台帳の形式確認

このコードが向いている人・向かない人

まず、この記事のコードが誰に向いているかを明確にしておきます。

向いている人:

  • Excelで在庫台帳を管理している
  • 手作業の発注点チェックを自動化したい
  • システムを作らず、今の運用を少し改善したい
  • PythonでExcelを扱う第一歩を踏みたい

向かない人:

  • Webブラウザで操作できる在庫管理システムを作りたい
  • DjangoやFlaskでUI付きのアプリを作りたい
  • 販売管理システムや基幹システムとデータ連携したい

「システムとして作りたい」という方には、この記事は向いていません。「今あるExcelを少しラクにしたい」という方に向けての内容です。

pandasとopenpyxlのインストール

このコードで使うライブラリは2つです。

pip install pandas openpyxl

コマンドプロンプトで上記を実行するだけです。Anacondaをお使いの方はpandasが入っていることが多いですが、openpyxlは別途インストールが必要な場合があります。

在庫台帳の前提条件

このコードは、以下の形式のExcel在庫台帳を前提にしています。
チェックしてください。

  • ファイル形式は .xlsx
  • 台帳に以下の列がある(列名が一致していること):「品番」「品名」「在庫数」「発注点」「発注先」
  • 1つのファイルに全品番が記載されている

列名が「在庫数量」「min在庫」など異なる場合は、コード内の列名部分を変更してください。

在庫台帳のサンプル形式:

品番品名在庫数発注点発注先
A-001ボルトM8150100山田商会
A-002ナットM880100山田商会
B-001フィルム巻芯3050東京資材

この例だと、A-002とB-001が発注点を下回っています。これを手動で探すのが今の作業、Pythonで自動抽出するのがこれからの作業です。

実装①:Excelの在庫台帳を読み込む

コード:台帳の全データを読み込む

読み込みチェックです。

import pandas as pd

# 在庫台帳のファイルパス
file_path = r"C:\在庫管理\zaiko_daichou.xlsx"

# Excelを読み込む
df = pd.read_excel(file_path)

print(f"{len(df)}件の品番を読み込みました")
print(df.head())

file_path を自分の台帳ファイルのパスに変更してください。
パスはエクスプローラーのアドレスバーからコピーして、先頭に r をつけると安全です。

よくあるエラーと対処法

エラー①:FileNotFoundError(ファイルが見つからない)

パスが間違っているか、ファイル名が日本語の場合に起きやすいです。パスをコピー後、\ が1本になっているか確認してください。

エラー②:列名が見つからないというエラー

Excel台帳を開いて1行目の列名を確認してください。コード内の「品番」「在庫数」などの文字列が、台帳の列名と完全に一致している必要があります。全角・半角スペースの混入にも注意してください。

実装②:在庫が発注点を下回った品目を自動抽出する

コード:発注が必要な品目をリストアップ

実際に計算させていきます。
結果はコマンドプロンプトに出てきます。

# 発注点を下回っている品目を抽出
order_needed = df[df["在庫数"] < df["発注点"]].copy()

# 不足数を計算して追加
order_needed["不足数"] = order_needed["発注点"] - order_needed["在庫数"]

print(f"\n発注が必要な品目:{len(order_needed)}件")
print(order_needed[["品番", "品名", "在庫数", "発注点", "不足数", "発注先"]])

df["在庫数"] < df["発注点"] の1行が、全品番を自動でチェックしている核心部分です。品番が何百あっても、この条件式は変わりません。

出力サンプル

発注が必要な品目:2件
   品番      品名  在庫数  発注点  不足数    発注先
1  A-002  ナットM8    80   100    20  山田商会
2  B-001  フィルム巻芯    30    50    20  東京資材

毎日手でスクロールして見ていたものが、これだけで終わります。

実装③:発注リストをExcelに保存する

集計結果はそのままでは次回実行時に消えてしまいます。ファイルに保存しておきましょう。

# ※ 実装①②のコードに続けて実行してください
import os
from datetime import datetime
today = datetime.today().strftime("%Y%m%d")
output_path = os.path.join(r"C:\在庫管理", f"発注リスト_{today}.xlsx")

order_needed.to_excel(output_path, index=False)
print(f"\n保存完了:{output_path}")

実行するたびに日付付きのファイル名で保存されるので、過去の発注履歴が残ります。「先週いつ発注したんだっけ」という確認にも使えます。

発展①:発注が必要になったらメールで通知する

注意:この部分はやや設定が必要です。 まずは実装①〜③だけで動かしてから取り組むことをおすすめします。メール通知なしでも、Excelへの保存だけで十分実用になります。

毎朝コードを手動で実行するのが面倒であれば、発注が必要な品目があったときだけメールを送るように設定できます。

ここではGmailを利用しています。
Googleアカウントをお持ちなら無料でできますが、アプリケーションパスワードなどの設定が必要です。詳しい説明はこちらで紹介しています
Pythonでメール自動送信する方法【コピペOK】

import smtplib
from email.mime.text import MIMEText

# 発注品目がある場合のみ通知
if len(order_needed) > 0:
    body = f"発注が必要な品目が{len(order_needed)}件あります。\n\n"
    body += order_needed[["品番", "品名", "不足数", "発注先"]].to_string(index=False)

    msg = MIMEText(body, "plain", "utf-8")
    msg["Subject"] = f"【在庫アラート】発注要確認({today})"
    msg["From"] = "your_email@gmail.com"
    msg["To"] = "manager@example.com"

    # GmailのSMTPで送信(アプリパスワードが必要)
    with smtplib.SMTP_SSL("smtp.gmail.com", 465) as smtp:
        smtp.login("your_email@gmail.com", "your_app_password")
        smtp.send_message(msg)

    print("メール送信完了")
else:
    print("発注が必要な品目はありませんでした")

発展②:毎日自動で実行する(Windowsタスクスケジューラ)

コードが動くようになったら、毎朝自動で実行するように設定すると在庫チェックが完全に自動化されます。

手順の流れ

  1. Pythonコードを .py ファイルとして保存する(例:zaiko_check.py
  2. Windowsの「タスクスケジューラ」を開く(スタートメニューで検索)
  3. 「基本タスクの作成」→ 実行時刻を毎朝8時などに設定
  4. 「プログラムの開始」で python.exe.py ファイルのパスを指定する

python.exe のパスは、コマンドプロンプトで where python と入力すると確認できます。

> where python
C:\Users\yamada\AppData\Local\Programs\Python\Python311\python.exe

設定後は、毎朝自動でコードが実行されて「発注リスト_日付.xlsx」が保存されます。発注が必要な品目があればメール通知も届きます。朝出社したら在庫確認が終わっている状態になります。

まとめ

この記事で紹介したのは以下の流れです。

  1. Excelの在庫台帳を pandas で読み込む
  2. 発注点を下回った品目を自動で抽出する
  3. 発注リストを日付付きExcelで保存する
  4. (発展)発注が必要なときだけメールで通知する
  5. (発展)毎日自動実行する

在庫管理のために「システムを作る」必要はありません。今使っているExcelの台帳をそのまま使って、コードを実行するだけです。

製造業でPythonが使える場面は在庫管理だけではありません。日報集計・品質データの分析・メール自動化など、現場の繰り返し作業の多くはPythonで置き換えられます。
製造業でPythonは何に使えるのか|現場7年間で実際に使った5つの使い道

日報の集計自動化と同じ構造(Excelを読んで→条件で絞って→保存する)をそのまま在庫管理にも使い回せます。
日報をPythonで自動集計する方法【コピペOK】

応用編

今回のコードで基本的な在庫チェックは自動化できます。ただ、実際の現場では次のような状況が出てきます。

  • 倉庫が複数あって、それぞれ別のExcelで管理している
  • 入出庫のたびに台帳を手で書き換えているが、ログが残らない
  • 月次で在庫の増減グラフを上司に報告しなければいけない

複数倉庫が必要になったとき、入出庫ログを記録したいとき、
そういった「次のステップ」に対応した複数倉庫統合・入出庫ログ記録・月次グラフ自動生成付きのコードセットはNoteで配布予定です。