📊 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を活用した完全自動化業務システムを構築できます。繰り返し作業から解放されて、より創造的な仕事に集中しましょう!