목록으로
📊 AIとビジネス - Excel

AIでExcel業務を完全自動化 - 実務プロジェクト完成ガイド

毎日繰り返されるExcel作業!給与計算からレポート作成まで、AIで自動化する実務プロジェクトを完成させましょう。

業務自動化ワークフロー設計

毎朝出勤すると同じ作業が待っていますよね。データ整理して、レポート作って、メール送って...繰り返される仕事です。「これ自動でできないかな?」という考え、一度は したことがあるはずです。

今や本当に自動化できます!AIとExcelを組み合わせれば、出勤から退勤までの業務フローを自動化できます。データを収集し、分析し、レポートを作成し、メールまで送信するすべてのプロセスをボタン一つで処理できます。

想像してみてください。朝9時に自動で前日の売上データを集めて、AIが分析して、レポートをきれいに作って、経営陣のメールに送信するんです。あなたは結果を確認するだけです。

今回は、実際の業務を完全自動化するワークフローを設計して構築する方法を学びます。日次レポートから顧客管理、在庫管理まで、すぐに適用できる自動化システムを段階的に作っていきましょう。

1. 日次レポート自動生成ワークフロー

全体プロセス

1. データ収集(複数ファイル/シートから)
2. データクレンジングと検証
3. 集計と分析
4. AIでインサイト生成
5. レポートフォーマッティング
6. メール自動送信

AIプロンプト:

毎朝9時に自動実行されて
前日の売上データを収集し、分析し、レポートを作って
メールで送信する完全自動化システムを作ってください。

AI生成VBA:

' ============================================
' 日次レポート自動化マスターシステム
' ============================================

Sub 日次レポート_マスター()
    Dim startTime As Double
    startTime = Timer

    On Error GoTo ErrorHandler

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False

    ' 1段階: データ収集
    Call データ収集

    ' 2段階: データクレンジング
    Call データクレンジング

    ' 3段階: 集計と分析
    Call データ分析

    ' 4段階: AIインサイト
    Call AIインサイト生成

    ' 5段階: レポート生成
    Call レポート生成

    ' 6段階: メール送信
    Call メール送信

    Application.DisplayAlerts = True
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True

    Dim elapsed As Double
    elapsed = Timer - startTime

    MsgBox "日次レポートが生成され送信されました。" & vbCrLf & _
           "所要時間: " & Format(elapsed, "0.0") & "秒", _
           vbInformation, "作業完了"

    Exit Sub

ErrorHandler:
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.DisplayAlerts = True

    MsgBox "エラー発生: " & Err.Description & vbCrLf & _
           "エラー位置: " & Erl, vbCritical
End Sub

' ============================================
' 1段階: データ収集
' ============================================
Sub データ収集()
    Dim targetWs As Worksheet
    Dim sourceFolder As String
    Dim fileName As String
    Dim wb As Workbook
    Dim lastRow As Long

    Set targetWs = ThisWorkbook.Sheets("元データ")
    targetWs.Cells.Clear

    ' 収集するフォルダパス
    sourceFolder = ThisWorkbook.Path & "\日次データ\"

    ' ヘッダー作成
    targetWs.Cells(1, 1).Value = "日付"
    targetWs.Cells(1, 2).Value = "支店"
    targetWs.Cells(1, 3).Value = "製品"
    targetWs.Cells(1, 4).Value = "数量"
    targetWs.Cells(1, 5).Value = "売上高"

    lastRow = 2

    ' フォルダ内すべてのExcelファイル処理
    fileName = Dir(sourceFolder & "*.xlsx")

    Do While fileName <> ""
        If fileName <> ThisWorkbook.Name Then
            Set wb = Workbooks.Open(sourceFolder & fileName, ReadOnly:=True)

            ' データコピー
            Dim srcLastRow As Long
            srcLastRow = wb.Sheets(1).Cells(wb.Sheets(1).Rows.Count, "A").End(xlUp).Row

            If srcLastRow > 1 Then
                wb.Sheets(1).Range("A2:E" & srcLastRow).Copy
                targetWs.Cells(lastRow, 1).PasteSpecial xlPasteValues
                lastRow = targetWs.Cells(targetWs.Rows.Count, "A").End(xlUp).Row + 1
            End If

            wb.Close SaveChanges:=False
        End If

        fileName = Dir()
    Loop

    Application.CutCopyMode = False

    Debug.Print "データ収集完了: " & lastRow - 2 & "件"
