見出し画像

VSCode×MCPでExcel作業を自動化!VBAよりも簡単な方法

こんにちは!YaroTechです。

「毎月同じExcel作業で2時間も使ってる…」
「VBAを勉強したいけど、なんだか難しそう…」
「Pythonって聞いたことあるけど、プログラミングは苦手…」

そんな悩みを抱えていませんか?

今日は、VBAを覚えなくても、VSCodeとMCPを使ってExcel作業を自動化する方法をご紹介します。実際に月次売上レポートの作成時間を2時間→5分に短縮できた実例を交えながら、具体的な手順をお伝えしますね。


※本記事の音声解説(日本語、英語)および動画解説(日本語、英語)を下記につけてますので場所やデバイスに応じてご利用ください。

音声解説

※上記、音声解説の作り方については下記記事をご参考ください。

動画解説

1.日本語で解説

2.Video explanation(English)

※上記、動画解説の作り方については下記記事をご参考ください。




🖥️ 動作確認環境

まず最初に、私の実行環境をお伝えします(技術記事では環境の違いで動かないことがよくあるので):

  • PC: Microsoft Surface Laptop 7th(Snapdragon X Elite / ARM64)

  • OS: Windows 11 Pro 24H2(ARM64版)

  • VS Code: v1.91.0(ARM64ネイティブ)

  • Python: 3.12.3(Microsoft Store版)

  • Excel: Microsoft Office Home and Business 2021

  • Claude Desktop: v0.7.1(MCP有効)

必要なPythonパッケージ

pip install pandas openpyxl xlsxwriter matplotlib

※ARM版Windowsでも全て正常動作します。x64版Windowsでも同様に動作確認済みです。

※Pythonパッケージインストールの際に下記画像のようなWARNINGが出ていると不安になりますが、「Successfully installed」になっていれば問題なく動作します。

コマンドプロンプトでPythonパッケージインストール結果WARNINGあり

🎯 この記事で得られること

  • VBAを学ばずにExcel自動化を始める方法

  • 売上データの集計からグラフ作成まで自動化する手順

  • MCPを使った定期実行の仕組み

  • エラーが出た時の対処法

📊 実際の成果

Before: 月次売上レポート作成に毎月2時間以上

  • 複数のCSVファイルを手動で開く

  • コピー&ペーストで集計

  • グラフを手動で作成・更新

After: わずか5分で完了!

  • ボタン一つで全自動処理

  • グラフも自動生成

  • ミスがゼロに

削減時間: 月24時間 → 年間288時間の効率化!

[ここにBefore/Afterの比較画像を挿入]

🚀 実践内容

1. なぜVBAよりPython?3つの理由

まず、なぜVBAではなくPythonを選ぶのか、簡単に説明しますね。

理由1: 学習のハードルが低い

# Pythonの場合(直感的!)
import pandas as pd
df = pd.read_excel('売上データ.xlsx')
合計 = df['売上'].sum()

# VBAの場合(覚えることが多い…)
Dim wb As Workbook
Set wb = Workbooks.Open("売上データ.xlsx")
Dim sum As Double
sum = Application.WorksheetFunction.Sum(Range("B:B"))

理由2: エラーメッセージが分かりやすい
Pythonは日本語のエラー解説も豊富で、初心者でも解決しやすいんです。

理由3: AIとの相性が抜群
Claude Desktopに「売上データを集計して」と伝えるだけで、MCP filesystemでコードを書いてくれます!

2. 実際にやってみよう!売上データの自動集計

では、実際に月次売上レポートを自動化してみましょう。

VS Code開いた画面

下記Step2の実行ではVS Codeを使用しています。「.py」ファイルを右クリックして「VS Code(アイコン)開く」を押して、右上の「再生ボタン▷」で実行できます。

VS CodeでPYファイルを開いた画面

Step 1: サンプルデータの準備

まず、こんな売上データ(sales.csv)があるとします:

