2026-03-28

ご訪問をありがとうございます ✨✨✨

八百茄子 は ソフトウェアエンジニア1名による小さな工房です
週末に スキルアップ と 八百茄子 向けのコンテンツ作成に勤しんでおります





ご提供コンテンツ

tools にて
八百茄子 の作成したツールをご紹介しています

knowhow にて、
2x年の組込み系ソフトウェア開発エンジニアとして得た知識・ノウハウに
7年以上 管理職を務めてて得た知識・ノウハウ、
個人開発(ぺーぺー)で得た知識・ノウハウを記録・共有します

エンジニアは技術が命
技術を磨いて、実績を積み上げて、自身の市場価値を高めていきましょう!!


ご挨拶

得られた経験やアウトプットしたコンテンツで
みなさまの誰か一人にでも喜ばれる何かができたらいいな、と思います (・∀・)

子どもたちの未来が少しでもよりよいものとなりますように (*´ω`*)

よろしくお願い致します (´・ω・`)

タスク管理で大事なのは、「頑張ること」ではなく「見える状態にすること」


タスク管理がうまくいかないとき、原因は「やる気」や「根性」が足りないからではないです

本当の原因は たいてい次のどれかに集約されます

  • やることが曖昧
  • タスクが大きすぎる
  • 抜け漏れがある
  • いつ始めるかが決まっていない、始まる日が決まっていてもその日に始められない
  • 進捗やリスクが見えていない
  • 状況の記録がなく、フォローできないし、振り返れない

問題は 仕事が “管理できる形” になっていないこと になります

私がタスク管理で大事にしているのは、次の 7つ です。

  • WBS で タスクを 分割する
  • MECE(抜け漏れ・ダブりなし)でタスクを洗い出す
  • タスクは 1週間程度で終わる粒度まで分ける
  • 開始日・終了日を設定し、着手日に必ず着手する
  • 詳細不明なものは まず 「明確化タスク」、「明確化後分割タスク」を作成する
  • ガントチャートで視覚化し、進捗・リスク・課題を見える化する
  • 日々ログを残し、状況共有や振り返りに使えるようにする

この記事では この7つをひとつの流れ として整理します



1. まずは「WBS」で、大きな仕事を分割する

タスク管理で最初にやるべきことは 仕事をそのまま管理しようとしないこと になります

例えば、こんな言葉はよく使われます

  • 新機能対応
  • ツール開発
  • 画面改修
  • 資料作成
  • 改善対応

でも、これらは実際にはタスクではなく 仕事の塊 です

このままだと、

  • 何をやるのか曖昧
  • 見積もれない
  • 進捗が測れない
  • 遅れた理由が分からない

という状態になります

そこで必要になるのが WBS(Work Breakdown Structure) です

WBS とは、ひと言で言えば、

大きな仕事を、管理できる単位まで分けること

です

たとえば「Windowsツールを作る」なら、こんなふうに分けられます

  • 要件整理
  • 画面設計
  • 入力処理実装
  • 出力処理実装
  • エラー処理実装
  • テスト
  • 配布準備
  • マニュアル作成

これだけでも、かなり見通しが良くなります

タスク管理は、
 「仕事を前に進めるために、まず分けること」
から始まります



2. タスクの洗い出しは「MECE」で考える

WBSで分けるときに大事なのが 抜け漏れとダブりを減らすこと になります

ここで役立つのが MECE(Mutually Exclusive, Collectively Exhaustive) という 「漏れなく、ダブりなく」 という考え方です

難しそうに聞こえますが、実務ではとてもシンプルです

たとえば「ツールを完成させるために必要な作業」を考えるとき、
ただ思いつきで並べるのではなく、切り口を分けて整理します

例:

開発タスク

  • 仕様整理
  • UI作成
  • ロジック実装
  • 保存機能
  • エラーハンドリング

品質確認タスク

  • 単体テスト
  • 動作確認
  • 異常系確認
  • 配布前確認

運用・展開タスク

  • README作成
  • 使い方説明
  • 配布ファイル作成
  • 告知文作成

こうして分類しておくと、

  • 実装は終わったけどテストしていない
  • 機能はあるけど説明資料がない
  • 配布できる状態ではない

といった、ありがちな漏れを防ぎやすくなります

タスク管理で怖いのは 「見えていない仕事」、「担当者が割り当たっていない仕事」 ですMECE はその見えていない仕事をあぶり出すための考え方です


分割してタスク管理項目に入れることは面倒な作業かもわかりませんが、
とても重要ですので、必ず MECE でタスク分割をしましょう



