💡 結論から
- ソースコードの変更に伴うExcel設計書の更新作業 は、AI(LLM)とVBAを組み合わせることで安全かつ半自動化できる。
- AIにはVBAコードを書かせるのではなく、 「設計書に追記するための差分データ(TSV)」の抽出のみ を担当させる。
- 抽出したデータをVBAでExcelに流し込む際、同一セル内の改行(Alt+Enter)ではなく 「行の物理挿入」と「折り返し設定の解除」 を行うことで、Excel特有のレイアウト崩れ(行の高さの爆発)を完全に防ぐことができる。
- 環境変数ファイル(
env.txt)を活用し、パスや担当者名をVBAから外出しすることで、チームメンバー全員がクローンして即座に使える汎用ツールになる。
🚀 はじめに
どうも、開発案件とCCoE活動の二刀流で常にタスクがパンク状態のSEです。
私は基本的に面倒くさがりなので、 「エンジニアたるもの、面倒な手作業は全力でサボってなんぼ」 をモットーに生きています。
日々の業務で、こんな絶望を感じたことはありませんか?
「ソースコードは綺麗に直した。テストも通った。……あとはこの Excelの画面設計書 を手作業で直すだけだ……(絶望)」
この記事は、私と同じように 「めっちゃ楽して仕事をこなしたい、でもドキュメントの品質は落とせない」 という多忙なエンジニアに向けて書きました。
他のモダンな言語やツールに触れているエンジニアからすると、今さらExcel VBAのコードを書くのは少し億劫かもしれません。しかし、AI(LLM)と組み合わせることで、最小限のVBAコードで最大の「サボり」を実現できます。
「AIに変更点をまとめさせたいけど、そのままExcelに貼るとレイアウトがぶっ壊れるから結局手作業…」
そんな悩みを解決するための、実戦的でニッチなハックをご紹介します。
1. 😢 背景:発生した問題
さて、改めて手作業で設計書を更新する場合、以下のフローが発生します。
- 変更箇所をExcelから目視で探す
- 行を挿入し、追記した部分だけを 「赤字」 にする
- Excelのセル内で改行して行の高さが崩れたら、手動で調整する
- 「改訂履歴」シートに修正内容と日付、名前を追記する
手作業では時間がかかる上、転記ミスも発生しがちです。
この「面倒くさいが、正確性が求められる作業」を、AIとVBAの連携によって解決・自動化するアプローチを整理します。
2. 🔍 前提知識:なぜ「Excelへの直接コピペ」は崩れるのか
AIに変更点を出力させるところまでは簡単ですが、それをそのままExcelに貼り付けると問題が起きます。
| 原因 | 発生する問題 |
|---|---|
|
同一セル内での改行 (Alt+Enter) |
文字数が増えるとセルの「行の高さ」が異常に広がり、印刷時や別環境で開いた際に文字が隠れる・枠をはみ出す。 |
|
「折り返して全体を表示する」 設定 |
長文をペーストした際、Excelのデフォルト動作によって意図しない箇所で改行され、フォーマットが崩れる。 |
これらを防ぐためには、 「物理的にExcelの行を追加し、1行ずつペーストし、高さを固定する」 という機械的な処理(VBA)を挟む必要があります。
3. 🚀 解決策:AI抽出 × VBA流し込みの連携フロー
ここからは、具体的な解決策と実装手順を解説します。全体像は以下の通りです。
3.1 AIを使った「更新用データ」の抽出
まずはAIにソースコードを読み込ませて、マクロが解釈できるタブ区切りのテキスト(TSV)を出力させます。
🤖 AIへのプロンプト例
以下のソースコードの変更点を解析し、Excel設計書を更新するためのタブ区切りデータ(TSV)を出力してください。
【重要】 既存のExcel設計書に書かれている仕様は絶対に消さずに残す前提です。追加された仕様のみを抽出してください。
【出力フォーマット】
ID(Tab)項目名(Tab)新しい内容
【出力される update_data.txt の例】
ID 項目名 新しい内容
101 初期処理 1. データ取得\n・マウント時に初期データ取得APIをコールする。
205 ボタン制御 ・未ログイン状態の場合はボタンを非活性にする。
3.2 環境変数ファイル(env.txt)の準備
マクロをチームで共有するため、個人の名前やシート名を外出しします。Excelファイルと同じフォルダに env.txt を作成します(UTF-8推奨)。
AUTHOR=あなたの名前
TARGET_SHEET=設計書シート
HISTORY_SHEET=更新履歴
3.3 VBAマクロの組み込み
自動更新の心臓部となるVBAコードです。対象のExcelファイル(.xlsm)の標準モジュールに追加します。
💡 コード内の少し特殊なVBA技術について(クリックして展開)
このコードでは、VBAに標準搭載されているテキスト読み込み機能ではなく、 **`ADODB.Stream`** と **`FileSystemObject`** を使用しています。 これは「AIが出力したUTF-8形式のテキストを文字化けさせずに読み込むため」および「ファイルパスの存在チェックを行うため」です。詳細な仕様や使い方は、末尾の「参考リンク」にまとめていますので、気になった方はそちらをご参照ください。Option Explicit
Sub UpdateDesignDocFromAI()
' ==========================================
' 1. パスの自動取得と環境変数の読み込み
' ==========================================
Dim basePath As String, txtPath As String, envPath As String
basePath = ThisWorkbook.Path & "\" ' 自分自身のパスを自動取得し、属人化を排除
txtPath = basePath & "update_data.txt"
envPath = basePath & "env.txt"
Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
Dim authorName As String: authorName = "自動更新システム"
Dim sheetDocName As String: sheetDocName = "Sheet1"
Dim sheetRevName As String: sheetRevName = "Sheet2"
If fso.FileExists(envPath) Then
Dim envStream As Object: Set envStream = CreateObject("ADODB.Stream")
With envStream
.Type = 2: .Charset = "UTF-8": .Open: .LoadFromFile envPath
End With
Dim envLines() As String: envLines = Split(Replace(envStream.ReadText, vbCrLf, vbLf), vbLf)
envStream.Close
Dim eLine As Variant
For Each eLine In envLines
If InStr(eLine, "=") > 0 Then
Dim key As String: key = Trim(Split(eLine, "=")(0))
Dim val As String: val = Trim(Split(eLine, "=")(1))
Select Case UCase(key)
Case "AUTHOR": authorName = val
Case "TARGET_SHEET": sheetDocName = val
Case "HISTORY_SHEET": sheetRevName = val
End Select
End If
Next eLine
End If
If Not fso.FileExists(txtPath) Then
MsgBox "更新データが見つかりません。", vbExclamation
Exit Sub
End If
' ==========================================
' 2. シート読み込みとデータ更新処理
' ==========================================
Dim ws As Worksheet, wsRev As Worksheet
On Error Resume Next
Set ws = ThisWorkbook.Sheets(sheetDocName)
Set wsRev = ThisWorkbook.Sheets(sheetRevName)
On Error GoTo 0
If ws Is Nothing Then Exit Sub
Dim stream As Object: Set stream = CreateObject("ADODB.Stream")
With stream
.Type = 2: .Charset = "UTF-8": .Open: .LoadFromFile txtPath
End With
Dim lines() As String: lines = Split(Replace(stream.ReadText, vbCrLf, vbLf), vbLf)
stream.Close
Dim updateCount As Long: updateCount = 0
Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Dim k As Long, i As Long
For k = LBound(lines) To UBound(lines)
If Trim(lines(k)) <> "" And Left(Trim(lines(k)), 1) <> "#" Then
Dim items() As String: items = Split(lines(k), vbTab)
If UBound(items) >= 2 Then
Dim targetID As String: targetID = Trim(items(0))
Dim newContent As String: newContent = Trim(Replace(items(2), "\n", vbLf))
' 例: A列から対象のIDを検索
Dim foundRow As Long: foundRow = 0
For i = 2 To lastRow
If Trim(CStr(ws.Cells(i, 1).Value)) = targetID Then
foundRow = i: Exit For
End If
Next i
' 対象行が見つかった場合の追記処理(例: D列に追記)
Dim targetCol As Long: targetCol = 4
If foundRow > 0 Then
Dim newLines() As String: newLines = Split(newContent, vbLf)
' 空白行(セパレータ)を1行挿入
ws.Rows(foundRow + 1).Insert Shift:=xlDown
Dim targetPasteRow As Long: targetPasteRow = foundRow + 2
' 1行ずつ挿入してペースト&赤字化
Dim rIdx As Long
For rIdx = LBound(newLines) To UBound(newLines)
ws.Rows(targetPasteRow).Insert Shift:=xlDown
With ws.Cells(targetPasteRow, targetCol)
.Value = Trim(newLines(rIdx))
.Font.Color = vbRed
.WrapText = False ' レイアウト崩れ防止のキモ
End With
ws.Rows(targetPasteRow).RowHeight = 15 ' 高さを固定
targetPasteRow = targetPasteRow + 1
Next rIdx
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
updateCount = updateCount + 1
End If
End If
End If
Next k
' ==========================================
' 3. 履歴シートへの自動追記
' ==========================================
If updateCount > 0 And Not wsRev Is Nothing Then
Dim newRowRev As Long: newRowRev = wsRev.Cells(wsRev.Rows.Count, "A").End(xlUp).Row + 1
wsRev.Cells(newRowRev, "A").Value = Format(Date, "yyyy/m/d")
wsRev.Cells(newRowRev, "B").Value = "仕様追加 (" & updateCount & "件)"
wsRev.Cells(newRowRev, "C").Value = authorName
End If
ThisWorkbook.Save
MsgBox "更新が完了しました!更新箇所: " & updateCount & "件", vbInformation
End Sub
4. 🛠️ 一歩進んだ運用(VBAの属人化を防ぐ)
⚠️ よくある失敗
VBAツールを導入する際、最も陥りやすい罠が 「作った人のPCの絶対パスがハードコーディングされている」 ことです。
今回のスクリプトでは ThisWorkbook.Path を使用し、さらにシート名や担当者名を env.txt に切り出しているため、以下のようなメリットがあります。
- 別のメンバーがGitからクローンして、各自のローカルフォルダで実行してもエラーにならない。
- シート名が変わっても、VBAのコードを一切触らずに
env.txtの書き換えだけで対応可能。
5. 🎯 まとめ
- AIにVBAコード自体を書かせるのではなく、 「AIに出力させたデータを、古典的なVBAで確実に処理する」 ハイブリッドなアプローチが最も手堅いです。
- 行の物理挿入と
WrapText = Falseを組み合わせることで、Excel特有のレイアウト崩れを回避できます。 - 環境変数を導入することで、チーム全体で使える汎用ツールへと昇華できます。
設計書のメンテナンスに時間を奪われている方は、ぜひこの構成を試してみてください!