売上ID,商品ID,商品名,売上,日付
1,14,Product N,8477.97,2024-01-19 06:57:40
2,7,Product G,17281.77,2024-08-27 06:57:40
3,18,Product R,12480.30,2024-01-21 06:57:40
...

Step 2: Pythonで集計処理

import pandas as pd
import matplotlib.pyplot as plt
import openpyxl
from datetime import datetime
import warnings
import os
warnings.filterwarnings('ignore')

# スクリプトのディレクトリに移動
script_dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(script_dir)
print(f"作業ディレクトリ: {os.getcwd()}")

# 日本語フォントの設定(Windows用)
plt.rcParams['font.sans-serif'] = ['MS Gothic']
plt.rcParams['axes.unicode_minus'] = False

# 開始時刻を記録
start_time = datetime.now()

print("売上データの処理を開始します...")

# CSVファイルを読み込む
df = pd.read_csv('sales.csv', encoding='utf-8-sig')
print(f"✓ CSVファイルを読み込みました: {len(df)}件のデータ")

# カラム名を確認
print(f"カラム: {df.columns.tolist()}")

# 日付をdatetime型に変換
df['日付'] = pd.to_datetime(df['日付'])

# 日付から年月を抽出
df['年月'] = df['日付'].dt.to_period('M')

# 商品別の売上集計
product_summary = df.groupby('商品名')['売上'].sum().sort_values(ascending=False).head(10)
print("\n商品別売上集計(上位10商品):")
for product, sales in product_summary.items():
    print(f"  {product}: {sales:,}円")

# 日別の売上推移
daily_sales = df.groupby(df['日付'].dt.date)['売上'].sum()

# 月別の売上推移
monthly_sales = df.groupby('年月')['売上'].sum()

# Excelファイルに出力
with pd.ExcelWriter('売上分析レポート.xlsx', engine='openpyxl') as writer:
    # 商品別売上をシートに書き込み(全商品)
    product_summary_all = df.groupby('商品名')['売上'].agg(['sum', 'count', 'mean']).sort_values('sum', ascending=False)
    product_summary_all.columns = ['総売上', '販売回数', '平均売上']
    product_summary_all.to_excel(writer, sheet_name='商品別売上')
    
    # 日別売上をシートに書き込み
    daily_sales.to_excel(writer, sheet_name='日別売上')
    
    # 月別売上をシートに書き込み
    monthly_sales.to_excel(writer, sheet_name='月別売上')
    
    # 売上サマリーも追加
    summary_df = pd.DataFrame({
        '項目': ['総売上', '平均日次売上', '最高日次売上', '最低日次売上', '取引件数', '商品種類数'],
        '値': [
            f"{df['売上'].sum():,.2f}円",
            f"{daily_sales.mean():,.2f}円",
            f"{daily_sales.max():,.2f}円",
            f"{daily_sales.min():,.2f}円",
            f"{len(df)}件",
            f"{df['商品名'].nunique()}種類"
        ]
    })
    summary_df.to_excel(writer, sheet_name='サマリー', index=False)
    
    # 商品ランキングも追加
    ranking_df = product_summary_all.reset_index()
    ranking_df.index = ranking_df.index + 1
    ranking_df.index.name = '順位'
    ranking_df['総売上'] = ranking_df['総売上'].apply(lambda x: f'{x:,.2f}円')
    ranking_df['平均売上'] = ranking_df['平均売上'].apply(lambda x: f'{x:,.2f}円')
    ranking_df.to_excel(writer, sheet_name='商品ランキング')
    
print("✓ Excelファイルを作成しました: 売上分析レポート.xlsx")

# グラフも作成
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(15, 10))

# 1. 商品別売上グラフ(上位10商品)
colors = plt.cm.tab10(range(10))
bars = ax1.bar(range(len(product_summary)), product_summary.values, color=colors)
ax1.set_xticks(range(len(product_summary)))
ax1.set_xticklabels(product_summary.index, rotation=45, ha='right')
ax1.set_title('商品別売上(上位10商品)', fontsize=14, pad=10)
ax1.set_xlabel('商品名')
ax1.set_ylabel('売上(円)')
ax1.grid(True, alpha=0.3, axis='y')

