[VBA] チームの定型業務を効率化した、確率情報フォーマットツールの開発と実践

## はじめに

こんにちは。
2024年12月に進めた、業務自動化プロジェクトの経験を振り返り、記録として残すためにこの記事を作成します。

私は専門の開発者ではありませんが、私のように「これは非効率だ」と感じる業務に日々向き合い、それを解決しようと奮闘している方々の、ささやかな参考になれば幸いです。

> **※ 本記事に関する注記**
> この記事で紹介するデータとコードは、実際の業務内容を基にしていますが、セキュリティ保護のため、**等級、アイテム名、確率など、すべての情報を架空の内容に再構成し、大幅に簡略化**しています。プロジェクトの本質的な問題解決プロセスを共有することに焦点を当てていますので、その点をご了承いただけますと幸いです。

## 1. プロジェクト概要

-   **プロジェクト名**: 確率型アイテム情報公開用のデータ自動フォーマットツール
-   **目的**: 手作業によるヒューマンエラーを防止し、定型業務の効率を最大化する
-   **使用技術**: `Excel VBA`

## 2. 背景と問題定義：「確率のゼロが一つ増えたら大事件！」

私のチームでは、韓国内の拠点から共有される確率情報を、日本サービスの告知フォーマットに合わせて手作業で加工する必要がありました。

この作業には、大きく3つの問題がありました。

1.  **ヒューマンエラーのリスク**: 確率情報は0.0000001%の誤差も許されない重要なデータです。しかし、元のデータは単純なリスト形式であったのに対し、私たちが公開するフォーマットは複数のアイテムグループを列ごとに並べ、等級ごとにセルを結合する必要があるなど、全く異なる構造でした。この複雑な変換過程で、値を間違って転記したり、小数点を誤入力したりするミスがいつでも起こりうる状況でした。
2.  **非効率な作業プロセス**: 元データのフォーマットは常に一定でしたが、私たちの公開用フォーマットとは大きく異なっていたため、単純なコピー＆ペーストは不可能でした。毎回、目視でデータを確認しながら、手作業でセルを整形・結合する必要があり、多くの時間を費やしていました。
3.  **タイトなスケジュール**: データ共有が遅れることも多く、限られた時間内で正確に作業を完了しなければならないというプレッシャーが常にありました。

これらの問題を解決するため、VBAを用いた本格的な自動化ツールの開発に着手しました。

[demo.mp4（動画サンプル）](https://github.com/HNGSNGGN/vba-probability-table-formatter/raw/main/demo.mp4)
## 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倍になる**という複雑なビジネスルールが存在し、これを手動で計算・入力する作業は新たなヒューマンエラーの温床となり得ました。
-   **解決策**: この問題を二段階で解決しました。
    1.  **表示形式の維持:** まず、`Range.Text`プロパティで元の書式を文字列として読み込み、`NumberFormat`プロパティを動的に生成して、いかなる確率値も正確に再現する基盤を整えました。
    2.  **確率値のシフト機能:** 次に、`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