VBA LT会「自作ライブラリ勉強会」登壇資料
- yuji fukami
- 10月25日
- 読了時間: 6分
更新日:10月25日
概要
Discordコミュニティ 「Excel-Fun.xls*」にて2025年10月25日に開催されたLT会「自作ライブラリ勉強会」にて登壇した内容を本ページでまとめておきます。

【PR】Discordコミュニティ 「Excel-Fun.xls*」について
Excel関係、VBA関係の技術コミュニティです。

Excel-Fun.xls*のYouTubeチャンネル⇒https://www.youtube.com/@excel-fun-xls
登壇内容
「ライブラリ」とは?
今回のLT会のテーマの「ライブラリ」について簡単な筆者の解釈としては「過去に記述したコードなどを部品として使いまわすために保存しておく」ものとおいております。
ちなみに細かい定義からするとライブラリは「自作ライブラリ」と「一般公開ライブラリ」の二種類あるとして、今回は「自作ライブラリ」に関しての説明とします。
個人的主観ですが、VBA以外にpythonなどのライブラリでは一般公開ライブラリが充実しているのに対して、VBAはそのようなライブラリはあまり充実していない、共有されていないイメージです。

「ライブラリ」の種類
VBAで扱うライブラリの種類としては「汎用プロシージャ(汎用関数)」「ユーザーフォーム」「クラスモジュール」の3種類とします。
ちなみにこの時点で混乱を与えないように言葉をしっかりチェックしておくと、
「汎用プロシージャ」など1つ1つを「部品」と呼ぶ
「部品」が集まったものを「ライブラリ」と呼ぶ

「ライブラリ」の目的
「ライブラリ」はどのような目的で構築する、利用するかを3つの柱でまとめておきます。
コーディングの効率化
汎用プロシージャなどの部品を使いまわすことで、VBAコードを1から構築せずに実質のコーディング数を減らすことができる
可読性の向上
部品として流用したコードは何度も流用すると、それらは見慣れたコードとなるのでその分、可読性の高いコードになる
複雑、規模の大きい処理を実現
部品を組み合わせることでより大きい処理、複雑な処理を実現できるようになります

「ライブラリ」を使いこなすには?
上記で説明したようなライブラリを使いこなせるようになるには3つの柱があります。
便利な部品を増やす
汎用プロシージャなどで「よく使うもの」「毎回記述しようとすると思い出すのが大変な処理」などをためておくことで、後々のコーディングがさらに効率化できます。
さらに、以降のコーディングを行う際にすでにある汎用プロシージャなどの部品を変更、修正したりしてそれ以降のコーディングのためにさらに洗練させることも大事です。
部品を管理する
部品が増えれば増えるほど、「探し出す」「思い出す」のが大変になります。そうならないように「どういう場所に保存するか」「探索しやすい、思い出しやすい名前にしておくか」なども重要になります。
すぐに流用できる
流用する際に汎用プロシージャなどのコードをコピーしてくる必要がありますが、このコピー作業(流用作業)を効率的に行うために「階層化フォーム」というツールが存在します。
今回の登壇では「すぐに流用できる」についてのノウハウをメインに話すために、まずはサンプルマクロを紹介して、そのサンプルマクロで使用している汎用プロシージャを「階層化フォーム」を利用してどのように流用できるかを説明します。
階層化フォーム詳細 ⇒ https://www.softex-celware.com/post/ikikaiso2

紹介する部品
今回の登壇では次のような部品を紹介しています。
CopySheets
特定のシートを指定個数分複製する
GetSheets_ExceptOriginSheet
原本シート基準に原本から複製した全シートを取得
ConvOneDrivePath_LocalPath
OneDriveの影響でURLになったファイルパスをローカルパスへ変換
OutputPDFs
複数シートをまとめてPDFとして出力