End Sub

' ============================================
' 2段階: データクレンジング
' ============================================
Sub データクレンジング()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim deleteCount As Long

    Set ws = ThisWorkbook.Sheets("元データ")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' 重複削除
    ws.Range("A1:E" & lastRow).RemoveDuplicates _
        Columns:=Array(1, 2, 3), _
        Header:=xlYes

    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' データ検証と異常値削除
    For i = lastRow To 2 Step -1
        Dim isInvalid As Boolean
        isInvalid = False

        ' 日付検証
        If Not IsDate(ws.Cells(i, 1).Value) Then isInvalid = True

        ' 数量検証(負数または異常に大きい値)
        If ws.Cells(i, 4).Value < 0 Or ws.Cells(i, 4).Value > 10000 Then
            isInvalid = True
        End If

        ' 売上高検証
        If ws.Cells(i, 5).Value < 0 Or ws.Cells(i, 5).Value > 100000000 Then
            isInvalid = True
        End If

        If isInvalid Then
            ws.Rows(i).Delete
            deleteCount = deleteCount + 1
        End If
    Next i

    ' 空白整理
    For i = 2 To lastRow
        ws.Cells(i, 2).Value = Trim(ws.Cells(i, 2).Value) ' 支店
        ws.Cells(i, 3).Value = Trim(ws.Cells(i, 3).Value) ' 製品
    Next i

    Debug.Print "データクレンジング完了: " & deleteCount & "件削除"
End Sub

' ============================================
' 3段階: データ分析
' ============================================
Sub データ分析()
    Dim sourceWs As Worksheet
    Dim reportWs As Worksheet
    Dim lastRow As Long

    Set sourceWs = ThisWorkbook.Sheets("元データ")
    lastRow = sourceWs.Cells(sourceWs.Rows.Count, "A").End(xlUp).Row

    ' レポートシート準備
    On Error Resume Next
    Set reportWs = Sheets("分析結果")
    If reportWs Is Nothing Then
        Set reportWs = Sheets.Add(After:=sourceWs)
        reportWs.Name = "分析結果"
    Else
        reportWs.Cells.Clear
    End If
    On Error GoTo 0

    ' 1. 全体要約
    With reportWs
        .Cells(1, 1).Value = "日次売上要約"
        .Cells(1, 1).Font.Size = 14
        .Cells(1, 1).Font.Bold = True

        .Cells(3, 1).Value = "分析日:"
        .Cells(3, 2).Value = Date - 1
        .Cells(3, 2).NumberFormat = "yyyy-mm-dd"

        .Cells(4, 1).Value = "総取引件数:"
        .Cells(4, 2).Value = lastRow - 1
        .Cells(4, 2).NumberFormat = "#,##0"

        .Cells(5, 1).Value = "総売上高:"
        .Cells(5, 2).Formula = "=SUM(元データ!E:E)"
        .Cells(5, 2).NumberFormat = "#,##0"

        .Cells(6, 1).Value = "平均取引金額:"
        .Cells(6, 2).Formula = "=AVERAGE(元データ!E:E)"
        .Cells(6, 2).NumberFormat = "#,##0"

        .Cells(7, 1).Value = "最大取引金額:"
        .Cells(7, 2).Formula = "=MAX(元データ!E:E)"
        .Cells(7, 2).NumberFormat = "#,##0"
    End With

    ' 2. 支店別集計
    Call 支店別集計(reportWs)

    ' 3. 製品別集計
    Call 製品別集計(reportWs)

    ' 4. 前日比分析
    Call 前日比分析(reportWs)

    Debug.Print "データ分析完了"
End Sub

