AIとVBAでCSVログ解析ツールを開発したプロセス(開発ログ)

0. はじめに

本記事では、Excel / VBAで作成したCSVログ解析ツールを題材に、

AI(ChatGPT)と協働してツールを開発した実際のプロセスを整理します。

以前、CSVログから必要信号を抽出し、単位変換とグラフ化まで行うExcel VBAツールを作成し公開しました。

前回の記事

Excel VBAでCSVログ解析ツールを作ったので公開します

導入文 CSV形式のログ解析は、検証やデバッグの現場で頻繁に発生します。 例えば次のような作業です。 大量のCSVログから必要な信号だけ取り出す 単位変換をかける 特定条…

ツール画面の画像


本記事ではツール自体の説明ではなく、

AIと一緒にどのようにツール開発を進めたか

という開発ログを残しておきます。
この記事は

  • AI開発の正解を示すものではありません
  • あくまで 今回自分がどう進めたかの記録 です

将来もっと良い方法が見つかった時に比較できるよう、
現時点の開発手順を残しておくことを目的としています。


想定読者

本記事は以下のような方を想定しています。

  • Excel / VBA を使うエンジニア
  • 検証ログ解析を行うエンジニア
  • AIを開発補助として使ってみたい人

AIを使うと「コード生成」が注目されがちですが、
実際には

  • 要求仕様の整理
  • 処理分割
  • エラー設計
  • コード統一

といった 開発プロセス全体が重要だと感じました。
本記事が、AIを開発にどう組み込むか考える際の参考になれば幸いです。



1. 今回の題材(CSVログ抽出ツール)

今回の題材は

CSVログ解析ツール

です。
主な機能は次の通りです。

  • CSVログから指定信号抽出
  • 単位変換 (k×値 + b)
  • 時刻範囲抽出
  • 行フィルタ
  • グラフ生成

入力はCSV、出力はExcelです。
検証ログ解析では

  • 信号抽出
  • Excel整理
  • グラフ作成

を何度も繰り返すため、

設定変更だけで再利用できるツール

として作成しました。


2. 今回の開発ステップ

今回の開発は次の流れで進めました。

  1. 目的・価値の確定
  2. 要求仕様
  3. 詳細仕様
  4. アーキテクチャ
  5. 実装とレビュー
  6. 検証

AIには主に

  • 仕様整理
  • 設計案提示
  • コード生成

を担当してもらい、人間側では

  • 最終判断
  • コード理解
  • 検証

を行いました。


3. 目的・価値の確定

まず

このツールを何のために作るのか

を整理しました。この段階はAIに丸投げせず、

人間が主導して決めました。

決めた内容は次の通りです。

解決したい問題

検証ログ解析で

  • 信号抽出
  • 単位変換
  • グラフ作成

を毎回手作業で行っていました。そのため

CSVログから信号抽出〜グラフ化までを自動化するツール

を作ることにしました。


成功条件

次が満たされれば完成としました。

  • CSVログ抽出
  • 単位変換
  • グラフ出力
  • 大量ログ処理
  • 設定変更で再利用可能

AIの役割

AIには

  • 仕様検討の論点
  • 検討すべき機能

を提示してもらいました。
例えば

  • グラフは必須か
  • フィルタは必要か
  • CSV以外対応するか

などです。
最終判断は人間が行いました。


4. 要求仕様

次に

ユーザー視点で何ができるか

を整理しました。


必須機能

  • CSVログ抽出
  • 単位変換
  • グラフ出力(横軸時間、縦軸抽出信号の値のグラフ)
  • 処理進捗表示

あれば良い

  • 時刻範囲抽出
  • 行フィルタ(指定の信号値が特定の値のデータのみ抽出)
  • XYグラフ

今回対応しない

  • 複雑な変換
  • CSV以外対応

AIには

  • 仕様の抜け
  • エッジケース

などを提示してもらいました。
ここでいう エッジケース とは、通常とは異なる条件のことです。
例えば

  • CSVに信号が存在しない
  • 設定値が数値でない
  • ログファイルが0件

といった状況です。



5. 詳細仕様

次に

実装可能な粒度まで仕様を落としました。

ここでは

  • 設定シート構造
  • CSVフォーマット前提
  • エラー処理
  • 出力データ形式
  • 進捗表示

などを決めました。
AIには

  • 必要な設定項目
  • エラー条件

を列挙してもらい、それを見ながら

  • 採用するか
  • UI配置

を判断しました。


設定シート

実際のツールでは、以下のような設定シートを用意しています。


入力バリデーション仕様

設定シートでは、入力値に対していくつかのルールを定義しています。
例えば以下のような条件です。

大項目項目入力セルエラー条件
入出力基本ログフォルダC3空欄、または存在しないフォルダ
入出力基本出力先フォルダC4空欄、または存在しないフォルダ
入出力基本出力ファイル名C5空欄、または .xlsx 以外
抽出設定変換ON/OFFF列ON / OFF 以外
時刻抽出時刻範囲抽出ON/OFFC9ON / OFF 以外
時刻抽出開始時刻C10ON時に数値以外
時刻抽出終了時刻C11開始 > 終了

このように

設定値の整合性を事前にチェックしてから処理を実行する