サンプルの仕組み(1ヶ月分日報作成)
上記の汎用プロシージャを使用しているサンプルマクロの機能の1つ目「1ヶ月分の日報作成」についてです。
①:「設定」シートにて「年」「月」を◀▶ボタンで設定します。
②:「原本」シートに1日分の日報入力のテンプレートが作成されています。
③:「1ヶ月分日報作成」ボタンを押すと、設定した「年」「月」に基づいてその月の日数分のシートを「原本」シートを複製して自動作成されます。
これで1ヶ月分の日報の入力シートが自動作成されます。

「1ヶ月分日報作成」ボタンに登録しているマクロのVBAコードは次のように構築されています。
使用している汎用プロシージャは可読性を高めるために「:=」を利用した名前付き引数として記述されています。
ここでは「CopySheets」と「GetSheets_ExceptOriginSheet」を使用しています。
サンプルの仕組み(日報PDF出力)
入力された日報をPDFとしてまとめて出力します。
①:「日報PDF出力」ボタンを押すと、1ヶ月分のシートが1つのPDFファイルとしてまとめて出力されます。
②:出力されるPDFはブックと同じフォルダ上に「年」「月」をもとに「日報(YYYYMM).pdf」として自動的に名前を設定されて出力されます。

「日報PDF出力」ボタンに登録しているマクロのVBAコードは次のように構築されています。
使用している汎用プロシージャは可読性を高めるために「:=」を利用した名前付き引数として記述されています。
ここでは「ConvOneDrivePath_LocalPath」と「OutputPDFs」を使用しています。
部品(汎用プロシージャ)はアドインから参照している
上記のサンプルマクロ「日報自動作成.xlsm」の2つのマクロ「S_1ヶ月分日報作成」「S_日報PDF出力」では紹介したように4つの部品(汎用プロシージャ)を利用しています。
この汎用プロシージャは自ブック「」内には一切記述していないプロシージャになります。
では「どこに記述して、流用しているのか?」という疑問が出てきますが、このカラクリとして、下記図のようにマクロ付ブック「日報自動作成.xlsm」はアドインファイル「IkiKaiso.xlam」を参照しており、4つの汎用プロシージャは「IkiKaiso.xlam」内に記述してあるものを利用しています。
このようにアドイン「xlam」に部品を記述しておけば、アドインを参照するだけで、その部品をすぐ利用できるようになります。

ただアドインを参照して、汎用プロシージャを流用すると一つ問題が発生します。それは開発したマクロ付ブックはアドインを参照していないと動かないということです。この状態だと開発したマクロ付ブックが自分だけの環境化で使う場合は問題ありませんが、もし依頼者など他人に渡すときは、参照しているアドインも一緒に渡さないといけなくなります。
そうした場合はその依頼者に「このアドインファイルを指定の場所に保存して、参照設定も確認しておいてください」と説明する必要があります。さらにこのアドインファイルには今回の4つの汎用プロシージャ以外に多くの部品を保管しているので、これらの部品を盗まれるなどの危険性もあります。
これを解決するためには、開発したマクロ付ブック内にアドインで参照している汎用プロシージャのコードをすべてコピーしてアドインの参照を解除し、マクロ付ブックを独立して動作するようにしなければなりません。
この作業を一瞬で行えるのが階層化フォームの強みになります。

流用の手順(階層化フォームの使い方)
上記で構築したマクロ付ブックを「日報自動作成.xlsm」というブック名とします。このブックはアドインファイル「IkiKaiso2.xlam」を参照して構築されたとします。
ここから「階層化フォーム」を利用して、「日報自動作成.xlsm」が「IkiKaiso2.xlam」から参照している上記4つの汎用プロシージャをコピーしてきて、「日報自動作成.xlsm」が「IkiKaiso2.xlam」に頼らずに独立して動くようにします。
アドインの参照状態確認

階層化フォームの起動

コピーした汎用プロシージャを貼り付け

アドイン(IkiKaiso2.xlam)の参照解除

参考資料



コメント