3. タスクは「1週間程度で終わる大きさ」にする

WBS で分けても、まだタスクが大きすぎることがあります

例えば

  • CSV出力機能を作る
  • 比較機能を実装する
  • ライセンス機能を入れる

これでも まだ数日〜数週間 かかるかもしれません

ここで私が大事にしているのが、1週間程度で終わる粒度まで分けること です

なぜ1週間程度が良いのかというと、理由は3つあります



① 進捗が見えやすい

1カ月タスクだと、「今どこまで進んでいるか」が曖昧になります
でも1週間タスクなら、進んでいるか遅れているかがかなり明確になります



② 遅れに早く気づける

タスクが大きいと、問題の発見が遅れます
1週間単位なら、「この切り方は無理だった」「想定より重い」に早く気づけます



③ 再計画しやすい

現実の仕事は 予定どおりに進まないのが普通です
だからこそ、細かく分かれている方が、後から組み替えやすいです



ポイントは 「終わった/終わっていない」が明確に言えるか です
タスク管理では 曖昧な完了条件のタスクが一番危ない です

終わっている/終わっていないが明確にわかることでどこまで進捗しているかも見やすくなります
タスクを終わらせることは達成感を生むことができて、次々のタスクを進めやすくなります



4. 「終了日」だけでなく、「開始日」と「着手日」に必ず「着手すること」を大事にする

タスク管理では、締切(終了日)ばかりが注目されがちです

もちろん終了日は大事ですが、実際に仕事が進むかどうかを左右するのは 「いつ終わるか」より「いつ始めるか」 です

だから私は、各タスクに

  • 開始日
  • 終了日

を入れることを大事にしています

そして特に重要なのが 「着手日にちゃんと着手すること」です



なぜ着手日が重要なのか

タスクが遅れる原因の多くは、見積もりのミスよりも、

  • 優先順位が曖昧
  • 他の作業に流された
  • 不明点を放置した
  • 「あとでやろう」で後回しになった

といった、着手遅れです

例えば 3日で終わるタスクでも、

  • 本来:4/1開始 → 4/3完了
  • 実際:4/4開始 → 4/6完了

となれば、見積もり自体は正しくても、全体は遅れます

つまり、終了日だけを見ていても 遅れの本当の原因は見えない ことが多いです



着手日を守ると、計画が「実行可能」になる

開始日を設定し、その日に着手することを意識すると、タスクは「いつかやるもの」ではなく、

「その日に始める予定のもの」

になります

これだけで、計画の実行力がかなり変わります

また、着手日が明確だと、

  • 今日は何を始めるべきか
  • 今週どこが危ないか
  • 着手できていない理由は何か

も見えやすくなります

タスク管理は 締切管理ではなく、着手管理でもある と考えましょう



5. 詳細が不明なタスクは、そのまま実行しない

タスク管理で特に危険なのが

中身が曖昧なタスクを、そのまま実行タスクとして置いてしまうこと

です

例えば こんなタスクです

  • 調査して対応
  • 仕様確認
  • 改善する
  • 実装方針を決める

こうしたタスクは必要ですが、そのままだと

  • 何をもって終わりかが曖昧
  • その後の作業量が読めない
  • 下流工程の見積もりが嘘になる

という問題が起きます



まずは「明確化タスク」を作る

こういうときに私がやるのは まず 「明確にするためのタスク」、「明確になったあとに分割するタスク」 を作ること です

例えば

  • 仕様の不明点を洗い出す
  • 入出力条件を確認する
  • 実装パターンを調査する
  • 関係者に確認する

などです。

そしてそのあとに、

  • 実装タスクを細分化する
  • テストタスクを細分化する

という流れにします

つまり、

不明なものは、いきなり作業せずに、まずは “分かる状態にする仕事” に変える

ということです



「今わからないこと」を前提に計画する

計画を立てるときにありがちなのが、
まだ分かっていないのに、分かっている前提でスケジュールを引いてしまうことです

でも現実的なタスク管理は、むしろ逆で、

  • 今わかっていること
  • まだわかっていないこと

を分けて扱う方が強いです

不確実性を隠すのではなく、 不確実性そのものを管理対象にする ことが大事です



6. ガントチャートで「進捗・リスク・課題」を見える化する

タスクを分けて、日付を入れただけでは、まだ足りません

なぜなら、仕事は 個々のタスクの集まり ではなく、順番・依存関係・重なりを持った流れ だからです

そこで有効なのが ガントチャートによる視覚化 です



