VBA技術解説
Excelアドインの作成と登録について

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2020-04-09

Excelアドインの作成と登録について


Excelアドインの作成方法と登録方法についての手順と注意点、
そして対応するマクロVBAコードとVBSについて紹介します。


具体的にどんなアドインを作成するかではなく、
一般的なアドインの作成と登録についての概要の解説とVBAコードのサンプルになります。

以下の項目に分けて解説しています。

Excelアドインについて

アドインは、一般的にはプログラムに拡張した機能を追加するものを指します。
エクセルに独自の機能追加するものがエクセルアドインになります。

Excelのアドインファイルは、拡張子が.xlam(2003までは.xla)のファイルです。
このアドインファイルをエクセルに登録することでアドインの機能が使えるようになります。

アドインファイルのフォルダ

Excelアドインの既定のフォルダは、
C:\Users\ユーザー\AppData\Roaming\Microsoft\AddIns
になります。

通常は、上記フォルダにアドインファイルを入れて使うものですが、他のフォルダでも構いません。
Excelからアクセス可能なフォルダであれば、どこに置いても登録可能です。

アドインの作り方

プロシージャーでのVBAの記述について

最初は通常の「Excel マクロ有効ブック(*.xlsm)で作成します。
アドインとして呼び出すプロシージャーは、外部で使える必要がありますので、
Sub
Public Sub
Function
Public Function
このように、スコープがPublicになるようにします。

アドインの機能を呼び出す方法は何通りもあります。

・リボン「開発」→「マクロ」→「実行」
・リボンのアイコンをクリック
・ユーザー定義関数
ユーザー定義関数の作り方
マクロを作成して、ボタンで一括処理…それほどではないが、関数だけではちょっと大変、そんな時は、ユーザー定義関数を使ってみましょう。作り方は簡単です。上記は、引数を足し算して返すユーザー定義関数です。FunctionUserFunc Function これは決まり文句です。
ユーザー定義関数でフリガナを取得する(GetPhonetic)
ワークシート関数の、「PHONETIC」では、他のソフト等からコピペした漢字は取得できません。そこで、VBAでユーザー定義関数を作成し、読みを取得できるようにします。A列はメモ帳よりコピペしました。B列に、ユーザー定義関数を指定して、振り仮名を取得しています。
ユーザー定義関数でハイパーリンクのURLを取得(Hyperlink)
ネットから、何らかの一覧をエクセルにコピペすると、文字列や画像等に、リンクの設定がくっついてきます。URLが表記されていれば良いですが、表示されていない事の方が多いでしょう。そこで、VBAでユーザー定義関数を作成し、URLを取得できるようにします。
・ショートカットキー
マクロをショートカットで起動(OnKeyメソッド)
マクロVBAをショートカットで起動したい時には、Application.OnKeyメソッドを使います、通常マクロはボタンや図形に登録して起動しますが、これらをクリックするにはマウス操作が必要です。Application.OnKeyメソッドを使う事でショートカットで起動できるようになります。
「値の貼り付け」をショートカットに登録(OnKey)
コピーペーストの質問で、よく目にするのは、値の貼り付けが面倒だというものです。どうも、ショートカットが無いからのようです。ネットを調べて見たのですが、どれもしっくりこないので、作ってみました。いろいろな方法が考えられるのですが、簡単かつ直ぐに使えて、他の人にも配布可能なものが良いと思います。
・マウスの右クリックメニユー
右クリックメニューの変更(CommandBars)
セルを右クリックした時のショートカットメニューを変更します、右クリックメニューからマクロを起動できるようにすることで利便性が向上します・シートモジュールに以下を追加します。標準モジュールに以下を追加 SubAA() ActiveCell.Value="AA" EndSub SubBB1() ActiveCell.Value="…
・セル各種イベント
第124回.Workbookのイベントプロシージャー
Workbookのイベントプロシージャーは、ブックに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Workbookのイベントは多数用意されています。
第125回.Worksheetのイベントプロシージャー
Worksheetのイベントプロシージャーは、ワークシートまたはそのセルに対し特定の操作(これがイベント)が行われた時に実行されます。イベントは、手動でもVBAでも、どちらで操作が行われても発生します。Worksheetのイベントプロシージャーの一覧紹介と主要なイベントについて解説します。
ブックを開いた時に指定シートを表示(Workbook_Open)
ブックを開いたときに自動的にマクロVBAを実行するにはWorkbook_Openを使います。Workbook_Openは、ブックを開いた時に自動的に実行されるイベントです、ブックを開いたときに自動的にマクロVBAを起動する方法としてはAuto_Openもあります。
ブックが閉じられる直前に保存済を確認(Workbook_BeforeClose)
Workbook_BeforeCloseは、ブックを閉じる直前に起動されるイベントです、手動で閉じる場合も、VBAで閉じる場合でも起動されます。ブックが未保存の場合、無条件でブックを保存する ブックが未保存の場合は、Closeをキャンセルする。
シートが選択された時に指定セルに移動(Worksheet_Activate)
Worksheet_Activateは、シートが選択された時に実行されるイベントです、VBEの「MicrosoftExcelObjects」内の各シートに記述します。上記では、シートが選択されたとき、A1セルに移動しています。Application.GotoRange("A1"),
ダブルクリックで行高・列幅調整(Worksheet_BeforeDoubleClick)
セルをダブルクリックすることで、そのセル値で行高および列幅を自動調整するマクロVBAになります。これは、以下の操作をマクロVBAでまとめて行うことになります。「行の高さの自動調整」「列の幅の自動調整」この二つの操作を、マクロVBAで一度にやるということです。
英小文字が入力されたら大文字に変換(Worksheet_Change)
セルに英小文字が入力されたら直ちに英大文字に変換するVBAです。ワークシートのイベントを使い、セルの入力確定と同時に変換します。Worksheet_Changeイベント セルの値が変更された時に起動されるイベントプロシージャーです。
セル選択で選択行の色を変更(Worksheet_SelectionChange)
Worksheet_SelectionChangeは、セルの選択範囲を変更した時に起動されます。PrivateSubWorksheet_SelectionChange(ByValTargetAsRange) Target 選択されたセルが、Rangeオブジェクトとして渡されます。
方眼紙Excel(神エクセル)に対応するVBA
もはや、「いじめ」か「いたずら」、方眼紙l(神)Exceに、1枠1文字を入れろと言われて… VBAで処理すれば、こんな「いじめ」も「いたずら」も、サクッと克服できます。以下のような、セル結合の鬼と化したExcelで、罫線で囲んだ枠内に、1枠1文字で入れるという苦行を、VBAなら自動で処理することができます。
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)
VBAクラスを使う事で、ユーザー定義イベントを作成したり、動的にイベントを割り当てる事が出来ます。ユーザー独自のイベントを作成したり、フォームに動的に追加したコントロールにイベントを設定することができます。EventステートメントとRaiseEventステートメントを使う事で、ユーザー定義イベントつまりユーザー独自のイベントを作成できます。
クラスを使って他ブックのイベントを補足する
VBAでイベントを使う場合は、通常はイベントが発生するオブジェクト(ブックやシート等)のモジュールに記載します、つまり、各ブックの中にマクロを入れなければなりません。開いている全ブックまたは、他の特定のブックのイベントを処理するには、WithEventsキーワードを付けた変数宣言を使います、クラスを使って全ブックまたは他ブックのイベントを補足する方法につ…