# 棒グラフの上に値を表示
for i, (bar, value) in enumerate(zip(bars, product_summary.values)):
    ax1.text(bar.get_x() + bar.get_width()/2, value + max(product_summary.values)*0.01, 
             f'{value:,.0f}', ha='center', va='bottom', fontsize=9)

# 2. 日別売上推移グラフ
daily_sales.plot(ax=ax2, marker='o', linewidth=1.5, markersize=5, color='#FF6B6B')
ax2.set_title('日別売上推移', fontsize=14, pad=10)
ax2.set_xlabel('日付')
ax2.set_ylabel('売上(円)')
ax2.grid(True, alpha=0.3)
ax2.tick_params(axis='x', rotation=45)

# 3. 月別売上推移グラフ
monthly_sales_values = monthly_sales.values
monthly_sales_labels = [str(period) for period in monthly_sales.index]
bars = ax3.bar(range(len(monthly_sales)), monthly_sales_values, color='#4ECDC4')
ax3.set_xticks(range(len(monthly_sales)))
ax3.set_xticklabels(monthly_sales_labels, rotation=45, ha='right')
ax3.set_title('月別売上推移', fontsize=14, pad=10)
ax3.set_xlabel('年月')
ax3.set_ylabel('売上(円)')
ax3.grid(True, alpha=0.3, axis='y')

# 月別グラフにも値を表示
for i, (bar, value) in enumerate(zip(bars, monthly_sales_values)):
    ax3.text(bar.get_x() + bar.get_width()/2, value + max(monthly_sales_values)*0.01, 
             f'{value:,.0f}', ha='center', va='bottom', fontsize=9)

# 4. 商品別売上構成比(円グラフ)
top5_products = product_summary.head(5)
other_sales = product_summary[5:].sum()
if other_sales > 0:
    pie_data = pd.concat([top5_products, pd.Series([other_sales], index=['その他'])])
else:
    pie_data = top5_products

# 色を設定
pie_colors = ['#FF6B6B', '#4ECDC4', '#45B7D1', '#FED766', '#2AB7CA', '#FE4A49']
wedges, texts, autotexts = ax4.pie(pie_data, labels=pie_data.index, autopct='%1.1f%%', 
                                    startangle=90, colors=pie_colors[:len(pie_data)])
ax4.set_title('商品別売上構成比(上位5商品)', fontsize=14, pad=10)

# 円グラフのテキストを見やすく
for text in texts:
    text.set_fontsize(10)
for autotext in autotexts:
    autotext.set_color('white')
    autotext.set_fontsize(10)
    autotext.set_weight('bold')

plt.tight_layout()
plt.savefig('売上分析グラフ.png', dpi=150, bbox_inches='tight')
print("✓ グラフを作成しました: 売上分析グラフ.png")

# 簡単な分析レポートも作成
print("\n" + "="*50)
print("売上分析サマリー")
print("="*50)
print(f"分析期間: {df['日付'].min().date()} ~ {df['日付'].max().date()}")
print(f"総売上: {df['売上'].sum():,.2f}円")
print(f"取引件数: {len(df)}件")
print(f"平均取引額: {df['売上'].mean():,.2f}円")
print(f"最も売れた商品: {product_summary.index[0]} ({product_summary.iloc[0]:,.2f}円)")
print()

# 月別の成長率を計算
if len(monthly_sales) > 1:
    growth_rate = ((monthly_sales.iloc[-1] - monthly_sales.iloc[0]) / monthly_sales.iloc[0]) * 100
    print(f"期間中の売上成長率: {growth_rate:+.1f}%")