ガントチャートの価値は「見た目がきれい」なことではない

ガントチャートの本当の価値は スケジュールを図として並べることではなく、

「どこが危ないか」「どこが危なくなるか」を見える状態にすること

にあります

たとえばガントチャートにすると、次のようなことが見えます

  • このタスクが遅れると、次が全部ずれる
  • この週に作業が集中している
  • まだ不明点が残っているのに、後続タスクが詰まっている
  • 誰かの作業待ちになっている
  • リスクが顕在化しそうな箇所がある

つまり、ガントチャートは単なる予定表ではなく 進捗・リスク・課題を可視化するための道具 です



進捗管理の目的は「責めること」ではなく「先に気づくこと」

進捗管理というと、「遅れていないか監視するもの」という印象を持たれがちです
でも本来の目的はそうではなく、問題が大きくなる前に気づける状態を作ること にあります

進捗管理で見るべきなのは、単なる完了率ではなく、

  • 着手できているか
  • 想定より重くなっていないか
  • 不明点が放置されていないか
  • 後続に影響が出そうか

といった、将来の遅れにつながる兆候 です

見える化の目的は、「管理している感」を出すことではなく、早めに手を打てるようにすること です



7. 日々ログを残すと、タスク管理は「運用できる仕組み」になる

タスク管理を本当に機能させるために、私はもうひとつ大事だと思っていることがあります
それが 日々、状況やログを記録すること です

計画を立てるだけでは、現実の仕事には勝てません
実際の現場では、

  • 急な問い合わせが入る
  • ヘルプ依頼が来る
  • 予定外の調査が発生する
  • 別件対応で時間を取られる

といったことが普通に起きます

だからこそ その日の状況を、関係者が見れるところに、わかるように、残しておくこと がとても重要です



ログを残すメリット①:急なヘルプや引き継ぎに対応しやすい

日々の記録があると、急に誰かが入ってきても、

  • 今どこまで進んでいるか
  • 何をやっていたか
  • 何が詰まりポイントか
  • 何を確認済みか

が伝えやすくなります

つまり、ログは単なるメモではなく、「途中からでも状況を理解できる状態」を作るもの です
これは個人作業でも、チーム作業でもかなり効きます



ログを残すメリット②:後から振り返れる

もうひとつ大きいのが 後から振り返りに使えること です

例えば ログがあると、

  • どこで詰まったのか
  • 何に時間がかかったのか
  • 着手遅れの原因は何か
  • 見積もりが甘かったのか、前提がズレていたのか

が見えてきます

これがないと、振り返りはどうしても

  • 「なんとなく大変だった」
  • 「忙しかった」
  • 「思ったより時間がかかった」

で終わってしまいます

でもログがあると、感想ではなく、事実ベースで改善できる ようになります

将来に多様な仕事があったときに、過去の作業ではどうしていたか、これを知れることは大きな財産となります



ログを残すメリット③:自分の仕事を守れる

これは意外と大事ですが、ログは 「自分が何をやっていたか」を守る記録 にもなります

特に、割り込みが多い仕事や、見えにくい調整業務が多い仕事では、

  • なぜ遅れたのか
  • どんな対応が発生していたのか
  • どれだけ別件対応に時間を使ったのか

が、後から説明できることが重要です

ログは単なる管理のためではなく 実態を見えるようにするための記録 でもあります



タスク管理とは、「仕事を前に進められる状態を作ること」

ここまでの内容をまとめると、私が考えるタスク管理の本質は次の通りです



私が大事にしているタスク管理の考え方

1. WBSで大きな仕事を分ける

仕事の塊を、そのまま管理しない
管理できる単位まで分解する

2. MECEで洗い出す

抜け漏れ・ダブりを減らし、見えていない仕事をなくす

3. 1週間程度の粒度まで分ける

進捗確認・遅延検知・再計画がしやすくなる

4. 開始日と終了日を入れる

特に大事なのは、着手日に着手すること
「いつ終わるか」だけでなく、「いつ始めるか」を管理する

5. 不明なものは、まず明確化タスクにする

曖昧なものをそのまま実行しない
まずは「分かる状態にする仕事」に変える

6. ガントチャートで視覚化する

進捗・依存関係・リスク・課題を見える状態にする

7. 日々ログを残す

急なヘルプや引き継ぎに対応しやすくなり、後から振り返りや改善にも使える



つまりタスク管理とは、単なるToDoリストではなく、

仕事を前に進めるための「設計」と「運用」の仕組み

だと思っています



おわりに