※参考ページはアドインとして作っているものではなく、呼び出し方法と実装の参考です。

使い勝手が良く機能拡張しやすく割と簡単に導入できるのは、右クリックメニューを使う方法ではないでしょうか。
メニューの階層化もできますし、使えるアイコンも結構あります。

アドインのプロシージャーで自身(アドインを書いたブック)のシートも使えますが、
自身のシートを表示することはできません。
したがって、ユーザーの操作で自身のシートに記入してもらうような事はできません。
他のブックに記入してもらい、その内容を自身のシートに転記して自身を保存(Save)することは可能です。

.xlamの保存方法

マクロ有効ブック.xlsmで作成したブックをアドイン.xlamで保存するには、
名前を付けて保存します。

マクロ VBA アドイン

「Excel アドイン(*.xlam)」を選択します。
アドイン.xlamで保存後は、元のマクロ有効ブック.xlsmの画面に戻ります。

アドインの登録と有効化

エクセルを起動して、
リボンの「フアイル」 ・・・一番左

「オプション」 ・・・下から2番目

「アドイン」 ・・・下から2番目

マクロ VBA アドイン

一番下の、「設定(G)」をクリック

マクロ VBA アドイン

「参照(B)」をクリック

マクロ VBA アドイン

Excelアドインの既定のフォルダである、
C:\Users\ユーザー\AppData\Roaming\Microsoft\AddIns
が表示されます。
他のフォルダにアドインファイルを置いた場合は、そのフォルダに移動します。

登録するアドインファイルを選択して、「OK」

マクロ VBA アドイン

アドインの一覧に登録したアドインが表示されます。
チェックを付けて、「OK」

これで登録したアドインが使用可能になります。
※Excelのバージョンによっては、エクセルを再起動しないとアドインが有効にならない場合があります。
確認の意味でも、エクセルを再起動して機能しているか確認してください。

