Excel VBA超勉強会 第3回「Excel VBAの部品管理」
- yuji fukami
- 2024年12月17日
- 読了時間: 10分
更新日:2024年12月18日
2024年12月6日に開催した勉強会の振り返り記事です。

第1部では、ココナラのExcelカテゴリーで出品を行っている"ながたか"氏に、プラチナランクまでになるまでに行ったノウハウなどを話していただきました。
ながたか氏 Xアカウント:https://x.com/ArctNagataka
ながたか氏 ココナラプロフィール:https://t.co/XBGxRh2f8b
近年、副業が盛んになりココナラの出品者は飽和状態でまさに新規参入が難しい時代であるなか、どのようにしてプラチナランクまで到達したのかを、大変再現性のある内容として話していただいています。
↓録画データ
第2部では、主催の"いき"が「Excel VBAの部品管理」と題して登壇いたしました。
本記事ではこの第2部の内容を文章としてまとめておきます。
↓録画データ
概要
インターネットや書籍等で紹介されているExcel VBA関連のハウツーでは、一部の処理を部品として利用できるものがたくさんあります。しかし、これらの部品の流用・管理のノウハウを紹介しているような情報はほとんどないのが現状で、これら「部品管理のノウハウ」は個人の技量にとどまっている状況です。
今回の勉強会ではこのノウハウを解説しています。
デモンストレーション
登壇の冒頭で実際に部品をフル活用したコーディングをデモンストレーションしました。
「フォルダ選択」「PDF出力」の機能ですが、これらは数分足らずで実装が可能です。
詳しくは録画データを見てみてください。

部品はどのように使うのか? 開発の流れを通して説明
実際のココナラでのExcel VBAの開発請負の流れにおいてVBAの部品がどのように使われるかを解説しました。
開発請負は「仕様検討」→「開発」→「一次納品」→「二次納品」の流れで行われますが、このうち「開発」時に実際にコーディングを行う際に部品を利用します。
部品は「開発用アドイン.xlam」という「xlamファイル」に保管しておき、開発する「マクロ付ブック.xlsm」で「開発用アドイン.xlam」を参照した状態で、部品を利用してコーディングができます。この部品をたくさん用意し有効的に利用すればするほど開発を加速度的に効率化できるようになります。
ただ、「開発用アドイン.xlam」を参照している状態だとそのまま顧客に「マクロ付ブック.xlam」を提供することはできないので、使用した部品のコードを「マクロ付ブック.xlsm」にすべてコピーし、「開発用アドイン.xlam」の参照を解除し、いわば「パッケージ化」を行って納品します。
このパッケージ化は後半で紹介する「階層化フォーム」を利用することで一瞬で可能になります。

部品はどうやって管理?
次に具体的に部品をどのように管理していくのかを解説していきました。
目次は次の通りです。
・部品の種類
・部品はどこに保存するのか
・どのような処理を部品化したらよいか
・たくさん増えた部品をどう管理するか
・簡単に流用してパッケージ化する方法

部品の種類
実際に筆者(いき)が使用している開発用アドイン「IkiAddin.xlam」の中身をもとに部品の種類を紹介しました。部品の種類は大別すると3つに分かれます。
・ユーザーフォーム(カレンダーなど)
・汎用プロシージャ(標準モジュール)
・クラスモジュール
このうち、今回の登壇では「汎用プロシージャ」をメインに解説していきます。