仕事が詰まるとき、原因は「頑張りが足りない」ことではなく、
たいてい 仕事が見える形になっていないこと です

逆に言えば、

  • ちゃんと分けられている
  • 抜け漏れなく洗い出せている
  • 着手日が入っている
  • 不明点を不明なままにしていない
  • リスクや課題が見えている
  • 日々の記録が残っている

この状態が作れれば、仕事はかなり前に進みやすくなります

私は、タスク管理は「管理のための管理」ではなく、

実際に仕事を進めるための設計図であり、運用の土台

だと考えています

もしタスク管理がうまくいかないと感じているなら、
まず見直すべきは根性ではなく、仕事を “見える状態” にできているかどうか かもしれません


この記事がみなさまの仕事にお役に立てたら幸いです


2026-02-11

json形式のタスク情報から html形式のガントチャートを作成するプログラムを作ってみた

 python で json形式のタスク情報から html形式のガントチャートを作成するプログラムを作ってみました


特に説明はなしです 💦

実際に動かして試してみて楽しんでみてください ('ω')ノシ


ちゃんと動けば、gantt.html が出力されて、ブラウザに読み込ませると下図のようになります (*´ω`*)




ではでは・・・


まずは anaconda 環境に必要なライブラリのインストールする

pip install pandas

pip install plotly


sample.json という名前のタスク情報を記したファイルを作成する

{

  "title": "戦国時代(+450年)",


  "tasks": [

    {

      "id": "task1",

      "name": "織田信長",

      "start": "1984-06-23",

      "end": "2032-06-21",

      "owner": "織田信長",

      "progress": 70,

      "summary": "",

      "memo": "",

      "milestones": []

    },

    {

      "id": "task2",

      "name": "豊臣秀吉",

      "start": "1987-03-17",

      "end": "2048-09-18",

      "owner": "豊臣秀吉",

      "progress": 40,

      "summary": "",

      "memo": "",

      "milestones": [

        {"name": "天下統一", "date": "2040-01-01"}

      ]

    },

    {

      "id": "task3",

      "name": "徳川家康",

      "start": "2043-01-31",

      "end": "2066-06-01",

      "owner": "徳川家康",

      "progress": 90,

      "summary": "",

      "memo": "",

      "milestones": [

        {"name": "征夷大将軍就任", "date": "2053-01-01"},

        {"name": "大坂夏の陣", "date": "2065-01-01"}

      ]

    }

  ]

}


肝心かなめのプログラムはこちらです

 import json

import pandas as pd

import plotly.express as px

import plotly.graph_objects as go

from datetime import datetime


# -----------------------------

# JSON読み込み

# -----------------------------

with open("sample.json", encoding="utf-8") as f:

    root = json.load(f)


TITLE = root["title"]

data = root["tasks"]


rows = []

completed_rows = []

remaining_rows = []

milestones = []


# -----------------------------

# データ整形

# -----------------------------

for t in data:


    start = pd.to_datetime(t["start"]).normalize()

    end = pd.to_datetime(t["end"]).normalize()


    duration = end - start

    progress_end = (start + duration * (t["progress"] / 100)).normalize()


    # hover用情報

    rows.append({

        "Task": t["name"],

        "Start": start,

        "Finish": end,

        "Owner": t["owner"],

        "Summary": t["summary"],

        "Memo": t["memo"],

        "StartStr": start.strftime("%Y-%m-%d"),

        "FinishStr": end.strftime("%Y-%m-%d")

    })


    # 完了部分

    if progress_end > start:

        completed_rows.append({

            "Task": t["name"],

            "Start": start,

            "Finish": progress_end

        })


    # 未完了部分

    if progress_end < end:

        remaining_rows.append({

            "Task": t["name"],

            "Start": progress_end,

            "Finish": end,

            "Owner": t["owner"]

        })


    # マイルストーン

    for ms in t["milestones"]:

        ms_date = pd.to_datetime(ms["date"]).normalize()

        milestones.append({

            "Task": t["name"],

            "Date": ms_date,

            "Label": f'{ms["name"]}\n{ms_date.strftime("%Y-%m-%d")}'

        })


df = pd.DataFrame(rows)

completed_df = pd.DataFrame(completed_rows)

remaining_df = pd.DataFrame(remaining_rows)

ms_df = pd.DataFrame(milestones)


# -----------------------------

# ガント(未完了)

# -----------------------------

fig = px.timeline(

    remaining_df,

    x_start="Start",

    x_end="Finish",

    y="Task",

    color="Owner",

    hover_data=[]

)


fig.update_yaxes(autorange="reversed")


# ★バー枠線なし

fig.update_traces(marker_line_width=0)


# -----------------------------

# hover情報追加

# -----------------------------

for _, r in df.iterrows():

    fig.add_trace(go.Scatter(

        x=[r["Start"]],

        y=[r["Task"]],

        mode="markers",

        marker=dict(size=0),

        showlegend=False,

        hovertemplate=

            f"<b>{r['Task']}</b><br>"

            f"担当: {r['Owner']}<br>"

            f"開始: {r['StartStr']}<br>"

            f"終了: {r['FinishStr']}<br>"

            f"概要: {r['Summary']}<br>"

            f"メモ: {r['Memo']}<extra></extra>"

    ))


# -----------------------------

# 完了バー(グレー)

# -----------------------------

if not completed_df.empty:


    fig_completed = px.timeline(

        completed_df,

        x_start="Start",

        x_end="Finish",

        y="Task"

    )


    for trace in fig_completed.data:

        trace.marker.color = "lightgray"

        trace.marker.line.width = 0

        trace.showlegend = False

        fig.add_trace(trace)


# -----------------------------

# マイルストーン

# -----------------------------

for _, r in ms_df.iterrows():

    fig.add_trace(go.Scatter(

        x=[r["Date"]],

        y=[r["Task"]],

        mode="markers+text",

        marker=dict(size=12, color="red", symbol="diamond"),

        text=r["Label"],

        textposition="top center",

        showlegend=False

    ))


# -----------------------------

# 今日ライン

# -----------------------------

today = pd.to_datetime(datetime.now()).normalize()


fig.add_shape(

    type="line",

    x0=today,

    x1=today,

    y0=0,

    y1=1,

    xref="x",

    yref="paper",

    line=dict(color="black", width=2, dash="dash")

)


fig.add_annotation(

    x=today,

    y=1,

    xref="x",

    yref="paper",

    text="Today",

    showarrow=False,

    yshift=10

)


# -----------------------------

# 軸の日付表示形式

# -----------------------------

fig.update_xaxes(tickformat="%Y-%m-%d")


# -----------------------------

# タイトル

# -----------------------------

fig.update_layout(

    title=TITLE,

    title_x=0.5

)


# -----------------------------

# 出力

# -----------------------------

fig.write_html("gantt.html")

print("gantt.html を出力しました")


これで動かしてみてください ('ω')ノシ
 


 

 

 

 

2026-01-17

ii-wf-taskMng

操作ガイド

会社 あるいは 現場によっては、ショートカット・共有サーバを活用した回覧・ワークフローを行っていることがあろうかと思います

ii-wf-taskMng は ショートカット・共有サーバを活用した回覧・ワークフローのエクスプローラー操作の手間や手数を減らすことで、普段の作業のストレスを軽減し、業務効率アップに貢献するツールです(タスク管理・ランチャーとしても活用頂けます)

こちら( Vector 、 note )からダウンロードできます

ここでは ii-wf-taskMng の操作方法について記載します

まずは、基本操作について記載し、
その後、応用として、具体的なユースケースを記載します


基本操作

ディレクトリを登録する

Browse ボタンからディレクトリを選択し、追加ボタンを押下する





ファイル一覧からファイルを確認する

画面中段のドロップダウンリストAから 「全」 や 「2」 を選択し、
画面中段のドロップダウンリストBでファイルを確認する


※ファイル名の先頭の6桁の数字を期日を示す年月日と認識し、
 「2」であれば、期日が「残り2日まで」となっているものを表示します


ファイルに対して各種操作をする

画面中段のドロップダウンリストから各種操作を選択、実行ボタンで実行する




開く ファイルを開く
ファイルを 済 ディレクトリに移動させる
保留 ファイルを 保留 ディレクトリに移動させる
コピー ファイルを任意のディレクトリにコピーする *1
移動 ファイルを任意のディレクトリに移動する *1
回覧 任意のディレクトリにファイルのショートカットを作成する *1, *2
ファイルがショートカットの場合、ファイルをコピーする *1, *2
ショートカット カーボンコピーしてある文字列でショートカットファイルを作成する *1, *2
フルパス ファイルのフルパスをカーボンコピーする
ファイル名 ファイルのファイル名をカーボンコピーする
フォルダ名 ファイルのフォルダ名(フルパス)をカーボンコピーする
更新 ファイルの一覧を更新する
ログ 操作ログを記したファイルを開く
*1 任意のフォルダを指定する際、初期に表示されるディレクトリは
 "settings of directory" にて選択されているディレクトリとなります
*2 作成されるファイル名の先頭には "settings of directory" にて選択、
 設定されている文字列が付加されます
 例えば、 26  1  25  豊臣秀吉 である場合のファイル名は下記の通りです
  260125_豊臣秀吉_<実行時の日時情報>_url.lnk


ショートカットファイルを Drag&Drop で作成する

画面中段のエリアにファイルを Drag&Drop する



Drag&Drop した際に作られるショートカットファイルのファイル名の先頭には
"settings of directory" にて選択、設定されている文字列が付加されます

 例えば、 26  1  25  豊臣秀吉 である場合のファイル名は下記の通りです
  260125_豊臣秀吉_<Drag&Drop したファイルのファイル名>.lnk



ユースケース

回覧依頼

パターン①:実態ファイルを使って Drag&Drop でショートカットを作成・配置する




パターン②:選択したファイルでショートカットを作成・配置する



パターン③:選択したファイルをコピー(あるいは 移動)で配置する


回覧承認

確認・承認するファイルを 済 ディレクトリに移動させる



タスク管理

回覧ディレクトリではなくタスク用ディレクトリを用意することで、
タスク管理にも活用することができます ✨



ランチャー

よく使うアプリのショートカットを集めたディレクトリを用意することで、
ランチャーとしても活用することができます ✨



その他

TODO 管理や最近よく使うファイル、ブックマーク的な使い方もできると思います
みなさんの発想次第で使い方は自由です


フリーソフトになりますので、どうぞ ご自由に ご活用くださいませ 

こちら( Vector 、 note )からダウンロードできます





2026-01-04

Excel 差分抽出でよくある落とし穴と考え方

Excel 差分抽出でよくある落とし穴と考え方

Excel の差分抽出を Excel で行う 際、
 一見うまくいっているように見えるけど、実は正しく比較できていない
というケースは少なくないです

実務で頻発する落とし穴と、その対策を整理していきます ('ω')ノシ


実務でよくある落とし穴

① 行順が同じ前提で比較してしまう

IF関数やセル比較は、「同じ行=同じデータ」 という前提になります

しかし、実際には、

  • 並び順が変わる
  • 途中に行が追加・削除される

といったことが頻繁に起こります

この状態で単純比較を行うと、
実際には同一データであっても「すべて不一致」と判定されてしまいます ( ノД`)シクシク…