リボンへの登録

アドインを起動する方法はいろいろあるので、特にリボンに登録する必要性はありませんが、
リボンを使いたい場合は、以下のようにします。

リボンの「フアイル」 →「オプション」 →「リボンのユーザー設定」

マクロ VBA アドイン

「新しいタブ(W)」をクリックして、ユーザー設定のタブを作成します。
すでにある時は、そこに追加しても良いです。

マクロ VBA アドイン

アドイン内のプロシージャーが一覧表示されるので、
プロシージャーを選択して追加ます。

マクロ VBA アドイン

「名前の変更(M)」で、それぞれ分かり易い名前に変更してください。

アイコンの変更や、既存リボンのカスタマイズは通常の方法ではできません。
これらをやる場合はXMLで可能ではあますが、本サイトでは紹介していません。

アドインで保存するVBA

マクロ有効ブック.xlsmで作成したブックをアドイン.xlamとして保存するVBAです。

Sub AddinSaveas()
  Dim strFile As String
  strFile = Replace(ThisWorkbook.FullName, ".xlsm", ".xlam")
  If Dir(strFile) <> "" Then Kill strFile
  ThisWorkbook.SaveAs Filename:=strFile, FileFormat:=xlOpenXMLAddIn
End Sub

SaveAsメソッドで、引数FileFormatにxlOpenXMLAddInを指定します。

上の例では、マクロ有効ブック.xlsmと同じフォルダに保存していますが、
アドインの規定フォルダに保存するには、そのフォルダをまず取得します。

Sub AddinFolder()
  Dim wsh As Object
  Set wsh = CreateObject("WScript.Shell")
  MsgBox wsh.SpecialFolders("Appdata") & "\Microsoft\Addins\"
End Sub

取得したアドインの規定フォルダに保存してください。
ただし、自分だけで使うアドインならともかく、
配布用に作成する場合を考慮すると、一旦は別フォルダに保存したほうが良いのではないかと思います。
アドインの動作確認は、アドイン登録しなくてもアドイン.xlamを直接開くことで確認できます。

アドインを登録するVBA

アドインファイル.xlamをアドインの一覧に登録するVBAです。

Sub AddinAdd()
  AddIns.Add ThisWorkbook.Path & "\AddinTest.xlam"
End Sub

アドインの一覧に入れるだけでは有効化さないので、
この時点では、まだアドインは使える状態になっていません。

既にアドインに登録されている場合は、このVBAは無視されます。

アドインを有効化するVBA

アドインの一覧でチェックを付けて有効化するVBAです。

Sub AddinInstall()
  AddIns("AddinTest").Installed = True
End Sub

無効化する場合は、Falseを指定します。

有効化されている状態でExcelが起動している場合は、アドインファイルが開かれています。
アドインファイルを入れ替える場合は、一旦無効化してから入れ替えます。

アドインマネージャーを表示するVBA

リボンの「フアイル」→「オプション」→「アドイン」→「設定(G)」で表示されるダイアログを表示するVBAです。

Sub AddinManeger()
  Dim rtn
  rtn = Application.Dialogs(xlDialogAddinManager).Show
  If rtn = True Then
    MsgBox "OK"
  Else
    MsgBox "キャンセル"
  End If
End Sub

「OK」が選択されたとしても、何が変更されたかは判別できません。

これを判別するには、ダイアログの表示前後でアドインの一覧の変化を判定すれば可能です。
以下では、アドインに登録されているファイルの一覧をイミディエイトウインドウに出力しています。

Sub GetAddins()
  Dim objAddin As AddIn
  For Each objAddin In AddIns
    Debug.Print objAddin.FullName
  Next
End Sub

上のVBAではフルパスを出力していますが、
名前だけなら、.Name
パスだけなら、.Path

アドイン配布時に自動登録するVBA

アドインを配布時に、ユーザーの手間を省くために自動でアドイン登録できれば便利です。
同一フォルダにあるアドイン.xlamを、アドインフォルダにコピーしてからアドイン登録&有効化するVBAです。

