#背景
配布したExcelマクロの管理って難しいですよね。一度出回ってしまうと軽微な修正を全ブックに適用するのは難しいものです。そんな困りごとをRedmineAPIを使って解決する例を示します。
<前提条件>
・所定のRedmineサーバと通信できる範囲でブックは流通する
・配布するのはExcel”マクロ”で,マクロが有効にされる前提
#概要
- ブック管理用のチケットとゲストアカウントを作成する
- エクセルマクロにRedmineAPIを登録する
- workbook_openでチケットをAPI経由で呼び出す
- チケット記載のバージョンとブック記載のバージョンを比較
- 異なる場合は,メッセージを出し最新版ダウンロードを促す
1. ブック管理用のチケットとゲストアカウントを作成する
公開プロジェクトに,専用のチケットを作成して,urlをコピーしてください。最新バージョンを説明欄などの部分に記載します。
※本マクロは同じ文字列が記載されているかどうかを探索しているだけなので,同じ文字がチケット中に登場しないように注意お願いします。(もちろんマクロの作りをより精緻にしたり,専用のフィールドを用意するといいです)
マクロに添付して配布しても問題ないゲスト用アカウントを作成し,個人設定タブからAPI_keyをメモしてください。
2. エクセルマクロにRedmineAPIを登録する
サンプルコード
Const issue_url = "http://[ホスト名]/redmica/issues/483"
Const api_key = "273aaXXXXXXXXXXXXXXXXXXXXXXX"
Const バージョン = "v1.2.3"
Sub 最新バージョン確認()
Dim url As String
url = issue_url & ".xml?key=" & api_key
'redmineサーバにアクセス出来ない場合のエラー対策
On Error Resume Next
Dim httpObj As Object
Set httpObj = CreateObject("MSXML2.ServerXMLHTTP")
httpObj.Open "GET", url
httpObj.send
Do While httpObj.readyState < 4
DoEvents
Loop
Dim str As String
str = httpObj.responsetext
Dim yesno
'無事読み込めた場合のみ処理
If httpObj.Status = 200 Then
If InStr(str, バージョン) = 0 Then
'確認メッセージ表示
yesno = MsgBox("最新バージョンのマクロが公開されています。" & vbCrLf & "詳細はこちら " & issue_url & vbCrLf & vbCrLf & "クリップボードにコピーしますか?", vbYesNo)
If yesno = vbYes Then
'クリップボードにコピー
With New MSForms.DataObject
.SetText issue_url
.PutInClipboard
End With
End If
End If
End If
On Error GoTo 0
End Sub
参照設定
VBAのメニューより,ツール>参照設定より,以下のモジュールを追加してください。
Microsoft Forms 2.0 Object Libraryはリストに表示されていないため,参照ボタンから,「C:\Windows\System32\FM20.DLL」または「C:\Windows\SysWOW64\FM20.DLL」を選択して追加します。
3. workbook_openでチケットをAPI経由で呼び出す
ThisWorkbookに,作成したマクロを登録します。
Workbook_openに指定することで,マクロ有効化にしたタイミングで最新版を自動で確認できるようになります。
※本記事のバージョン管理は,マクロが使われること,つまりは高度な操作を行われるタイミングを対象としています。
4. チケット記載のバージョンとブック記載のバージョンを比較
http://[ホスト名]/redmine/issues/チケット番号.xml
でアクセスすると,以下のようなレスポンスが返ってくるのを確認できると思います。
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<issue>
<id>483</id>
<project id="5" name="Redmine開発"/>
<tracker id="1" name="WBS"/>
<status id="1" name="新規"/>
<priority id="2" name="通常"/>
<author id="5" name=" "/>
<subject>RedmineAPIマクロ</subject>
<description>最新バージョンは v1.2.3 です。 変更点 ・1 ・2 ・3 </description>
<start_date>2021-12-15</start_date>
<due_date/>
<done_ratio>0</done_ratio>
<is_private>false</is_private>
<estimated_hours/>
<total_estimated_hours/>
<created_on>2021-12-15T10:37:57Z</created_on>
<updated_on>2021-12-15T10:37:57Z</updated_on>
<closed_on/>
</issue>
これをマクロの Instr(str, "探索文字") = 0 の部分で"探索文字"に相当するものが登場するかどうかで判定しています。
5. 異なる場合は,メッセージを出し最新版ダウンロードを促す
Workbook_openが走るタイミング(マクロが有効されたタイミング)で,メッセージダイアログが出てきます。
クリップボードに入る親切設計です!
以上です。
※マクロの作りはちょっと雑なので,そのうち更新できればと思います