対策

  • 商品コードやIDなど、必ず一致する「キー列」を使う
  • 並び順に依存しない比較方法(XLOOKUP)を選択する


② 空白・0・NULLの違いを見落とす

Excel では、以下は見た目が似ていても意味が異なります

  • 空白セル
  • 0
  • ""(空文字)
  • 数式結果が空白

これを意識せず比較すると、

  • 実際には変更がないのに差分扱いされる
  • 逆に変更を見逃す

といった問題が発生します

対策

  • 比較前にデータの正規化を行う
  • IF関数で TRIMIFERROR を併用する


③ 書式や表示形式の違いに惑わされる

数値と文字列の違い、日付の表示形式の違いなども、差分判定の原因になります

例:

  • 2026/01/012026-01-01
  • 00123123

対策

  • 比較前に表示形式を統一する
  • 文字列/数値の型を意識して揃える


行ズレを防ぐための考え方

行ズレは「Excel 差分」の最大の敵

差分抽出で最も多い失敗原因は、行ズレを考慮していないこと です

そのため、次の考え方が重要です


キー列を必ず用意する

差分抽出を行う場合、以下のような 一意に特定できる列 を必ず用意する

  • 商品コード
  • 顧客ID
  • 管理番号

このキーを基準に、

  • before にあって after にない → 削除
  • after にあって before にない → 追加
  • 両方にあるが内容が違う → 更新