' ============================================
' 4段階: AIインサイト生成
' ============================================
Sub AIインサイト生成()
    Dim reportWs As Worksheet
    Dim summary As String
    Dim insight As String

    Set reportWs = ThisWorkbook.Sheets("分析結果")

    ' 要約データ収集
    summary = "総売上: " & reportWs.Cells(5, 2).Value & "円" & vbCrLf & _
              "取引件数: " & reportWs.Cells(4, 2).Value & "件" & vbCrLf & _
              "平均取引金額: " & reportWs.Cells(6, 2).Value & "円" & vbCrLf & _
              "前日比: " & reportWs.Cells(8, 2).Value

    ' AIにインサイトリクエスト
    insight = AskGPT( _
        "次の日次売上データを分析し、" & _
        "経営陣に報告する3つの主要インサイトを作成して:" & vbCrLf & summary)

    ' レポートに追加
    reportWs.Cells(20, 1).Value = "AIインサイト"
    reportWs.Cells(20, 1).Font.Bold = True
    reportWs.Cells(20, 1).Font.Size = 12

    reportWs.Cells(21, 1).Value = insight
    reportWs.Cells(21, 1).WrapText = True
    reportWs.Range("A21:F25").Merge
    reportWs.Cells(21, 1).Interior.Color = RGB(217, 225, 242)

    Debug.Print "AIインサイト生成完了"
End Sub

' ============================================
' 5段階: レポート生成
' ============================================
Sub レポート生成()
    Dim reportWs As Worksheet
    Dim chartObj As ChartObject

    Set reportWs = ThisWorkbook.Sheets("分析結果")

    ' チャート生成
    ' 1. 支店別売上チャート
    Set chartObj = reportWs.ChartObjects.Add( _
        Left:=reportWs.Range("G2").Left, _
        Top:=reportWs.Range("G2").Top, _
        Width:=350, _
        Height:=250)

    With chartObj.Chart
        .SetSourceData Source:=reportWs.Range("A11:B15")
        .ChartType = xlColumnClustered
        .HasTitle = True
        .ChartTitle.Text = "支店別売上"
        .HasLegend = False
    End With

    ' 2. 製品別売上チャート
    Set chartObj = reportWs.ChartObjects.Add( _
        Left:=reportWs.Range("G18").Left, _
        Top:=reportWs.Range("G18").Top, _
        Width:=350, _
        Height:=250)

    With chartObj.Chart
        .SetSourceData Source:=reportWs.Range("D11:E15")
        .ChartType = xlPie
        .HasTitle = True
        .ChartTitle.Text = "製品別売上シェア"
    End With

    ' 書式適用
    With reportWs
        .Columns("A:F").AutoFit
        .Range("A1:F1").Interior.Color = RGB(68, 114, 196)
        .Range("A1:F1").Font.Color = RGB(255, 255, 255)
    End With

    Debug.Print "レポート生成完了"
End Sub

' ============================================
' 6段階: メール送信
' ============================================
Sub メール送信()
    Dim OutApp As Object
    Dim OutMail As Object
    Dim reportWs As Worksheet
    Dim emailBody As String

    Set reportWs = ThisWorkbook.Sheets("分析結果")

    ' メール本文作成
    emailBody = "<html><body>" & _
                "<h2>日次売上レポート</h2>" & _
                "<p><b>分析日:</b> " & reportWs.Cells(3, 2).Value & "</p>" & _
                "<p><b>総売上高:</b> " & Format(reportWs.Cells(5, 2).Value, "#,##0") & "円</p>" & _
                "<p><b>取引件数:</b> " & Format(reportWs.Cells(4, 2).Value, "#,##0") & "件</p>" & _
                "<p><b>前日比:</b> " & reportWs.Cells(8, 2).Value & "</p>" & _
                "<hr>" & _
                "<h3>AIインサイト</h3>" & _
                "<p>" & Replace(reportWs.Cells(21, 1).Value, vbCrLf, "<br>") & "</p>" & _
                "<hr>" & _
                "<p>詳細は添付レポートをご確認ください。</p>" & _
                "</body></html>"

    ' レポートファイルとして保存
    Dim reportPath As String
    reportPath = ThisWorkbook.Path & "\日次レポート_" & Format(Date, "yyyymmdd") & ".xlsx"

    ThisWorkbook.SaveCopyAs reportPath

    ' Outlookメール送信
    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    With OutMail
        .To = "manager@company.com"
        .CC = "team@company.com"
        .Subject = "日次売上レポート - " & Format(Date - 1, "yyyy-mm-dd")
        .HTMLBody = emailBody
        .Attachments.Add reportPath
        .Send ' または.Display(確認後送信)
    End With

    Set OutMail = Nothing
    Set OutApp = Nothing

    Debug.Print "メール送信完了"
