VBScriptで始めるExcelアドイン入門 — 自動作成・インストール・実行まで

以下は 上級者向け に書いた、VBScriptを使ってExcelアドイン(.xlam / .xla相当)を作成・インストール・呼び出す方法の解説記事です。

実際に動かせるサンプルコード、手順、注意点、演習問題とその解答例まで含めています。

この記事だけで「動くアドインを作る」を目標にしています。


Excelアドインとは

Excelアドインは、Excel に機能を追加するためのパッケージ(拡張機能)です。

追加された機能はリボンのボタン、ユーザ定義関数(UDF)、ショートカット、イベントハンドラなどのかたちで利用できます。

アドインを入れることで、毎回同じ処理を手作業で行う必要がなくなり、業務の自動化や共有が容易になります。

VBScriptとExcelアドインの関係

VBScript(.vbs)はWindows上で動く軽量スクリプト言語で、COMを通してExcelを操作できます。

Excelの「アドイン」は通常、VBAマクロを格納した .xla / .xlam ファイルや、COMアドイン(DLL/.NET)などがあります。

ここでは VBAマクロを格納したExcelアドイン(.xlam)をVBScriptで自動生成・インストールする方法 を扱います。

注意:Excel側のセキュリティ設定(後述)により、VBScriptからVBAプロジェクトへアクセス・モジュールを追加する際に制限がかかる場合があります。手順中で必要な設定を説明します。


事前準備(環境・セキュリティ設定)

  1. Windows(VBScriptは標準で動きます)
  2. Microsoft Excel(デスクトップ版)がインストールされていること。
  3. Excelの「マクロの設定」:必要に応じてマクロを有効化(もしくは署名済みマクロを使う)。
  4. Excelの「トラストセンター」 → 「マクロの設定」 → 『VBA プロジェクト オブジェクト モデルへのアクセスを信頼する(Trust access to the VBA project object model)』 をオンにする。
    → VBScriptからワークブックにVBAモジュールを追加する場合、これが必須です(セキュリティ上の理由で既定はオフ)。
  5. 実行するユーザーがファイルの書き込み権限を持つフォルダを用意(例:C:\Users\Public\Documents\Addins)。

セキュリティ注意:この設定は強力なので、信頼できる環境でのみ行ってください。組織ポリシーで無効化されている場合もあります。


概念説明

アドインの種類
  • XLA / XLAM(VBAベースのアドイン)
    ExcelワークブックにVBAを保存し、アドインとして扱う。VBScriptで作成・保存・インストール可能(前述のVBAプロジェクトアクセス許可が必要になることがある)。
  • COM アドイン(DLL/.NET)
    VBScriptでは作成不可(コンパイルが必要)。ここでは扱わない。
  • Office Add-ins(JavaScriptベースの現代的アドイン)
    別技術。VBScriptでは作成できない。
VBScriptでできる代表例
  • Excelを起動してブックを作成/保存/セル操作。
  • VBAモジュールをワークブックに追加(ただしトラスト設定が必要)。
  • 保存して.xlam形式にしてアドインフォルダへ置く、AddInsコレクションに登録してインストール(Installed = True)。
  • アドインに格納したマクロを Application.Run “アドイン名!マクロ名” で実行。
できない/難しい点
  • COMアドインの作成/高度なUI(Ribbon XML)作成はVBScriptでは現実的でない。
  • 企業ポリシーでVBAプロジェクトへのアクセスが禁止されていると自動化はできない。

実践:VBScriptで「簡単なExcelアドイン」を自動作成する手順とコード

ここでは、以下を自動化します。

  1. Excelを起動
  2. 新規ワークブックを作成
  3. VBAモジュールを追加し、簡単なマクロ(例:メッセージを出す関数)を挿入
  4. ワークブックを .xlam として保存
  5. そのアドインをAddInsに登録してインストール

前提:Excelの「Trust access to the VBA project object model」がONであること。

サンプルVBScript(ファイル名例:create_addin.vbs)
Option Explicit

Dim excel, wb, vbProj, vbComp, codeMod
Set excel = CreateObject("Excel.Application")
excel.Visible = False   ' 処理中は非表示(デバッグ時はTrueに)
excel.DisplayAlerts = False

' 新しいワークブックを作成
Set wb = excel.Workbooks.Add

' VBAプロジェクトにモジュールを追加(要:トラスト設定)
Set vbProj = wb.VBProject
Set vbComp = vbProj.VBComponents.Add(1) ' 1 = vbext_ct_StdModule
Set codeMod = vbComp.CodeModule

' マクロ(関数)のコードを挿入
Dim macroCode
macroCode = ""
macroCode = macroCode & "Public Sub HelloFromAddin()" & vbCrLf
macroCode = macroCode & "    MsgBox ""Hello from MySimpleAddin!""" & vbCrLf
macroCode = macroCode & "End Sub" & vbCrLf
codeMod.AddFromString macroCode