部品はどこに保存するのか
冒頭で筆者の例で示した通り、部品は「xlam」形式のアドインファイルに保存管理しています。
部品の保管場所は簡単な例ではメモ帳(テキストファイ)や、ブラウザ上で共有できるようにNotion、GitHubなどが代表例ですが、今回紹介しているのはアドイン(.xlam)ファイルです。
アドインファイルはローカル上でしか使えないというデメリットがありますが、
・参照してすぐに部品を利用できる
・中身をすぐに追加・変更できる
・リボン登録マクロの追加もできる
・「階層化フォーム」を利用すれば流用しやすい
という数々のメリットがあります。
アドインファイルを自作する場合、すでに起動済みのExcelブックをxlam形式で保存して、「開発」→「Excelアドイン」→「有効なアドイン」でチェックを入れて常に起動するようにできます。そして起動中のブックにおいて、VBEの参照設定でアドインファイルを参照するとアドインファイル内のプロシージャなどを起動中のブックで実行できるようになります。
ちなみに、「階層化フォーム」が入っているアドイン「IkiKaiso.xlam」は私の書籍のサポートページでダウンロードして使用できますので、1からアドインファイルを構築するのが手間な人はこちらを利用してください。「IkiKaiso.xlam」では書籍で紹介している汎用プロシージャも含まれていますし、自由に使用してOKです。

どのような処理を部品化したらよいか
部品化のタイミングはコーディング時に「この処理を毎回記述するのはめんどくさい」と思ったときです。おそらくプログラミング言語の違いを問わずすべての言語でこのような発想に至ることはあると思いますが、具体的にどのような処理が部品化されるかを一部紹介しましました。

例1:ファイル選択処理
ファイル選択処理はApplication.FileDialogを利用して実装ができますが、基準のフォルダパスや、対象の拡張子の設定が毎回記述が面倒です。
これらの設定を引数で与えるだけで実装ができるように部品化しています。

例2:PDF出力処理
PDFの出力処理は対象シートにおいてExportAsFixedFormatメソッドを利用すれば実装可能ですが、出力先のフォルダ、ファイル名などの指定が毎回面倒です。紹介しているコードでは同名のPDFファイルが起動中の場合のエラーメッセージや、出力後に出力先のフォルダを起動するかなども引数で設定できるようになっております。

例3:最終行セルの取得
最終行、最終行セルの取得はExcel VBAでは頻繁に行う処理になってきます。一般的にRangeオブジェクトのEndメソッドを利用した方法がありますがこの方法だと正確に最終行の処理取得ができなくなったりするので、その場合も考慮したような処理を部品として置いてあります。

例4:テキストファイルの読込
テキストファイルの読み込みはEOFを利用したり、ADOデータベースのライブラリを利用した方法がありますが、これらも毎回記述するのは大変面倒になります。また、対象とするテキストファイルの文字コードに応じては別々の処理を必要になってくるので、それを毎回指定する方法も大変だったりします。
汎用プロシージャとして置いてあるInputTextは、対象とするテキストファイルのファイルパスおよびテキストファイルの文字エンコードを指定して、更にそのテキストファイルの中身の区切り文字を指定することで、その中身は二次元配列として変換して返すような処理をまとめています。
ちなみに第二引数の文字エンコードの指定においては、コードを見ていただければわかりますが、独自のEnum(列挙体)を指定することで、簡単に選択して使用することができるようにしてあります。

これらの部品化した汎用プロシージャの具体例を示した上で。具体的に汎用プロシージャ作成においてのコツを4点説明します。
1点目はそのプロシージャ名は思い出しやすいような名前にするというのがありますこれは次章でも解説しております
2点目は設定する引数は機能を欲張りすぎないように必要最小限のものにするってのがあります。
3点目は誰かが公開している部品をそのまま流用するって方法でもOKです。必要に応じて流用した部品は自分用に一部改良することも行ったりします。
4点目はとにかく部品化を自分で行ってみて、部品化する訓練を行うということになります。このような訓練を積むことで、途中のコーティング処理において、「このような処理は部品した方が良い」っていうのがすぐに追いつけるようになります。