End Sub

' ============================================
' 自動実行スケジューラ設定
' ============================================
Sub 自動実行設定()
    ' 毎日午前9時に実行
    Application.OnTime TimeValue("09:00:00"), "日次レポート_マスター"

    MsgBox "毎日午前9時に自動で日次レポートが生成されます。", vbInformation
End Sub

Sub 自動実行キャンセル()
    On Error Resume Next
    Application.OnTime TimeValue("09:00:00"), "日次レポート_マスター", , False
    MsgBox "自動実行がキャンセルされました。", vbInformation
End Sub

2. 顧客データ管理ワークフロー

シナリオ: 顧客情報を収集し、AIでセグメント化し、カスタマイズされたマーケティングメッセージを生成

Sub 顧客管理ワークフロー()
    ' 1. 新規顧客データ取得
    Call 顧客データ収集

    ' 2. 重複顧客マージ
    Call 重複顧客マージ

    ' 3. AIで顧客セグメント化
    Call AI顧客セグメント化

    ' 4. カスタマイズメッセージ生成
    Call カスタマイズメッセージ生成

    ' 5. CRMシステム更新
    Call CRM更新

    MsgBox "顧客管理ワークフローが完了しました。", vbInformation
End Sub

Sub AI顧客セグメント化()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("顧客リスト")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    ' AIで各顧客プロファイル分析
    For i = 2 To lastRow
        Dim customerInfo As String
        Dim segment As String

        customerInfo = "年齢: " & ws.Cells(i, 3).Value & _
                      ", 購入回数: " & ws.Cells(i, 4).Value & _
                      ", 総購入額: " & ws.Cells(i, 5).Value & _
                      ", 最終購入日: " & ws.Cells(i, 6).Value

        segment = AskGPT( _
            "次の顧客情報に基づいてVIP/一般/新規/離脱リスクのいずれかに分類して:" & _
            vbCrLf & customerInfo)

        ws.Cells(i, 7).Value = segment
    Next i
End Sub

Sub カスタマイズメッセージ生成()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("顧客リスト")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow
        Dim customerName As String
        Dim segment As String
        Dim message As String

        customerName = ws.Cells(i, 2).Value
        segment = ws.Cells(i, 7).Value

        message = AskGPT( _
            customerName & "様に送る" & segment & "顧客向け" & _
            "マーケティングメッセージをフレンドリーでパーソナライズされたトーンで作成して(50字以内)")

        ws.Cells(i, 8).Value = message
    Next i
End Sub

3. 在庫管理自動化ワークフロー

Sub 在庫管理ワークフロー()
    ' 1. 現在の在庫確認
    Call 在庫状況更新

    ' 2. 安全在庫以下の品目検知
    Call 在庫警報確認

    ' 3. AI需要予測
    Call AI需要予測

    ' 4. 自動発注推奨
    Call 自動発注生成

    ' 5. 発注書メール送信
    Call 発注書送信

    MsgBox "在庫管理が完了しました。", vbInformation
End Sub

Sub AI需要予測()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long

    Set ws = ThisWorkbook.Sheets("在庫管理")
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    For i = 2 To lastRow
        Dim productName As String
        Dim salesHistory As String
        Dim forecast As String

        productName = ws.Cells(i, 1).Value

        ' 最近30日間の販売データ収集
        salesHistory = "最近30日の販売: " & ws.Cells(i, 5).Value & "個"

        forecast = AskGPT( _
            productName & "の" & salesHistory & _
            "に基づいて来週の予想需要量を数字のみで答えて")

        ws.Cells(i, 6).Value = Val(forecast)
    Next i
End Sub

4. 統合自動化ダッシュボード