Dim addinPath, addinName
addinName = "MySimpleAddin.xlam"
addinPath = CreateObject("Scripting.FileSystemObject").BuildPath(excel.Application.UserLibraryPath, addinName)

' アドインとして保存(XLAM形式)
wb.SaveAs addinPath, 55
wb.Close False

' AddInsコレクションに追加して登録・有効化
excel.Workbooks.Add
Dim ai
Set ai = excel.AddIns.Add(addinPath)
ai.Installed = True

' マクロ実行(アドイン名!マクロ名)
excel.Run "'" & addinPath & "'!HelloFromAddin"

' 後処理
excel.Quit
Set codeMod = Nothing
Set vbComp = Nothing
Set vbProj = Nothing
Set wb = Nothing
Set excel = Nothing

WScript.Echo "Add-in created and installed at: " & addinPath
説明ポイント
  • VBProject と VBComponents.Add を使って標準モジュールを作り、CodeModule.AddFromString でコードを注入しています。
  • 保存時に第2引数 55 を使って .xlam(Excel 2007以降のアドイン)で保存しています。Excelの古い形式(.xla)は別の定数になります。
  • 最後に AddIns.Add でAddInsコレクションに登録し、Installed = True で有効化します。
代表的な FileFormat 値(主なもの)
  • 51 = xlOpenXMLWorkbook — Open XML Workbook(.xlsx:マクロ無し)
  • 52 = xlOpenXMLWorkbookMacroEnabled — Open XML Workbook Macro Enabled(.xlsm:マクロ有り)
  • 50 = xlExcel12 — Excel Binary Workbook(.xlsb)
  • 55 = xlOpenXMLAddIn — Open XML Add-In(.xlam:Excel アドイン(2007 以降))
  • 18 = xlAddIn(または xlAddIn8)— Microsoft Excel 97-2003 Add-In(.xla)
  • 56 = xlExcel8 — Excel 97-2003 Workbook(.xls)
  • 51 はまた xlWorkbookDefault(ワークブック既定)として使われることもあります(.xlsx)
  • 6 = xlCSV — CSV(.csv)
  • 42 = xlUnicodeText — Unicode テキスト(.txt)
  • 54 = xlOpenXMLTemplate — Open XML テンプレート(.xltx)
  • 53 = xlOpenXMLTemplateMacroEnabled(.xltm)

上記は主要なものだけ抜粋しています。完全一覧は Microsoft の XlFileFormat ドキュメントを参照してください。Microsoft Learn


実践:既存アドインをVBScriptからインストールしてマクロを実行するコード

既に作ったアドイン(例:MySimpleAddin.xlam)がある場合、VBScriptから読み込んでマクロを実行できます。

サンプル:アドインをインストールしマクロを呼ぶ(run_addin_macro.vbs)
Option Explicit

Dim excel, addinPath, addinName, ai, fso, i, found
addinName = "MySimpleAddin.xlam"
Set fso = CreateObject("Scripting.FileSystemObject")
addinPath = "C:\Users\Public\Documents\Addins\" & addinName

' ファイルが存在するかチェック
If Not fso.FileExists(addinPath) Then
    WScript.Echo "Add-in file not found: " & addinPath
    WScript.Quit 1
End If

Set excel = CreateObject("Excel.Application")
excel.Visible = True
excel.DisplayAlerts = False

' マクロを自動実行する際のセキュリティ設定(必要に応じて変更/削除してください)
' 1 = msoAutomationSecurityLow (注意:セキュリティリスク)
On Error Resume Next
excel.AutomationSecurity = 1
If Err.Number <> 0 Then
    Err.Clear
End If
On Error GoTo 0

' AddIns コレクションの中を探す(名前またはフルパスで比較)
found = False
For i = 1 To excel.AddIns.Count
    On Error Resume Next
    Dim aiItem
    Set aiItem = excel.AddIns.Item(i)
    If Err.Number = 0 Then
        If LCase(aiItem.Name) = LCase(addinName) Or LCase(aiItem.FullName) = LCase(addinPath) Then
            Set ai = aiItem
            found = True
            On Error GoTo 0
            Exit For
        End If
    End If
    On Error GoTo 0
Next

' 見つからなければ Add で登録
If Not found Then
    On Error Resume Next
    excel.Workbooks.Add
    Set ai = excel.AddIns.Add(addinPath)
    If Err.Number <> 0 Then
        WScript.Echo "Failed to add add-in: Err=" & Err.Number & " Msg=" & Err.Description
        Err.Clear
        excel.Quit
        WScript.Quit 1
    End If
    On Error GoTo 0
End If

' 有効化
ai.Installed = True

' マクロ実行(必要ならシングルクォートで囲む)
On Error Resume Next
excel.Run "'" & addinPath & "'!HelloFromAddin"
If Err.Number <> 0 Then
    WScript.Echo "Run failed: Err=" & Err.Number & " Msg=" & Err.Description
    Err.Clear