という形で分類する


並び順は「比較後」に整える

比較前に並び替えを頑張る必要はなし

  • 元データはそのまま
  • 差分抽出後の結果表で並び替える

この方が、作業ミスを防ぎやすくなります


少量と大量で手法を使い分ける

データ量推奨手法
数十〜数百行XLOOKUP / COUNTIF
数千行以上Power Query

無理に関数で対応し続けると、
ファイルが重くなり、保守も難しくなります


差分結果を「レポート」としてまとめる考え方

差分抽出の目的は、
「差を見つけること」ではなく「差分を他人に伝えること」 です ✨✨✨

そのため、結果のまとめ方が重要になります


差分結果は3分類に分ける

実務では、次の3つに分類すると分かりやすくなります

  • 新規追加
  • 削除
  • 更新

特に「更新」は、

  • どの項目が
  • どう変わったか

が分かる形にすると、レビューや承認がスムーズになります


差分専用シートを作る

元データを直接加工するのではなく、

  • before
  • after
  • 差分結果

別シートとして分離 するのがおすすめです

これにより、

  • 元データの保全
  • 差分ロジックの再確認
  • 後日の再チェック

が容易になります


色・フラグ・コメントを使い分ける

差分結果の表現方法も重要です

表現用途
目視確認
フラグ(追加/削除/更新)集計・フィルタ
コメント理由・補足説明

