0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

面倒なExcel設計書のメンテをAIとVBAで少しだけ楽にする方法

0
Last updated at Posted at 2026-07-16

💡 結論から

  • ソースコードの変更に伴う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. 😢 背景:発生した問題

さて、改めて手作業で設計書を更新する場合、以下のフローが発生します。

  1. 変更箇所をExcelから目視で探す
  2. 行を挿入し、追記した部分だけを 「赤字」 にする
  3. Excelのセル内で改行して行の高さが崩れたら、手動で調整する
  4. 「改訂履歴」シートに修正内容と日付、名前を追記する

手作業では時間がかかる上、転記ミスも発生しがちです。

この「面倒くさいが、正確性が求められる作業」を、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特有のレイアウト崩れを回避できます。
  • 環境変数を導入することで、チーム全体で使える汎用ツールへと昇華できます。

設計書のメンテナンスに時間を奪われている方は、ぜひこの構成を試してみてください!


参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?