t-hom’s diary

主にVBAネタを扱っているブログ…とも言えなくなってきたこの頃。

VBA 自作のExcelアドインに、アドイン自身のアップデート機能をつける

業務で複数人が使うマクロはアドインを作って配布すると便利だ。アドインのリボンにマクロを登録しておけば、だれでも簡単に利用することができる。

ただ、そのアドイン自身を更新しようと思ったら、また配布しなおして利用者全員に再登録してもらわなければならない。手間もかかるし、人によっては方法がよくわからずにそのまま古いバージョンを使い続けるなんてこともあるだろう。

単に便利機能の追加だったら良いが、重要なバグに対する更新だったり、誤操作防止やセキュリティの向上を伴うアップデートだったりした場合、確実に全員のアドインを更新しておきたい。

今回はそんな時に役立つ手法を紹介する。

まずtest.xlamとしてリボン付きのアドインを作成し、標準のアドインフォルダに保存する。リボンのコマンドは次のとおり。

f:id:t-hom:20150626075139p:plain

アドインの標準モジュールに次のようなコードを入力し、保存したらそのアドインはC直下にもコピーしておく。
(実際の運用では共有フォルダなどにコピー)

Sub ShowVersion(control As IRibbonControl)
    MsgBox "これはVer2.0です。"
End Sub

Sub UpdateAddIn(control As IRibbonControl)
    Shell ("WScript.exe ""C:\AddInUpdater.vbs""")
    ThisWorkbook.Close
End Sub

これは上記のリボンから呼び出すことを想定しているが、リボンの作成方法はここでは説明しないので過去記事を参照してほしい。

thom.hateblo.jp

次に、次のコードでAddInUpdater.vbsを作成し、C直下に保存する。
(実際の運用では共有フォルダなどに保存)

Const GetAddInFrom = "C:\test.xlam"

MsgBox "アドインを更新します。OKをクリックした後、しばらくお待ちください。"
WScript.Sleep 3000
Call DeactivateAddIn
Call UpdateAddIn
Call ActivateAddIn
MsgBox "アドインを更新しました"


Sub DeactivateAddIn
	Set Excel = GetObject(, "Excel.Application")
	For Each x In Excel.AddIns
		If x.Name = "test.xlam" Then
			x.Installed = False
		End If
	Next
End Sub

Sub ActivateAddIn
	Set Excel = GetObject(, "Excel.Application")
	For Each x In Excel.AddIns
		If x.Name = "test.xlam" Then
			x.Installed = True
		End If
	Next
End Sub

Sub UpdateAddIn
	Set WS = WScript.CreateObject("WScript.Shell")
	UserProfile = WS.ExpandEnvironmentStrings("%USERPROFILE%")
	Set FSO = WScript.CreateObject("Scripting.FileSystemObject")
	FSO.CopyFile GetAddInFrom, UserProfile & "\AppData\Roaming\Microsoft\AddIns\", True
End Sub

なお、今回はテストなのでアップデーターも最新アドインもCドライブ直下においているが、実際に使う際はファイルサーバーの共有パスなどを指定しておく。

そして、自分のExcel上でアドインの標準モジュールを書き換え、バージョンを1.0に書き換えて保存する。

これでCドライブにVer.2.0、自分のアドインフォルダにVer.1.0が入っている状況が構築できた。

あとは更新ボタンを押すだけで、CにあるVer.2.0がインストールされる。

このような仕組みを構築しておけば、アドインを更新したときは共有フォルダの最新アドインを差し替えて、みんなに更新ボタンを押してもらうだけで常に最新版を配布できるようになる。

※例外処理の対処はしていないので利用される場合は自己責任で編集してください。

VBScriptについて

VBScriptスクリプト言語であるが、文法はほとんどVBAと変わらない。
大きな違いは、エントリーポイント(プログラムが開始される位置)が行頭であることと、変数に型を持たせることができない点である。

現在発売されているVBScriptの書籍は以下2点のみ。

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

最速攻略 VBScriptサンプル大全集 Windows7/Vista/XP/2000対応

最速攻略 VBScriptサンプル大全集 Windows7/Vista/XP/2000対応

ShellやFileSystemObjectについて詳しく知りたい場合はこちらがおススメ。

WSHクイックリファレンス 第2版

WSHクイックリファレンス 第2版

こちらはリファレンスなので初心者向きではないが、FileSystemObjectやDictionaryなどVBAでも参照設定で利用するオブジェクトなので、1冊持っておいても良いかもしれない。

当ブログは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。