「人が見る用」と「集計する用」を意識して設計すると、
実務で非常に使いやすくなります


まとめ

Excel で差分抽出を行う際は、

  • 行順に依存しない設計
  • データの揺れ(空白・型)への配慮
  • 結果を伝えるためのレポート設計

この3点を意識することで、
「動くけど使えない差分」から
「実務で信頼できる差分」へとレベルアップできます

差分抽出の手法そのものだけでなく、
前後の考え方まで含めて設計することが重要 です

を意識して設計すると、
実務で非常に使いやすくなります


参考

Excel の差分抽出を行うツールを用意しておりますので、
是非お試しくださいませ ✨✨✨

https://yaonasu.blogspot.com/2025/11/ii-excel-diff.html
https://yaonasu.blogspot.com/2025/11/ii-exsh-diff.html

2026-01-03

【初心者向け】Excel で差分を抽出する7つの方法

 

【初心者向け】Excel で差分を抽出する7つの方法

〜目的別に選べる7つのパターン解説〜

Excel で作成したデータを更新したあと、

  • どこが変わったのか分からない
  • 前のデータとの差分を確認したい
  • 追加・削除・変更だけを知りたい

と感じたことはありませんか?

本記事では、Excel初心者の方でも理解しやすいように
Excel で差分を抽出する代表的な方法を「パターン別」に整理して解説します


Excel の差分抽出とは?

差分抽出とは、
2つのデータ(更新前・更新後)を比較して、違いを見つけることです

例えば、

  • 商品マスタの更新
  • 月次データの比較
  • システム出力結果の確認

など、実務では頻繁に行われます。

ただし、差分抽出には複数の方法があり、
目的に合わない方法を選ぶと、正しく比較できません


差分抽出の代表的なパターン一覧

まずは、Excelでよく使われる差分抽出の方法を一覧で見てみましょう

No方法特徴
1IF関数で比較最もシンプル
2条件付き書式色で差分を表示
3VLOOKUP / XLOOKUPキーで突合
4COUNTIF / MATCH存在有無の確認
5Power Query大量データ向け
6VBA自動化向け
7外部ツール技術者向け

初心者の方は、1〜4を理解できれば十分 です


方法別:メリット・デメリット比較

次に、それぞれの方法の違いを表で確認します

方法メリットデメリット向いている場面
IF関数簡単・分かりやすい行ズレに弱い同じ形式の表
条件付き書式見た目で確認できる一覧化しにくい目視確認
XLOOKUP行順が違ってもOK関数がやや難しいマスタ比較
COUNTIF追加・削除が分かる内容比較は不可件数チェック
Power Query大量データに強い学習が必要定期作業
VBA自由度が高い難易度が高い自動化
外部ツール高速・正確Excel外作業技術者向け

各パターンの具体的なやり方(初心者向け)

ここからは、よく使われる方法だけを具体的に紹介します


方法1:IF 関数でセルの差分を比較する

概要

同じ行・同じ列構成の2つの表を、セルごとに比較する最も簡単な方法です

やり方
  1. 比較結果用の列を作成

  2. 以下の式を入力

=IF(A2=B2,"一致","不一致")
  1. 下までコピー

向いているケース
  • 行順が完全に同じ
  • 少量データ

方法2:条件付き書式で差分を色表示する

概要

差分を「抽出」するのではなく、色で分かりやすく表示する方法です

やり方
  1. 比較したい範囲を選択

  2. 条件付き書式 → 数式を使用

  3. 数式例(比較先の範囲の一番左で一番上のセル番号が A1 の場合の例)

=A1<>Sheet2!A1
  1. 塗りつぶし色を設定

向いているケース

  • 確認作業だけしたい
  • 印刷前のチェック


方法3:XLOOKUP でマスタ差分を確認する

概要

商品コードなどの「キー」を使って、更新前後の差分を確認する方法です

