この記事でわかること
- マクロブック(.xlsm)をアドイン(.xlam)として保存し、全ブックから使えるようにする手順
- xlamファイルを自動でアドインフォルダにコピー+登録するインストーラーの作り方
- バージョンチェック+リボンボタン連携+アンインストール機能を備えた配布パッケージの実務コード
どんな場面で使う?
- チームで共通のマクロを使いたいが、毎回xlsmファイルを配布するのが面倒なとき
- 自作マクロを全ブック共通で使えるようにアドイン化したいとき
- マクロのバージョン管理と自動更新の仕組みを作りたいとき
- インストーラー付きで誰でも簡単にマクロを導入・アンインストールできるようにしたいとき
完成イメージ(Before / After)
Before(手作業で配布):
マクロ入りのxlsmファイルを共有フォルダに置く → 使う人が毎回そのファイルを開く → ファイルを閉じるとマクロが使えなくなる → バージョンアップのたびに「新しいファイルに差し替えて」と連絡
After(アドインで配布):
インストーラーを実行 → アドインが自動登録される → どのブックを開いてもマクロが使える → バージョンアップ時はインストーラーを再実行するだけで自動更新

自分も以前、同じ部署の人にマクロを配布したことがある。そのとき相手のパソコンだけExcelやWindowsの言語設定が違い、ファイルを開くときのパス指定が微妙に変わっていて、そこでかなり苦労した。
自分のPCでは問題なく動くのに、配布先では保存場所やユーザー名、アドインフォルダの扱いが少し違うだけで止まる。配布用マクロでは、C:\Users\名前\... のような固定パスを直接書くより、ThisWorkbook.Path、Application.UserLibraryPath、Environ("APPDATA") のように環境差を吸収できる書き方を選ぶことが大事だと感じた。
この記事では、単に .xlam に保存するだけでなく、同じ部署の人にも渡しやすいように、インストーラー形式・更新・アンインストールまで含めて整理する。
アドイン(.xlam)にすれば、マクロが常にバックグラウンドで読み込まれ、どのブックを開いても使える状態になる。
なお、マクロの基本的な実行方法は マクロをボタン1つで実行する方法 を参照。マクロを複数のSubに分割する方法は マクロから別のマクロを呼び出して処理を分割する方法 も参考になる。
今回の検証条件と配布前チェック
この記事では、マクロ入りブックをxlam形式で保存し、自分のExcelに登録して動作確認する流れと、利用者へ配布するときに確認すべき項目を分けて整理しています。
| 確認したこと | 結果 | 記事内での判断 |
|---|---|---|
| .xlsmから.xlamへ保存 | アドイン形式として登録できる | まず手動登録で動作確認する |
| 登録後にマクロを実行 | リボンやショートカットから呼び出す設計が必要 | 利用者の起動方法を先に決める |
| 更新版の配布 | 使用中ファイルは上書きできない | バージョン確認と更新手順を用意する |
| 社内配布 | セキュリティ設定でブロックされる場合がある | 信頼できる場所や署名の方針を確認する |
Beforeは、個人の.xlsmに便利マクロが散らばっている状態です。Afterは、共通機能を.xlamにまとめ、同じツールを複数人で使える状態です。
実行前の準備
バックアップを取る
アドイン化する前のxlsmファイルを必ず別フォルダに保存しておく。xlam形式で保存するとシートが非表示になるため、元のxlsmを残しておかないとシート上のデータが参照できなくなる。
xlam配布・xlsm配布・個人用マクロブックの判断基準
アドイン化は便利ですが、すべてのマクロをxlamにする必要はありません。配布人数、更新頻度、利用者の操作方法で選ぶと失敗しにくいです。
| 状況 | 向いている形 | 理由 |
|---|---|---|
| 自分だけが使う小さなマクロ | 個人用マクロブックまたは.xlsm | 配布や更新の管理が不要 |
| チームで同じ便利機能を使う | .xlamアドイン | 機能をまとめて配布しやすい |
| 帳票テンプレートと一緒に使う | .xlsmテンプレート | ファイル単位で完結し、利用者が迷いにくい |
| 更新が多い社内ツール | バージョンチェック付きアドイン | 古い版の利用を減らせる |
自分なら、まず.xlsmで運用して、複数人が同じ機能を使い始めた段階でxlamへ切り替えます。アドイン化は「配る価値がある」と分かってからでも遅くありません。
手順(基本版 — 手動でアドイン化・登録)
Step 1: アドイン化したいマクロブック(.xlsm)を開く
- 配布したいマクロが入ったxlsmファイルを開く
Step 2: xlam形式で保存する
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を「Excelアドイン (*.xlam)」に変更
- 保存先がアドインフォルダ(
C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns)に自動で切り替わる - ファイル名を付けて保存(例:
MyTools.xlam)
Step 3: アドインを有効にする
- Excelで「ファイル」→「オプション」→「アドイン」
- 下部の「管理」が「Excelアドイン」になっていることを確認し、「設定」をクリック
- 一覧に保存したアドイン名が表示される → チェックを入れて「OK」
Step 4: 動作確認
- 新しいブックを開く
Alt + F8でマクロ一覧を表示- アドインのマクロが表示されれば成功
注意: アドインのマクロが一覧に表示されない場合は、SubプロシージャがPrivateになっていないか確認する。
Public Subにする必要がある。
コード(基本版 — VBAでxlam保存+アドイン登録)
手動の手順をVBAで自動化する最小構成。現在のブックをxlamとして保存し、アドインに登録する。
貼り付け場所: 標準モジュール(アドイン化したいxlsmブック内)
Option Explicit
Sub ExportAsAddin()
Dim addinPath As String
Dim addinName As String
addinName = "MyTools.xlam" '← アドインのファイル名
'--- アドインフォルダのパスを取得
addinPath = Environ("APPDATA") & "\Microsoft\AddIns\" & addinName
'--- xlam形式で保存
Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=addinPath, FileFormat:=xlOpenXMLAddIn
Application.DisplayAlerts = True
'--- アドインとして登録
Dim ai As AddIn
Set ai = Application.AddIns.Add(Filename:=addinPath)
ai.Installed = True
MsgBox "アドインを登録しました。" & vbCrLf & addinPath, vbInformation
End Sub

