メインコンテンツへスキップ
見出し画像

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

     
     
    生成AIの感動を共有したいYaroTechです✨ 常識より実験。正解より行動。 生成AI時代を、先に試す傾奇者。 📝 430日間継続投稿中| 🎉 フォロワー1840名突破!🤝 質問大歓迎!みんなで「AIと共に羽ばたく」コミュニティを作りましょう🚀

    あなたへのおすすめ