Excelグラフの系列追加・範囲更新をVBAで一括化|実務エラーをきっかけに止まりにくい設計へ

Excelグラフへ複数の系列を追加したり、既存系列の参照範囲を更新したりする作業を、設定に基づいてまとめて実行するExcel VBAツールを作成しました。

この記事では、ツールの機能だけでなく、実務投入時に処理が止まった経験から、既存データに想定外の状態があっても全体を止めにくい設計へ見直し、回帰テストを経てGitHubで一般公開するまでの過程を紹介します。

公開したツール

今回作成した「Excelグラフ系列一括追加・範囲更新ツール」は、GitHubで公開しています。

利用する際は、元のExcelファイルを複製し、意図した系列が追加・更新されることを確認してから実務へ適用してください。

Excelグラフの系列を一つずつ設定していた

Excelのグラフへ複数の系列を追加する場合、系列ごとにX値・Y値・系列名などを指定する必要があります。

一度だけなら手作業でも対応できます。しかし、規則的に並んだ多数のデータをグラフへ追加するときや、データ行が増えるたびに既存系列の参照範囲を更新するときは、同じような設定を何度も繰り返すことになります。

この作業を減らすため、データシート上のX列とY列の並びを規則として読み取り、対象となる系列を自動検出して処理するツールを作成しました。

設定に基づき、追加と更新をまとめて実行する

ツールブックの設定シートで、データシート名、開始列、データ開始行などを指定します。実行時には、処理対象ブックでグラフを1つ選択し、そのグラフに対して処理を行います。条件に合うX列・Y列の組み合わせを検出し、選択中のグラフへ反映します。

実行モードは、用途に応じて次の3種類に分けました。

  • 追加のみ:検出した系列を新規追加する
  • 既存範囲更新のみ:既存系列の参照範囲だけを更新する
  • 更新してから追加:既存系列を更新し、未登録の系列を追加する

これにより、新しい系列をまとめて追加したい場合と、既存グラフの参照範囲だけを伸ばしたい場合を、同じツールで扱えるようにしました。

以下は、30行のX/Yデータを3系列として追加した実行例です。規則的に並んだ列を検出し、選択中のグラフへまとめて反映しています。

30行のX/Yデータから3系列を追加したExcelグラフ
30行のX/Yデータから3系列をまとめて追加した実行例

実務投入で、処理全体が止まった

ツールを実務で使った際、既存系列を含むグラフでエラーが発生し、新規系列が一つも追加されない状態になりました。調査の結果、追加前に行っていた既存系列の解析が、処理中断につながる構造になっていることが分かりました。

当初は「追加のみ」であれば、既存系列の状態は関係しないと考えていました。しかし、実装では追加前に既存系列を解析していたため、解析できない系列に遭遇すると、追加処理へ進む前に全体が止まる構造になっていました。

ここで重要だったのは、目の前のエラーだけを回避するのではなく、その実行モードで本当に必要な情報は何かを整理し直すことでした。

小さなケースを作り、処理中断を再現した

実務ファイルだけを見ながら原因を追うと、系列数、参照範囲、データ量など多くの条件が混ざります。そこで、少数の系列だけを持つ小さなExcelファイルを用意し、既存系列の参照を解析できない状態を再現しました。

再現試験では、既存系列が参照していたシートを削除し、壊れた系列参照を残した状態で修正前の処理を実行しました。その結果、「追加のみ」でも既存系列の解析中にエラーとなり、新規系列が追加されない挙動を再現できました。

なお、これは実務で発生したエラーの直接原因が「削除済みシート」だったと断定するものではありません。実務では既存系列を含むグラフでエラーが発生し、調査では解析不能な既存系列を持つ小さなケースによって、同じ処理中断の構造を確認した、という切り分けです。

モードごとに、必要な処理だけを行う設計へ変更した

原因の切り分け後、実行モードごとの役割を整理して処理を見直しました。

「追加のみ」では既存系列を解析しない

新規系列を追加するだけなら、既存系列との照合は不要です。

そこで「追加のみ」では、既存系列を一切解析せず、検出した系列をそのまま追加するように変更しました。これにより、既存系列の中に解析できない参照が含まれていても、追加処理そのものは進められます。

ただし、既存系列と照合しないため、同じグラフで再実行すると重複系列が追加される可能性があります。この点は、モードの仕様としてREADMEに明記しています。

更新系モードでは、問題のある系列だけをスキップする

「既存範囲更新のみ」と「更新してから追加」では、既存系列の解析が必要です。