たくさん増えた部品をどう管理するか
次に部品の管理において具体的な方法を説明して行きます。部品の保管先は先ほど説明したとうりアドインファイルになるのですがその中での標準モジュールの命名規則、および汎用プロシージャの命名規則等を具体的に解説しています
Excel VBAで“汎用プロシージャ(使い回しできる便利な機能)”を管理するとき、モジュール名で分類しておくと後から探しやすくておすすめです。たとえば以下のようなネーミングルールがあると、どこに何のプロシージャがあるか、ぱっと見で分かりやすくなります。
モジュール名の例
ModArray:配列操作関係
配列を作る、並び替える、検索するなど
ModCell:セル操作関係
セルの値を取得・書き込み、セルの色や書式設定など
ModSheet:シート操作関係
新しいシートを追加、シートをコピー/削除、シート名を変更など
ModFile:ファイル操作関係
ファイルを開く・保存する、テキスト読み込み、ファイル削除など
ModStr:文字列操作関係
文字列の置換・分割・結合、文字数カウントなど
ModDictionary:連想配列の作成・操作関係
配列(特に二次元配列)から連想配列(Dictionary)を作成する処理や、その連想配列を検索・取得・更新する処理など
ModOther:未分類・その他
上記以外の処理や、まだ分類しきれていないプロシージャ
分類のメリット
プロシージャを素早く見つけられるたとえば「セル操作したい」と思ったらModCellだけチェックすればOK。探す時間が短縮でき、効率アップに直結します。
整理整頓がしやすい「どういう操作をするコードか」に応じてモジュールを分けるので、後から見返したときも混乱しにくく、管理が楽です。
汎用プロシージャ開発の参考になるこれから汎用プロシージャをイチから作りたい方も、この分類例を参考に「まずはModArrayとModCellを作ろう」といった形で部品を段階的に増やしていけます。
1つのモジュールにすべてを詰め込んでしまうと、後で「どこに何があったっけ?」と迷いやすくなります。モジュールをカテゴリごとに分類しておけば、メンテナンスやチーム開発でもスムーズに連携できます。
「配列操作用モジュール」「セル操作用モジュール」など、イメージしやすいカテゴリーを先に作っておくと、あとで**「この処理はModFileに入れよう」**と直感的に仕分けできます。自分の開発スタイルに合わせて、必要に応じてさらに細分化するのもOKです。
この分類例を活用して、ぜひ自分だけの“汎用プロシージャ集”を整備してみてください。必要な部品をすぐ呼び出せる環境があると、毎回コードをイチから書く手間が減って、開発効率が大幅に上がりますよ。
次に汎用プロシージャの命名規則について解説します。結論からいうと、「英語の動詞+目的語(V+O)」形式で名前を付けるのがおすすめです。
なぜ英語が便利なのか?
英語だと表現の幅が少ない
たとえば「削除する」を英語で言えばほぼ必ず“Delete”になります。一方、日本語だと「消す」「削除」「消去」「省く」「なくす」など、たくさんの言い方がありますよね。
思い出しやすい・探しやすい
英語だと“Delete”一択なので、あとから“Delete***”で検索すればすぐに関連プロシージャが見つかります。逆に日本語で「消す」と書いたのか「消去」にしたのか、あいまいだと自分でもどれだったか忘れやすいですよね。
命名の具体例
DeleteRow:行を削除する
SaveData:データを保存する
GetUser:ユーザー情報を取得する
CopyFile:ファイルをコピーする
こんなふうに、**“Delete”, “Save”, “Get”, “Copy”**など基本的な動詞を組み合わせるだけで、どんな処理か一目でわかるし、あとで命名を思い出すのもすごく簡単です。
まとめ
動詞+目的語というシンプルな英語表現に統一すると、命名で迷わない・探しやすい・分かりやすい、とメリットが多いです。
日本語だと表現揺れが大きいので、汎用プロシージャの再利用やコード検索が面倒になる場合もあります。
もちろん英語が苦手という方もいるかもしれませんが、主要な動詞だけでも覚えておけば命名がぐっと楽になりますよ。

簡単に流用してパッケージ化する方法
アドインファイルで利用した範囲をプロシージャの一括コピーとマクロ付ブックのパッケージ化は上記でも説明した通り階層化フォームで可能になります。
階層化フォームダウンロード先→→ https://gihyo.jp/book/2024/978-4-297-14023-6/support
詳細の使いかたは録画データの最後の方でも行っていますので、そちらで確認してみてください。

Comments