Sub AdinAutoInstall()
  Dim InstallPath
  Dim AddinPath
  Dim AddinFile
  Dim AddinName
  Dim xlApp
  Dim fso
  Dim wsh
  
  AddinName = "AddinTest" 'アドインのファイル名、アドイン名
  AddinFile = AddinName & ".xlam"
  
  On Error Resume Next
  
  'Excelのインスタンス
  Set xlApp = Application 'VBA
  'Set xlApp = CreateObject("Excel.Application") 'VbScript
  
  '登録済対策
  xlApp.AddIns(AddinName).Installed = False
  
  '使用するオブジェクトのインスタンス
  Set wsh = CreateObject("WScript.Shell")
  Set fso = CreateObject("Scripting.FileSystemObject")
  
  'アドインのファイル名、ここでは同一フォルダ
  AddinPath = ThisWorkbook.Path & "\" 'VBA
  'AddinPath = fso.GetFolder(".") & "\" 'VbScript
  
  'Addinsフォルダ、任意のフォルダを指定可能
  InstallPath = wsh.SpecialFolders("Appdata") & "\Microsoft\Addins\"
  'アドインファイルをコピー
  fso.CopyFile AddinPath & AddinFile, InstallPath & AddinFile, True
  
  'アドイン登録
  'xlApp.Workbooks.Add 'VbScript
  xlApp.AddIns.Add InstallPath & AddinFile
  xlApp.AddIns(AddinName).Installed = True
  'xlApp.Quit 'VbScript
  
  '終了時の解放
  Set wsh = Nothing
  Set fso = Nothing
  Set xlApp = Nothing
  
  MsgBox "インストール終了"
End Sub

VBScriptとある程度共通で使えるようにしています。
・参照設定を使わない
・オブジェクトの型を指定しない
これにより、ほとんどの部分はそのままコピペしてVBScriptで使えるようにVBAコードを書いています。
コメントで、
'VBA
'VbScript
これは、
VBAとして使う場合は、 'VBAの行を生かし、'VbScriptの行をコメントアウトする
VScriptとして使う場合は、 'VBAの行をコメントアウトし、'VbScriptの行を生かす

VBScriptはテキストファイルで、拡張子を.vbsとするだけです。
起動もダブルクリック等で起動できますし、アプリが立ち上がらないので高速で処理完了します。
一応VBScriptで動作確認もしてはありますが、
本サイトではVBScriptの解説をしていませんので、あくまで補足としての記載になります。

アドインを配布して使ってもらう場合は、VBScriptの方が起動は手軽で簡単かもしれません。
処理速度も上記コードならほぼ一瞬で終わります。
ただし、VBScriptでは細かいエラー処理を入れるのが面倒です。
面倒なだけで入れられないことはありませんが、
そのような必要性がある場合は、
VBAの方がコードが書きやすくテストしやすいと思います。

個人用マクロブックについて

Excelに独自機能を組み込む場合、
単にExcel起動と同時に機能追加するだけなら、個人用マクロブックでも良いことになります。
そのような場合は、アドインと個人用マクロブックのどちらが良いということもないと思います。
しかし、
個人用マクロブックは名前が示す通り、基本的には個人で使うものです。
したがって、配布する場合はアドインにしたほうが後々の保守性は良い場合が多いでしょう。
機能ごとにxlamを分けて配布すれば、ユーザーが個別にいつでも有効化・無効化できますので融通も効きます。



同じテーマ「マクロVBA技術解説」の記事

条件付きコンパイル(32ビット64ビットの互換性)
ドキュメントプロパティ(BuiltinDocumentProperties,CustomDocumentProperties)
VBAでファイルを既定のアプリで開く方法
Excelアドインの作成と登録について
VBAでのタイマー処理(SetTimer,OnTime)
マクロでShift_JIS文字コードか判定する
Byte配列と文字コード関数について
VBA+SeleniumBasicで検索順位チェッカー(改)
Applicationを省略できるApplicationのメソッド・プロパティ一覧
PowerQueryの強力な機能をVBAから利用する方法
ShapesとDrawingObjectsの相違点と使い方


新着記事NEW ・・・新着記事一覧を見る

VBAのインデントについて|VBA技術解説(7月15日)
「VBA Match関数の限界」についての誤解|エクセル雑感(7月15日)
省略可能なVariant引数の参照不可をラップ関数で利用|VBA技術解説(7月12日)
100桁の正の整数値の足し算|エクセル雑感(7月9日)
LSetとユーザー定義型のコピー(100桁の足し算)|VBA技術解説(7月9日)
Variant仮引数のByRefとByValの挙動違い|エクセル雑感(7月5日)
Variant仮引数にRange.Valueを配列で渡す方法|エクセル雑感(7月5日)
Variantの数値型と文字列型の比較|エクセル雑感(7月1日)
VBAのVariant型について|VBA技術解説(6月30日)
VBAのString型の最大文字数について|エクセル雑感(6月20日)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.マクロって何?VBAって何?|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
7.繰り返し処理(For Next)|VBA入門
8.セルに文字を入れるとは(Range,Value)|VBA入門
9.とにかく書いてみよう(Sub,End Sub)|VBA入門
10.マクロはどこに書くの(VBEの起動)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