Sub 自動化ダッシュボード()
    Dim dashWs As Worksheet

    ' ダッシュボードシート生成
    On Error Resume Next
    Set dashWs = Sheets("自動化ダッシュボード")
    If dashWs Is Nothing Then
        Set dashWs = Sheets.Add
        dashWs.Name = "自動化ダッシュボード"
    Else
        dashWs.Cells.Clear
    End If
    On Error GoTo 0

    With dashWs
        ' タイトル
        .Cells(1, 1).Value = "業務自動化ダッシュボード"
        .Cells(1, 1).Font.Size = 16
        .Cells(1, 1).Font.Bold = True

        ' ワークフローボタン
        Call ボタン生成(dashWs, "C3", "日次レポート生成", "日次レポート_マスター")
        Call ボタン生成(dashWs, "C5", "顧客管理", "顧客管理ワークフロー")
        Call ボタン生成(dashWs, "C7", "在庫管理", "在庫管理ワークフロー")
        Call ボタン生成(dashWs, "C9", "プロジェクト管理", "プロジェクト管理ワークフロー")

        ' 設定ボタン
        Call ボタン生成(dashWs, "C12", "自動実行設定", "自動実行設定")
        Call ボタン生成(dashWs, "C14", "AI設定", "AIプラグイン設定")
        Call ボタン生成(dashWs, "C16", "API統計", "API統計表示")

        ' ステータス表示
        .Cells(3, 6).Value = "最終実行:"
        .Cells(3, 7).Value = Now
        .Cells(3, 7).NumberFormat = "yyyy-mm-dd hh:mm"

        .Cells(5, 6).Value = "処理済顧客:"
        .Cells(5, 7).Value = "1,234名"

        .Cells(7, 6).Value = "在庫警報:"
        .Cells(7, 7).Value = "3品目"
        .Cells(7, 7).Font.Color = RGB(255, 0, 0)

        .Columns("A:H").AutoFit
    End With

    MsgBox "自動化ダッシュボードが生成されました。", vbInformation
End Sub

Sub ボタン生成(ws As Worksheet, cellAddress As String, caption As String, macroName As String)
    Dim btn As Button

    Set btn = ws.Buttons.Add( _
        ws.Range(cellAddress).Left, _
        ws.Range(cellAddress).Top, _
        150, 25)

    btn.OnAction = macroName
    btn.Caption = caption
    btn.Font.Bold = True
End Sub

5. エラー処理とロギングシステム

' ログ記録関数
Sub ログ記録(logType As String, message As String)
    Dim logWs As Worksheet
    Dim lastRow As Long

    On Error Resume Next
    Set logWs = Sheets("実行ログ")
    If logWs Is Nothing Then
        Set logWs = Sheets.Add
        logWs.Name = "実行ログ"
        logWs.Cells(1, 1).Value = "時刻"
        logWs.Cells(1, 2).Value = "タイプ"
        logWs.Cells(1, 3).Value = "内容"
    End If
    On Error GoTo 0

    lastRow = logWs.Cells(logWs.Rows.Count, "A").End(xlUp).Row + 1

    logWs.Cells(lastRow, 1).Value = Now
    logWs.Cells(lastRow, 2).Value = logType
    logWs.Cells(lastRow, 3).Value = message

    ' ログ色
    Select Case logType
        Case "成功"
            logWs.Rows(lastRow).Interior.Color = RGB(198, 224, 180)
        Case "警告"
            logWs.Rows(lastRow).Interior.Color = RGB(255, 242, 204)
        Case "エラー"
            logWs.Rows(lastRow).Interior.Color = RGB(255, 199, 206)
    End Select
End Sub

' 使用例
Sub 例示ワークフロー()
    On Error GoTo ErrorHandler

    Call ログ記録("情報", "ワークフロー開始")

    ' 作業実行
    Call データ収集
    Call ログ記録("成功", "データ収集完了")

    Call データ分析
    Call ログ記録("成功", "データ分析完了")

    Exit Sub

ErrorHandler:
    Call ログ記録("エラー", "エラー発生: " & Err.Description)
    MsgBox "エラーが発生しました。ログを確認してください。", vbCritical
End Sub

まとめ

完全自動化された業務ワークフロー構築:

  • ✅ 日次レポート自動生成と送信
  • ✅ 顧客/在庫/プロジェクト管理の自動化
  • ✅ AIインサイトで意思決定支援
  • ✅ 統合ダッシュボードで一目で管理
  • ✅ ロギングと監視で安定性確保

これでExcelとAIを活用した完全自動化業務システムを構築できます。繰り返し作業から解放されて、より創造的な仕事に集中しましょう!