【Excel VBA】マクロをアドイン(.xlam)にして配布する方法(コピペOK)

【VBA】マクロをアドイン(.xlam)にして配布する方法の解説用アイキャッチ画像 VBA

この記事でわかること

  • マクロブック(.xlsm)をアドイン(.xlam)として保存し、全ブックから使えるようにする手順
  • xlamファイルを自動でアドインフォルダにコピー+登録するインストーラーの作り方
  • バージョンチェック+リボンボタン連携+アンインストール機能を備えた配布パッケージの実務コード

どんな場面で使う?

  • チームで共通のマクロを使いたいが、毎回xlsmファイルを配布するのが面倒なとき
  • 自作マクロを全ブック共通で使えるようにアドイン化したいとき
  • マクロのバージョン管理と自動更新の仕組みを作りたいとき
  • インストーラー付きで誰でも簡単にマクロを導入・アンインストールできるようにしたいとき

完成イメージ(Before / After)

Before(手作業で配布):

マクロ入りのxlsmファイルを共有フォルダに置く → 使う人が毎回そのファイルを開く → ファイルを閉じるとマクロが使えなくなる → バージョンアップのたびに「新しいファイルに差し替えて」と連絡

After(アドインで配布):

インストーラーを実行 → アドインが自動登録される → どのブックを開いてもマクロが使える → バージョンアップ時はインストーラーを再実行するだけで自動更新

VBAマクロをxlsm手作業配布からxlamアドイン配布に変えるBefore After
xlsmを手作業で渡す運用から、xlamアドインとして登録する運用へ変えます。

自分も以前、同じ部署の人にマクロを配布したことがある。そのとき相手のパソコンだけExcelやWindowsの言語設定が違い、ファイルを開くときのパス指定が微妙に変わっていて、そこでかなり苦労した。

自分のPCでは問題なく動くのに、配布先では保存場所やユーザー名、アドインフォルダの扱いが少し違うだけで止まる。配布用マクロでは、C:\Users\名前\... のような固定パスを直接書くより、ThisWorkbook.PathApplication.UserLibraryPathEnviron("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)を開く

  1. 配布したいマクロが入ったxlsmファイルを開く

Step 2: xlam形式で保存する

  1. 「ファイル」→「名前を付けて保存」
  2. ファイルの種類を「Excelアドイン (*.xlam)」に変更
  3. 保存先がアドインフォルダ(C:\Users\ユーザー名\AppData\Roaming\Microsoft\AddIns)に自動で切り替わる
  4. ファイル名を付けて保存(例: MyTools.xlam

Step 3: アドインを有効にする

  1. Excelで「ファイル」→「オプション」→「アドイン」
  2. 下部の「管理」が「Excelアドイン」になっていることを確認し、「設定」をクリック
  3. 一覧に保存したアドイン名が表示される → チェックを入れて「OK」

Step 4: 動作確認

  1. 新しいブックを開く
  2. Alt + F8 でマクロ一覧を表示
  3. アドインのマクロが表示されれば成功

注意: アドインのマクロが一覧に表示されない場合は、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
VBAアドインのインストーラーが共有フォルダからAddInsフォルダへコピーして登録する流れ
インストーラーで、アドイン本体のコピー・登録・有効化をまとめて行います。

コード(実務版 — 自動インストーラー+バージョンチェック+リボン連携+アンインストール)

配布先のユーザーがインストーラーマクロを実行するだけで、アドインのコピー・登録・バージョン更新が完了する構成。アンインストール機能も付属。

自分はこのインストーラーをチームの共有フォルダに置いて運用している。「新しいバージョン出たよ」とチャットで伝えるだけで、各自がインストーラーを実行して更新完了。バージョン管理の手間がほぼゼロになった。

ファイル構成


共有フォルダ/
  ├─ 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を追加する方法がある。

簡易的にリボンのクイックアクセスツールバーに追加する手順:

  1. 「ファイル」→「オプション」→「クイックアクセスツールバー」
  2. 「コマンドの選択」を「マクロ」に変更
  3. アドインのマクロ(例: MyToolsSample)を選択して「追加」
  4. 「OK」で確定
VBAアドインを部署内に配布する前のチェックリスト
配布先PCの言語設定やパス差、参照設定、バージョン更新の確認ポイントです。

実務で起きやすいアドイン配布の失敗例

失敗例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の自動テストを作る方法 – 配布前の動作確認を仕組み化できます。


次に読みたい関連記事

コメント

タイトルとURLをコピーしました