コード(実務版 — 自動インストーラー+バージョンチェック+リボン連携+アンインストール)
配布先のユーザーがインストーラーマクロを実行するだけで、アドインのコピー・登録・バージョン更新が完了する構成。アンインストール機能も付属。
自分はこのインストーラーをチームの共有フォルダに置いて運用している。「新しいバージョン出たよ」とチャットで伝えるだけで、各自がインストーラーを実行して更新完了。バージョン管理の手間がほぼゼロになった。
ファイル構成
共有フォルダ/
├─ MyTools.xlam ← 配布するアドイン本体
└─ Installer.xlsm ← インストーラー(以下のコードを貼り付ける)
アドイン本体(MyTools.xlam)に入れるコード
貼り付け場所: MyTools.xlamの標準モジュール
Option Explicit
'===================================================
' アドイン本体 — バージョン情報+公開マクロ
'===================================================
Public Const ADDIN_NAME As String = "MyTools"
Public Const ADDIN_VERSION As String = "1.0.0"
'--- アドインから呼び出せるマクロ(例)
Public Sub MyToolsSample()
MsgBox "MyTools アドイン v" & ADDIN_VERSION & " が動作しています。", vbInformation
End Sub
'--- バージョン取得用(インストーラーから呼ばれる)
Public Function GetAddinVersion() As String
GetAddinVersion = ADDIN_VERSION
End Function
インストーラー(Installer.xlsm)に入れるコード
貼り付け場所: Installer.xlsmの標準モジュール
Option Explicit
'===================================================
' インストーラー — 実務版
' アドインのコピー・登録・バージョンチェック・アンインストール
'===================================================
'--- 定数(環境に合わせて変更) ----------------------
Private Const ADDIN_FILENAME As String = "MyTools.xlam"
Private Const ADDIN_VERSION As String = "1.0.0" '← 配布バージョン
'----------------------------------------------------
'--- アドインフォルダのパスを返す
Private Function GetAddinFolder() As String
GetAddinFolder = Environ("APPDATA") & "\Microsoft\AddIns\"
End Function
'--- インストール先のフルパスを返す
Private Function GetAddinFullPath() As String
GetAddinFullPath = GetAddinFolder() & ADDIN_FILENAME
End Function
'--- 配布元のフルパスを返す(インストーラーと同じフォルダにxlamがある前提)
Private Function GetSourcePath() As String
GetSourcePath = ThisWorkbook.Path & "\" & ADDIN_FILENAME
End Function
'=== メイン: インストール ==============================
Public Sub InstallAddin()
On Error GoTo ErrHandler
Dim sourcePath As String: sourcePath = GetSourcePath()
Dim destPath As String: destPath = GetAddinFullPath()
'--- 配布元ファイルの存在チェック
If Dir(sourcePath) = "" Then
MsgBox "配布ファイルが見つかりません。" & vbCrLf & _
sourcePath, vbCritical
Exit Sub
End If
'--- 既存バージョンのチェック
Dim currentVer As String
currentVer = GetInstalledVersion()
If currentVer <> "" Then
If currentVer = ADDIN_VERSION Then
Dim ans As VbMsgBoxResult
ans = MsgBox("同じバージョン(v" & ADDIN_VERSION & ")が既にインストールされています。" & vbCrLf & _
"上書きしますか?", vbYesNo + vbQuestion)
If ans = vbNo Then Exit Sub
Else
MsgBox "バージョンを更新します。" & vbCrLf & _
"現在: v" & currentVer & " → 新規: v" & ADDIN_VERSION, vbInformation
End If
'--- 既存アドインを無効化してから上書き
UnregisterAddin
End If
'--- アドインフォルダにコピー
FileCopy sourcePath, destPath
'--- アドインとして登録
Dim ai As AddIn
Set ai = Application.AddIns.Add(Filename:=destPath)
ai.Installed = True
MsgBox "インストールが完了しました。" & vbCrLf & _
"アドイン: " & ADDIN_FILENAME & " v" & ADDIN_VERSION & vbCrLf & _
"場所: " & destPath, vbInformation
Exit Sub
ErrHandler:
MsgBox "インストール中にエラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
Err.Description, vbCritical
End Sub
'=== アンインストール ================================
Public Sub UninstallAddin()
On Error GoTo ErrHandler
Dim destPath As String: destPath = GetAddinFullPath()
'--- アドインが存在するか確認
If Dir(destPath) = "" Then
MsgBox "アドインがインストールされていません。", vbExclamation
Exit Sub
End If
Dim ans As VbMsgBoxResult
ans = MsgBox("アドインをアンインストールしますか?" & vbCrLf & _
ADDIN_FILENAME, vbYesNo + vbQuestion)
If ans = vbNo Then Exit Sub
'--- アドインを無効化
UnregisterAddin
'--- ファイルを削除
On Error Resume Next
Kill destPath
On Error GoTo ErrHandler
If Dir(destPath) = "" Then
MsgBox "アンインストールが完了しました。", vbInformation
Else
MsgBox "ファイルの削除に失敗しました。Excelを閉じてから手動で削除してください。" & vbCrLf & _
destPath, vbExclamation
End If
Exit Sub
ErrHandler:
MsgBox "アンインストール中にエラーが発生しました。" & vbCrLf & _
"エラー番号: " & Err.Number & vbCrLf & _
Err.Description, vbCritical
End Sub
'=== バージョン確認 ==================================
Public Sub CheckVersion()
Dim currentVer As String
currentVer = GetInstalledVersion()
If currentVer = "" Then
MsgBox "アドインがインストールされていません。", vbExclamation
Else
Dim msg As String
msg = "インストール済みバージョン: v" & currentVer & vbCrLf & _
"配布バージョン: v" & ADDIN_VERSION
If currentVer = ADDIN_VERSION Then
msg = msg & vbCrLf & vbCrLf & "最新バージョンです。"
MsgBox msg, vbInformation
Else
msg = msg & vbCrLf & vbCrLf & "新しいバージョンがあります。InstallAddinを実行してください。"
MsgBox msg, vbExclamation
End If
End If
End Sub
'=== 内部ユーティリティ ==============================
'--- インストール済みアドインのバージョンを取得
Private Function GetInstalledVersion() As String
On Error Resume Next
Dim ver As String
ver = Application.Run(ADDIN_FILENAME & "!GetAddinVersion")
On Error GoTo 0
GetInstalledVersion = ver
End Function
'--- アドインの登録を解除する
Private Sub UnregisterAddin()
On Error Resume Next
Dim ai As AddIn
For Each ai In Application.AddIns
If LCase(ai.Name) = LCase(ADDIN_FILENAME) Then
ai.Installed = False
Exit For
End If
Next ai
'--- 開いているブックとしても閉じる
Dim wb As Workbook
For Each wb In Application.Workbooks
If LCase(wb.Name) = LCase(ADDIN_FILENAME) Then
wb.Close SaveChanges:=False
Exit For
End If
Next wb
On Error GoTo 0
End Sub
リボンボタンとの連携
アドインのマクロをリボンから実行するには、マクロにショートカットキーを割り当てて素早く実行する方法 のショートカット割り当てか、Custom UI Editor(無料ツール)でリボンXMLを追加する方法がある。
簡易的にリボンのクイックアクセスツールバーに追加する手順:
- 「ファイル」→「オプション」→「クイックアクセスツールバー」
- 「コマンドの選択」を「マクロ」に変更
- アドインのマクロ(例:
MyToolsSample)を選択して「追加」 - 「OK」で確定