End If
On Error GoTo 0

' 終了処理:Excel を残すならコメントアウト
excel.Quit

Set ai = Nothing
Set excel = Nothing
Set fso = Nothing

WScript.Echo "Done."

デバッグとよくある失敗例・対処法

  • エラー:Programmatic access to the Visual Basic Project is not trusted
    対処:Excelのトラストセンターで「VBAプロジェクトへのアクセスを信頼する」をオンにする。
  • エラー:AddIns.Add でパスが見つからない
    対処:addinPath が正しいか、拡張子、ファイル名を確認。スクリプト実行ディレクトリが違う場合はフルパス指定を使う。
  • マクロが実行されない(セキュリティ)
    対処:Excelの「マクロの設定」を確認(有効化/署名済みにする等)。企業ポリシーで制限されている場合はIT管理者に相談。
  • Excelインスタンスが残る(プロセスが終了しない)
    対処:変数を Nothing にし、excel.Quit を呼ぶ。エラー発生時のクリーンアップを On Error で確保する。

演習問題(初級)と解答例

以下は学んだ内容を確認するための演習問題(3問)と解答例です。各問題はVBScriptでExcelを操作する基礎力を問います。

演習1(基礎)

問題:VBScriptで新しいExcelファイルを作り、A1セルに「こんにちは、世界」と書き込み、C:\Temp\hello.xlsx として保存するスクリプトを書きなさい(ファイルを上書きしてもよい)。

解答例
Option Explicit

Dim excel, wb, sht, savePath
savePath = "C:\Temp\hello.xlsx"

Set excel = CreateObject("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False

Set wb = excel.Workbooks.Add
Set sht = wb.Worksheets(1)

sht.Range("A1").Value = "こんにちは、世界"

' 保存(フォルダが存在することを確認)
wb.SaveAs savePath
wb.Close False

excel.Quit
Set sht = Nothing
Set wb = Nothing
Set excel = Nothing
WScript.Echo "Saved to " & savePath

演習2(モジュール挿入)

問題:VBScriptから新しいワークブックを作成し、VBAの標準モジュールを追加して、AddTwoNumbers というPublic Function(引数2つを足して返す)を挿入し、.xlam形式で C:\Temp\CalcAddin.xlam に保存しなさい。※事前に「VBAプロジェクトへのアクセスを信頼する」をONにすること。

解答例
Option Explicit

Dim excel, wb, vbProj, vbComp, codeMod, path
path = "C:\Temp\CalcAddin.xlam"

Set excel = CreateObject("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False

Set wb = excel.Workbooks.Add
Set vbProj = wb.VBProject
Set vbComp = vbProj.VBComponents.Add(1) ' 標準モジュール
Set codeMod = vbComp.CodeModule

Dim code
code = ""
code = code & "Public Function AddTwoNumbers(a As Double, b As Double) As Double" & vbCrLf
code = code & "    AddTwoNumbers = a + b" & vbCrLf
code = code & "End Function" & vbCrLf

codeMod.AddFromString code

wb.SaveAs path, 55
wb.Close False

excel.Quit
Set codeMod = Nothing
Set vbComp = Nothing
Set vbProj = Nothing
Set wb = Nothing
Set excel = Nothing

WScript.Echo "Add-in created at: " & path

演習3(アドイン呼び出し)

問題:上で作った CalcAddin.xlam をVBScriptから読み込み、Application.Run を使って AddTwoNumbers を呼び出し、結果をメッセージボックスで表示するスクリプトを書きなさい。

解答例
Option Explicit

Dim excel, addinPath, result
addinPath = "C:\Temp\CalcAddin.xlam"

Set excel = CreateObject("Excel.Application")
excel.Visible = False
excel.DisplayAlerts = False

' Add-in 登録/有効化
Dim ai
On Error Resume Next
Set ai = excel.AddIns("CalcAddin.xlam")
If Err.Number <> 0 Then
    Err.Clear
    Set ai = excel.AddIns.Add(addinPath)
End If
On Error GoTo 0
ai.Installed = True

' マクロ(関数)をRunで呼ぶ。引数を渡すと結果が返る
result = excel.Run("CalcAddin.xlam!AddTwoNumbers", 3, 4)

MsgBox "3 + 4 = " & result

excel.Quit
Set excel = Nothing

まとめ

VBScriptはExcelを自動化してアドインを作成・登録・実行するための簡単な方法を提供します。

ただし、セキュリティ設定(VBAプロジェクトへのアクセス) がキモです。

企業ポリシーや個人のセキュリティ観点で慎重に扱ってください。


補足(トラブルシューティングのためのチェックリスト)

  • Excelのバージョン確認(Office 2007以降は.xlamが使える)
  • スクリプトの実行は管理者権限が不要だが、保存フォルダの権限が必要
  • ESETやWindows Defenderなどのセキュリティソフトがスクリプト実行をブロックしていないか確認