一方で、一つの系列を解析できないだけで処理全体を中断すると、正常な系列まで更新できません。そこで、解析できない既存系列は警告として記録してスキップし、ほかの系列の処理は継続するようにしました。

外部ブック参照を同名のローカルシートとして誤認しないための見直しや、オブジェクトが取得できなかった場合の判定処理も加えています。

実行ログでは、解析できなかった既存系列を「WARN/スキップ」として記録し、その後も正常な系列の追加処理が続いていることを確認できます。

解析不能な既存系列をWARNでスキップした実行ログ
解析不能な既存系列をWARNでスキップし、正常な系列の処理を継続した実行ログ

なお、警告としてスキップした既存系列自体を、自動的に修復・削除する機能ではありません。「更新してから追加」では、壊れた系列を残したまま新しい系列が追加される場合もあるため、実行後にログとグラフを確認し、不要な既存系列は手作業で整理します。

以下は、同じ5行のX/Yデータを使った再現ブックの実行前後です。実行前は壊れた既存系列1本が残った状態で、修正版の「追加のみ」を実行すると、データ自体を変えずに3系列が追加され、系列数は1本から4本になりました。

壊れた既存系列を含む修正版実行前のExcelグラフ

修正版実行前:壊れた既存系列を含む再現グラフ

同じ5行データから3系列を追加した修正版実行後のExcelグラフ

修正版実行後:同じ5行データから3系列を追加

4つの回帰テストで修正後の挙動を確認した

修正後は、少数系列の再現ブックを使い、次の4ケースを確認しました。

  1. 削除済みシート参照がある状態で「追加のみ」
  2. 削除済みシート参照がある状態で「既存範囲更新のみ」
  3. 削除済みシート参照がある状態で「更新してから追加」
  4. 壊れた外部リンクがある状態で「追加のみ」

「追加のみ」では既存系列の状態にかかわらず新規系列を追加でき、更新系モードでは解析不能な系列だけを警告としてスキップし、処理を継続できることを確認しました。

再現条件と確認結果は、GitHubリポジトリ内の回帰テスト記録にまとめています。

実務で直したツールを、公開可能な資産へ整える

実務上の問題を修正した後、コードだけでなく、第三者が内容を確認して試せる状態まで整えました。

  • 配布用Excelファイルへ修正版VBAを反映
  • READMEとサンプルを整備
  • 実行モードごとの挙動と注意点を明記
  • 回帰テストの条件と結果を文書化
  • MIT Licenseを追加
  • 配布ブックの個人メタデータを除去
  • 公開用のGit履歴と作者情報を整理

実務で一度動いたコードをそのまま置くだけでなく、使用条件、注意点、確認した範囲を残すことで、公開後も扱いやすい成果物にしました。

今回の改善から得た考え方

今回の経験から、汎用ツールを実務へ入れるときには、次の考え方が重要だと感じました。

必要のない情報には触れない

「追加のみ」のように既存系列の解析が不要なモードでは、解析処理そのものを行わない方が安全です。念のため取得した情報が、かえって新しい障害点になることがあります。

一部の異常で全体を止めない

対象が複数ある一括処理では、一件の異常が全件の失敗になる設計が常に適切とは限りません。問題のある対象を明示してスキップし、処理を継続する方が実務に合う場合があります。

実務障害は小さく再現してから直す

複雑な実務ファイルのままでは、何が原因か判断しにくくなります。条件を絞った小さなケースを作り、修正前後の挙動を記録することで、変更の効果を確認しやすくなります。

まとめ

Excelグラフの系列追加・範囲更新を一括化するところから始まったツールでしたが、実務投入によって、既存データに想定外の状態があると処理全体が止まる課題が見つかりました。

そこで、実行モードごとの責任を整理し、不要な解析を行わず、解析不能な系列があっても必要な処理を継続できる設計へ変更しました。さらに、小さな再現ケースと回帰テストで挙動を確認し、READMEや利用上の注意とともにGitHubで公開しています。

同じように、既存のExcelファイルを対象とする一括処理を作る際の参考になれば幸いです。


Excelグラフ・VBA業務の改善に関するご相談

既存のExcelグラフやVBAツールを生かしながら、系列追加・範囲更新などの繰り返し作業を減らしたい、といったご相談にも応じています。

すべてを作り直すことを前提にせず、現在のファイルや運用を確認しながら、どこまで自動化すると効果があるかを一緒に整理します。

ご相談は、お問い合わせページからご連絡ください。

コメントを残す

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