構造にしました。
なお、実際にはこれ以外にも

  • 行フィルタ条件
  • CSVフォーマット
  • グラフ設定

などについても入力チェックを行っています。



6. アーキテクチャ

実装前に

処理構造

を整理しました。
いきなりコードを書かず、まず処理フローを整理しました。


処理フロー(概略)

RunPipeline()

ReadConfig        '設定シートから設定値を読み込みToolConfig型に格納
ValidateConfig    '設定値の妥当性チェック

ConfirmOverwrite  '出力ファイル上書き確認

ListCsvFiles      '対象CSV一覧取得

PrepareOutputBook '出力Excel生成

For each file

    ParseHeader   'ヘッダ解析
    ReadCsv       'CSV読込
    WriteRows     'データ出力
    UpdateStatus  '進捗表示

Next

CreateCharts      'グラフ生成

Save              '保存

このように

処理構造を先に整理する

ことで

  • 関数分割
  • AIへの指示

がしやすくなりました。


7. 実装とレビュー

実装はAIにコード生成を依頼しました。ただし、

一括生成ではなく

  • サブ関数単位
  • 機能単位

で生成しました。その都度

  • コード理解
  • レビュー
  • 修正

を行いました。


MVP → 公開品質

今回の開発は

  1. MVPコード生成
  2. 公開品質レビュー

という流れで進めました。まず

動くコード

を作り、その後

  • 可読性
  • エラー処理
  • 構造

を改善しました。


RunPipeline 最終構造

最終的にRunPipelineは次の形になりました。

Sub RunPipeline()

    Set ws = ThisWorkbook.Worksheets(SETTING_SHEET_NAME)
    Set errs = New Collection

    Call ReadConfig(ws, cfg, errs)

    If errs.count > 0 Then
        ShowErrors errs
        SetStatus ws, "エラー終了"
        Exit Sub
    End If

    If Not ValidateConfig(cfg, errs) Then
        ShowErrors errs
        SetStatus ws, "エラー終了"
        Exit Sub
    End If

    ExecutePipeline cfg

End Sub

処理本体は

ExecutePipeline

に分離しました。
これにより

ValidateConfigを通さずにテスト実行する

ことも可能にしました。


8. 検証

検証では

機能網羅ではなく

基本機能が正しく動くかを確認しました。


検証方法

検証は、Excel上に検証シートを作成し、以下の情報を管理する形で行いました。

  • 設定値
  • 入力ログ
  • 期待結果

各検証パターンを1行単位で管理し、その内容をもとにツールの動作確認を行っています。

検証シートの画像


検証手順

検証は以下の手順で実施しました。

  1. 設定シートへ値を反映 検証シートに定義した設定値を、ツールの設定シートへ反映します。
  2. VBAでツールを実行 メイン関数 RunPipeline を実行し、CSVログ解析処理を実行します。
  3. 出力結果を確認 出力ファイルが期待結果どおりになっているかを確認します。

テストの自動化

正常系テスト(T01~T06)については、
検証シートを順番に読み込みながら

  • 設定値反映
  • ツール実行

を自動で行うテストラッパーを作成し、自動実行できるようにしました。
なお、最終的な出力結果の妥当性については、
今回の検証では目視で確認しています。


エラー系テスト

エラー系テスト(E01~E02)については、
異常系の挙動を個別に確認するため、上記手順を手動で実行し、結果を確認しました。



9. 振り返りと改善点

今回AIと開発していくつか改善点が見えました。


グローバル変数

AIはセル位置を

Range("C3")

のようにコードに直接書くことがあります。
そのため途中から

  • 設定セル
  • 出力行
  • グラフサイズ

グローバル変数化

しました。
最初から指示した方が良いと感じました。


グラフ仕様

AIの初期提案は

1データ1グラフ

でした。しかし実際には

1グラフ複数系列

の方が使いやすいため変更しました。
グラフ仕様は最初から詳細仕様として提示した方が良いです。


コードスタイルの統一

サブ関数単位でコード生成したため、

  • コメント形式
  • 関数配置
  • 命名

などが統一されないことがありました。
例えば関数の上に

'====================
' ShowRuntimeError
'====================

というコメントがあったり、コメントの書き方が変わったり、
そもそもコメント自体がなかったりしました。
そのため

  • コーディングルール
  • コメント形式
  • 関数順序

などは

最初に指定した方がよい

と感じました。


エラーハンドリング

検証時に

エラー内容が消える問題

がありました。
修正前

On Error Resume Next
If f <> 0 Then Close #f
On Error GoTo 0

Err.Raise Err.Number

Close処理でエラー内容が上書きされる可能性があります。

修正後

Dim errNum As Long
Dim errDesc As String
Dim errSrc As String

errNum = Err.Number
errDesc = Err.Description
errSrc = Err.Source

On Error Resume Next
If f <> 0 Then Close #f
On Error GoTo 0

Err.Raise errNum, errSrc, errDesc

エラー内容を退避してからRaiseすることで問題を回避しました。


まとめ

AIは

  • 仕様整理
  • 設計案
  • コード生成

に非常に役立ちました。
しかし

  • 目的決定
  • 最終判断
  • 検証

は人間が行う必要があります。
AIは

開発者の代わりではなく開発パートナー

として使うのが良いと感じました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です