# 商品別の売上分布を分析
print(f"\n売上上位3商品が占める割合: {(product_summary.head(3).sum() / df['売上'].sum() * 100):.1f}%")

# 処理時間を計算
end_time = datetime.now()
processing_time = (end_time - start_time).total_seconds()

print(f"\n処理完了!処理時間: {processing_time:.1f}秒")
print("\n作成されたファイル:")
print("  - 売上分析レポート.xlsx (5つのシート)")
print("  - 売上分析グラフ.png (4つのグラフ)")
print("="*50)

上記コードをメモ帳に貼り付けて「sales_analysis.py」と名前を付けて「sales.csv」と同じフォルダに保存してください。

ポイント:

  • `pandas`でデータ処理が超簡単に

  • グラフも自動で生成される

  • エラーが出てもメッセージが分かりやすい


※VS Codeで実行する場合は「Python拡張機能」が必要になります。

VS Code 拡張機能で「Python」検索結果


(参考)生成AIに上記コードを作成してもらうためのプロンプト例

Pythonで売上データを分析するスクリプトを作成してください。

【背景】
毎月の売上データ分析を自動化したいです。現在はExcelで手作業で行っており、2時間かかっています。

【入力データ】
CSVファイル(sales.csv)のサンプル:
```csv
売上ID,商品ID,商品名,売上,日付
1,14,Product N,8477.97,2024-01-19 06:57:40
2,7,Product G,17281.77,2024-08-27 06:57:40
3,18,Product R,12480.30,2024-01-21 06:57:40

【入力ファイル】
- ファイル名: sales.csv
- エンコーディング: UTF-8 with BOM
- カラム構造:
  - 売上ID: 整数
  - 商品ID: 整数
  - 商品名: 文字列(例: Product A)
  - 売上: 小数(売上金額)
  - 日付: 日時形式(例: 2024-01-19 06:57:40)

【実行環境】
- Windows 11
- Python 3.12
- 必要なライブラリ: pandas, matplotlib, openpyxl

【期待する出力】
1. Excelファイル(売上分析レポート.xlsx)に以下のシートを作成:
   - 商品別売上集計
   - 日別売上推移
   - 月別売上推移
   - サマリー情報

2. グラフ画像(売上分析グラフ.png)に以下を含む:
   - 商品別売上の棒グラフ(上位10商品)
   - 日別売上推移の折れ線グラフ
   - 月別売上推移の棒グラフ
   - 売上構成比の円グラフ

【追加要件】
- 日本語表示に対応(グラフも含む)
- 処理時間を表示
- エラーハンドリングを含める
- 実行時の進捗を表示

ポイント:下記のような観点で具体的に書く(プロンプトも生成AIに作成してもらうとラクです)

  • どういう切り口で分析したいのか

  • PCの実行環境

  • どういう形式で出力させたいのか

  • 作成するコードへの要望(例:日本語コメント記載、エラーが出ても処理止めない、など)

Step 3:自動作成されたグラフとエクセルを確認

「sales.csv」と同じフォルダに「売上分析グラフ.png」「売上分析レポート.xlsx」が出力されます。

自動作成されたグラフのPNGファイル
自動作成された「売上分析レポート.xlsx」の「商品別売上」シート
自動作成された「売上分析レポート.xlsx」の「日別売上」シート
自動作成された「売上分析レポート.xlsx」の「月別売上」シート
自動作成された「売上分析レポート.xlsx」の「サマリー」シート
自動作成された「売上分析レポート.xlsx」の「商品ランキング」シート

3. MCPと連携して更に便利に!

ここからが本番です。MCPのファイル監視機能filesystemを使えば、CSVファイルが更新されたらClaude Desktopに一言頼んで処理が走るようにできます。

MCP設定(claude_desktop_config.json):

{
  "mcpServers": {
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "C:/Users/YourName/Documents/売上データ"
      ]
    }
  }
}

これで、Claude Desktopから直接ファイルを操作できるようになります!

Claude Desktop MCP設定内の下記パスはfilesystemMCPに操作を許可するフォルダ(ディレクトリ)になります。複数個所設定したい場合はパスを複数書き込んでください。今回は「Documents」フォルダの中にある「売上データ」フォルダ内の操作を許可しています。
"C:/Users/YourName/Documents/売上データ"
※パスの”YourName”は皆さんのPC環境に合わせて変えてください。
※Claude Desktop MCP設定については下記記事でも触れています。

🔧 つまずいたポイントと解決策

エラー1: 文字化けが発生した

症状:

UnicodeDecodeError: 'utf-8' codec can't decode byte...

原因:
CSVファイルの文字コードがShift-JISだった

解決策:

# これを
df = pd.read_csv('sales.csv')

# こうする
df = pd.read_csv('sales.csv', encoding='shift-jis')

エラー2: グラフの日本語が表示されない

症状:
グラフの日本語部分が□□□になる

原因:
matplotlibのデフォルトフォントが日本語非対応

解決策:

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['MS Gothic']  # Windows

実測:この設定追加で、グラフ生成時間は0.1秒しか増えませんでした。

💡 応用例・活用アイデア

  • 在庫管理: 発注点を下回ったら自動でアラート

  • 顧客分析: 購買パターンを自動でレポート化

  • 勤怠集計: タイムカードデータから月次集計表を自動作成

  • 見積書作成: テンプレートに自動でデータを流し込み

※上記「応用例・活用アイデア」自動実行のキーワードは「バッチファイル」「Windowsタスクスケジューラー」です。その他にもあと3パターンの自動実行の方法があります(By Claude Desktop)。便利な世の中ですね!

📈 効果測定

実際に1ヶ月使ってみた結果:

  • 作業時間: 120分 → 5分(95.8%削減)

  • ミス発生率: 月3〜4件 → 0件

  • レポート品質: グラフ付きで見やすさ向上

  • 精神的負担: 「また月末か...」→「もう終わった!」

※上記「応用例・活用アイデア」で実行すると作業時間0分も夢じゃないです!

VS Code 実行結果(下のターミナルに「処理時間: 0.8秒」)

💬 まとめ

VBAを覚えなくても、VSCodeとPython、そしてMCPを組み合わせることで、Excel作業を大幅に効率化できます。最初は少し戸惑うかもしれませんが、一度仕組みを作ってしまえば、あとは自動で処理が進みます。

何より、生成AIのサポートを受けながら進められるので、プログラミング初心者でも安心です。

明日は「MCP設定で3時間ハマった私が伝えたい5つの解決策」についてお伝えします。
MCPで生成AIをサポーターからアシスタント・エージェントに進化させましょう!簡単そうで意外とMCP設定で引っかかって悩んでいる方、必見です!


🎁 読者特典

💝 いいね50を超えたら: 複数ファイル一括処理の完全コードを公開!
🎉 いいね100を超えたら: 応用例・活用アイデアの実装パターンを公開!

シェアの際は #YaroTech #VSCode #Excel自動化 #Python をつけていただけると嬉しいです。

💬 質問・リクエスト

「うちの会社の○○な作業も自動化できる?」
「このエラーが解決できない...」

コメント欄でお気軽にどうぞ!全て読んで、できる限りお答えします。


🔗 関連記事

📚 参考リソース


🏷️ タグ
#VSCode #Excel #Python #pandas #MCP #自動化 #VBA卒業 #効率化 #YaroTech #ClaudeDesktop #生成AI #プログラミング不要 #業務改善  #noteチャレンジ #ARM64 #SurfaceLaptop

いいなと思ったら応援しよう!

YaroTech|生成AIの傾奇者 記事がお役に立てたなら嬉しいです! いただいたチップは、新しいMCPツールの検証や、より深い実践実験の資金として大切に使わせていただきます。 あなたの応援が次の「AI活用の感動」を生み出す原動力になります✨ 一緒に羽ばたき続けましょう!