はじめに
本稿は、2024年12月に実施したExcel VBAによる業務自動化プロジェクトの技術的記録である。
専門の開発者ではない担当者が、現場の非効率な定型業務をいかにして自動化したか、その過程で直面した課題と解決策を共有する。
※ 本記事に関する注記
この記事で紹介するデータとコードは、実際の業務内容を基にしているが、セキュリティ保護のため、等級、アイテム名、確率など、すべての情報を架空の内容に再構成し、大幅に簡略化している。プロジェクトの本質的な問題解決プロセスを共有することに焦点を当てているため、その点を了承されたい。
1. プロジェクト概要
- プロジェクト名: 確率型アイテム情報公開用のデータ自動フォーマットツール
- 目的: 手作業によるヒューマンエラーを防止し、定型業務の効率を最大化する
-
使用技術:
Excel VBA
2. 背景と問題定義:ヒューマンエラーのリスクと手作業の非効率性
チームでは、韓国内の拠点から共有される確率情報を、日本サービスの告知フォーマットに合わせて手作業で加工する必要があった。
この作業には、大きく3つの問題点が存在した。
- ヒューマンエラーのリスク: 確率情報は0.0000001%の誤差も許されない重要データである。しかし、元データは単純なリスト形式であったのに対し、公開用フォーマットは複数のアイテムグループを列ごとに並べ、等級ごとにセルを結合する必要があるなど、全く異なる構造だった。この複雑な変換過程で、値を誤転記したり、小数点を誤入力したりするミスが起こりうる状況であった。
- 非効率な作業プロセス: 元データのフォーマットは常に一定だったが、公開用フォーマットとは大きく異なっていたため、単純なコピー&ペーストは不可能だった。毎回、目視でデータを確認しながら、手作業でセルを整形・結合する必要があり、多くの時間を費やしていた。
- タイトなスケジュール: データ共有が遅れることも多く、限られた時間内で正確に作業を完了しなければならないというプレッシャーが常に存在した。
これらの問題を解決するため、VBAを用いた本格的な自動化ツールの開発に着手した。
3. 開発過程における技術的挑戦と解決策
VBAは初経験だったため、ChatGPTに基本的な文法を問いながら開発を開始した。しかし、実際の業務における複雑な例外ケースは、AIが一度に解決できるものではなかった。最終的には、数多くの試行錯誤を繰り返しながら解決策を見つけ出す必要があった。
Challenge 1: 変わりやすいデータ分割基準の確立
-
課題: 初期には特定の等級名(例:
初級
~究極
)の循環パターンを基準にデータを分割しようとしたが、一部のアイテムデータには特定の等級が存在しない例外ケースがあり、ロジックが容易に破綻した。 -
解決策: データ構造を再分析した結果、アイテムの種類によってデータが常に2つまたは3つの対称的なグループで構成されるという、より本質的なパターンを発見した。最終的に、各ケースに最適化された個別のマクロを作成するアプローチを採用した。
- 2グループのデータ: 全データ行数を2で割って処理するマクロ。
-
3グループのデータ: 全データ行数を3で割って処理するマクロ。
単一のロジックですべての例外を処理しようとするのではなく、データパターンに合った明確なソリューションをそれぞれ提供する方が、より安定的でメンテナンス性も高いという結論に至った。
Challenge 2: VBA環境における日本語の文字化け問題
-
課題: VBAエディタ上で「等級」や「確率」などの日本語文字列を直接使用すると、文字化け(
?
と表示)が発生し、ヘッダー名を正常に認識できなかった。 -
解決策: すべての日本語文字列を
ChrW()
関数と16進数のUnicodeコードポイントに変換する方式を採用した。例えば、「等級」という文字列はChrW(&H7B49) & ChrW(&H7D1A)
のように変換する。これにより、コードの可読性は若干低下したが、いかなる実行環境でも安定して動作する信頼性を確保した。
Challenge 3: 複雑な確率構造の正確な再現
-
課題:
.Value
プロパティでセル値を取得するとExcelが自動的に値を丸めてしまい、データの精度が損なわれた。さらに、特定の職業のユーザーには、対応するアイテムグループの確率が他のグループの2倍になるという複雑なビジネスルールが存在し、これを手動で計算・入力する作業は新たなヒューマンエラーの温床となり得た。 -
解決策: この問題を二段階で解決した。
-
表示形式の維持: まず、
Range.Text
プロパティで元の書式を文字列として読み込み、NumberFormat
プロパティを動的に生成して、いかなる確率値も正確に再現する基盤を整えた。 -
確率値のシフト機能: 次に、
ShiftColumnValues
という追加マクロを実装した。これは、3グループの確率データが入力された列(J, M, Q列)の値を互いに循環させる(shift)ものである。例えば、J列の値をM列へ、M列の値をQ列へ、Q列の値をJ列へと値を移動させる。- なぜこの方式を選んだか? 2倍の確率を直接計算して入力する代わりに、既に存在する確率値を再配置することで元データの完全性を保ち、複雑な計算ロジックなしで迅速に値を調整できるためである。これにより、ユーザーはボタン一つで特定のグループの確率を他のグループの値に簡単に置き換えることができ、複雑な手動調整を完全に自動化した。
-
表示形式の維持: まず、
4. 今後の改善計画
- 翻訳機能の自動化: 現在、元のデータに含まれる韓国語の等級名は、翻訳担当者が手動で日本語に変換している。将来的には、Excelシート上に韓日単語の対応表を設け、マクロがそれを参照して翻訳まで一括で処理する機能の拡張を計画している。
- マクロの統合: 現在、2グループ用と3グループ用のマクロが分離している。これを単一のマクロに統合し、データグループの数を自動で検知して処理するよう改善する計画である。
-
GUIの導入: 今後はVBAの
UserForm
やPythonを活用したGUIを導入し、チームメンバーがより直感的にツールを使えるよう利便性を高めることを検討している。
おわりに
本プロジェクトの結果、確率情報のフォーマット変換作業は完全に自動化された。これにより、担当者の手作業は撤廃され、ヒューマンエラーの潜在的リスクは解消された。副次的に、定型業務にかかる工数も大幅に削減されるという成果が得られた。
この記録が、類似の課題を持つ担当者にとって一つの解決事例となれば、それで十分である。
[GitHub Repository]
https://github.com/HNGSNGGN/vba-probability-table-formatter