やり方(例)
=XLOOKUP(A2, before!A:A, before!C:C, "なし")
  • 「なし」=新規追加
  • after にない場合=削除

向いているケース

  • 行順が違う
  • マスタデータ比較


方法4:COUNTIF で追加・削除を確認する

概要

「存在するかどうか」だけを確認する方法です

やり方
=IF(COUNTIF(before!A:A,A2)=0,"新規","既存")
向いているケース

  • 件数チェック
  • 追加・削除だけ確認したい場合


どの方法を選べばよいか?(初心者向け指針)

目的おすすめ方法
とにかく簡単にIF関数
見た目で確認条件付き書式
マスタ差分XLOOKUP
追加・削除確認COUNTIF

迷ったら、XLOOKUP が最も実務向き です


まとめ

Excel の差分抽出には、目的に応じてさまざまな方法があります

初心者の方はまず、

  • 行順が同じ → IF関数
  • 行順が違う → XLOOKUP
  • 確認だけ → 条件付き書式

この3つを押さえるだけで、多くの差分チェックに対応できます

「難しい方法を使うこと」よりも、目的に合った方法を選ぶことが、
正確な差分抽出への近道です


参考

Excel の差分抽出を行うツールを用意しておりますので、
是非お試しくださいませ ✨✨✨

https://yaonasu.blogspot.com/2025/11/ii-excel-diff.html
https://yaonasu.blogspot.com/2025/11/ii-exsh-diff.html


2025-12-29

openpyxl で 保存が重い、出来上がったファイルが大きすぎると感じたとき

実際の失敗談からの展開になります

openpyxl で作ったエクセルファイルがやけに大きい


あれれ、何かおかしいぞ?
前々から ii-win-merge は少し重たくて、ii-diff は軽い!!

そんな印象を持っていたんですが
100 を超えるファイルを比較したときに、顕著にその差が見て取れて

ついに「おかしい!」と確信する事態となりました!!


重たい!という症状は

PC 全体の動きがもっさりしだすし
タスクマネージャを見ると メモリはフルに・・・

HDD も 14GB くらいの余裕があったのに
数百MB まで落ちている

そして、最終的にエラーで結果の出力ができない!ときた・・・



絶対、どこかでメモリリークのような開放漏れがあるんだろうと思いました

そこからは いろいろと トライ&エラー です orz
1回のトライ(ここを変えたらどうなる?ってお試し)に 3~5H かかりました

なんせ
100 を超えるファイルを比較して、処理が終わるころにエラーするもんだから


いちいち時間がかかる
そして、その間、PC が重くなるから、何もできなくなります

難航しました・・・


原因がわかったのは
ファイル数を 50個くらいに抑えて出力した結果を ii-diff の結果と比較しているときでした


差分表の最後の行から Ctrl+下 でジャンプするファイルの最終行の位置が違う!!


そこに気づき着目しました!

ii-diff は 1,048,576行 (← 最新のエクセルで扱える最大行数)
ii-win-merge は 65,535行





行数が少ない ii-win-merge の方がファイルが大きくなるのはなぜ?と思う人もいるかもしれないですが・・・



ii-diff は値の入っている有効行が 差分表の最後の行(116行目)なのでエクセルの最終行に飛び
ii-win-merge は エクセルの最終行に飛ばないので、
差分表の後にも値の入っている行があって、その値の入っている最後の有効行に飛んだのだろう

そう解釈をしました (;^ω^)

よく見ると



実際
上図のようにグレー塗のセルが 65,535行まで続いていました


絶対これやん!!


そこを修正したら、さっくり軽くなり、約 7分 で結果出力できるようになりました ('ω')ノシ



シート当たりのデータ量が無駄に多かったんだもん
そら重いわな・・・


結論

openpyxl は ワークブックの save() で時間がかかります
保持していたデータを xml にして、エクセルのファイル構成を作って
zip に圧縮するらしいです

データ量に比例して時間が増えますので、
小さなデータを扱っているつもりなのに、とても時間がかかるときは

私のように
意図せず広い範囲のセルを使っていないか、ご確認くださいませ 🙇‍♂️🙇‍♂️🙇‍♂️







ご訪問をありがとうございます ✨✨✨

八百茄子 は ソフトウェアエンジニア1名による小さな工房です 週末に スキルアップ と 八百茄子 向けのコンテンツ作成に勤しんでおります ご提供コンテンツ tools  にて 八百茄子 の作成したツールをご紹介しています knowhow  にて、 2x年の組込み系ソフトウェア開発...