実務で起きやすいアドイン配布の失敗例
失敗例1: 利用者がどこから実行するか決まっていない
xlamにしただけでは、利用者が迷わず使えるとは限りません。リボン、ショートカット、ボタンなど、起動方法まで決めてから配布します。
失敗例2: 旧バージョンが残って動きが揃わない
利用者ごとに古いxlamが残ると、同じ操作でも結果が違うことがあります。バージョン番号を表示する、起動時に最新版を確認するなどの仕組みが必要です。
失敗例3: セキュリティ設定で読み込めない
メール添付やダウンロードしたマクロはブロックされることがあります。社内配布では、信頼できる場所、署名、配布フォルダの方針を事前に確認します。
落とし穴
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | xlamで保存したらシートが見えなくなった | xlam形式ではシートが自動的に非表示になる仕様 | xlam保存前に元のxlsmファイルを別名で保存しておく。xlamを編集するときはVBEから開く |
| 2 | アドインのマクロが Alt + F8 の一覧に出てこない |
SubがPrivateになっている、またはアドインが有効化されていない | Subに Public を付ける。「ファイル」→「オプション」→「アドイン」でチェックが入っているか確認 |
| 3 | インストーラーで「ファイルが使用中です」エラーが出る | 既存のアドインがExcelに読み込まれた状態でファイルを上書きしようとしている | UnregisterAddin でアドインを無効化+ブックを閉じてからコピーする(実務版は対応済み) |
| 4 | 他のPCにアドインを持っていったら動かない | アドイン内で ThisWorkbook.Path を使ってファイルパスを組み立てている |
アドイン内のパスは Environ("APPDATA") や Application.DefaultFilePath を使う。固定パスは避ける |
| 5 | アドインを更新したのに古いバージョンが動く | Excelがアドインをメモリにキャッシュしている | Excelを完全に終了(タスクマネージャーで確認)してからインストーラーを再実行する |
| 6 | Application.Run でアドインの関数を呼ぶとエラーになる |
アドインのファイル名にスペースや括弧が含まれている | ファイル名はスペースなし・英数字のみにする(例: MyTools.xlam)。Application.Run("'My Tools.xlam'!GetVersion") のようにシングルクォートで囲む方法もある |
自分もアドインを上書きしようとして「ファイルが使用中です」エラーで30分溶かしたことがある。Excelが裏でアドインを掴んでいるので、先に Installed = False にしてブックを閉じないとコピーできない。
VBAのアドインがAlt+F8の一覧に出ないときの対処法
「xlamを登録したのにマクロ一覧にSubが表示されない」場合、SubにPublicが付いていないか、Excelのアドイン設定でチェックが入っていないことが原因だ。SubにPublicキーワードを明示的に付け、「ファイル」→「オプション」→「アドイン」で該当アドインにチェックが入っているか確認しよう。
VBAのアドイン更新で「ファイルが使用中」エラーが出るときの対処法
「新しいバージョンのxlamで上書きしようとするとエラーが出る」場合、Excelがアドインをメモリに読み込んだまま掴んでいることが原因だ。AddIns("アドイン名").Installed = Falseでアドインを無効化し、ブックを閉じてからファイルをコピーしよう。Excelを完全に終了してから上書きするのが確実だ。
FAQ
Q1. アドインのコードを修正したい場合はどうする?
元のxlsmファイルで修正→テスト→再度xlamとして保存する流れが安全。xlamファイルを直接編集することもできるが、VBE(Alt + F11)からしか操作できないため、デバッグがしにくい。
参照設定の違いでトラブルになることがあるため、参照設定については 参照設定と実行時バインディング(CreateObject)の使い分け方 を確認しておくとよい。
Q2. アドインに参照設定は引き継がれる?
引き継がれる。ただし、配布先のPCに同じライブラリがインストールされていないと「参照不可」エラーになる。配布用のアドインでは CreateObject による実行時バインディングを推奨する。
Q3. アドインのマクロをセルのボタンから実行するには?
ボタンのOnActionにアドインのマクロ名を直接指定する。
Sub AddButton()
Dim btn As Button
Set btn = ActiveSheet.Buttons.Add(100, 100, 120, 30)
btn.Caption = "MyTools実行"
btn.OnAction = "MyToolsSample" '← アドインのPublic Sub名
End Sub
ボタン設置の詳しい方法は マクロをボタン1つで実行する方法 を参照。
Q4. 複数のアドインを管理するには?
アドインごとにファイルを分ける。インストーラーの定数 ADDIN_FILENAME を変更するだけで、同じインストーラーの仕組みを使い回せる。
Q5. xlam以外のアドイン形式(xlaなど)は使うべき?
.xla はExcel 2003以前の形式。Excel 2016以降では .xlam(XML形式)を使うのが標準。xlamのほうがファイルサイズが小さく、セキュリティ機能も充実している。
まとめ
この記事では、VBAマクロをアドイン(.xlam)にして全ブックから利用可能にする方法を解説した。
- 基本版 — xlam形式で保存し、Excelのアドイン設定から有効化する手動手順+VBAコード
- 実務版 — 自動インストーラーでコピー・登録・バージョンチェック・アンインストールまで対応
マクロの配布とバージョン管理がインストーラー1つで完結する。
関連記事:
- 参照設定と実行時バインディング(CreateObject)の使い分け方 — 配布用アドインでCreateObjectを使うべき理由
- マクロから別のマクロを呼び出して処理を分割する方法 — アドイン内のコードをモジュール分割する方法
- マクロにショートカットキーを割り当てて素早く実行する方法 — アドインのマクロをショートカットで実行する方法
次にやりたくなること
- マクロをボタン1つで実行する方法 — アドインのマクロをシート上のボタンに割り当てて、ユーザーがワンクリックで実行できるようにしたい場合に
- 参照設定と実行時バインディング(CreateObject)の使い分け方 — 配布先のPCで「参照不可」エラーが出ないように、CreateObjectで安全にオブジェクトを生成したい場合に
- ブックを開いたとき・保存時に自動実行するイベント処理の方法 — アドインのWorkbook_Openイベントで初期化処理を自動実行したい場合に
次に読むと理解しやすい関連記事
- VBAを動かす初期設定 – 配布前にマクロ有効化や保存形式を確認できます。
- マクロ実行ボタンの作り方 – アドイン化する前に操作ボタンを整えたい場合に使えます。
- VBAの自動テストを作る方法 – 配布前の動作確認を仕組み化できます。


コメント