配布ExcelマクロをRedmineでバージョン管理

#背景
　配布したExcelマクロの管理って難しいですよね。一度出回ってしまうと軽微な修正を全ブックに適用するのは難しいものです。そんな困りごとをRedmineAPIを使って解決する例を示します。

 <前提条件>
　・所定のRedmineサーバと通信できる範囲でブックは流通する
　・配布するのはExcel”マクロ”で，**マクロが有効にされる**前提


#概要

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/1f726337-8b18-a4f5-1829-79a175cbebc5.png)

1. ブック管理用のチケットとゲストアカウントを作成する
2. エクセルマクロにRedmineAPIを登録する
3. workbook_openでチケットをAPI経由で呼び出す
4. チケット記載のバージョンとブック記載のバージョンを比較
5. 異なる場合は，メッセージを出し最新版ダウンロードを促す

## 1. ブック管理用のチケットとゲストアカウントを作成する

公開プロジェクトに，専用のチケットを作成して，urlをコピーしてください。最新バージョンを説明欄などの部分に記載します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/f9d6bf32-5623-22f7-8ca0-40ec1cf4bbc0.png)

※本マクロは同じ文字列が記載されているかどうかを探索しているだけなので，同じ文字がチケット中に登場しないように注意お願いします。(もちろんマクロの作りをより精緻にしたり，専用のフィールドを用意するといいです)

マクロに添付して配布しても問題ないゲスト用アカウントを作成し，個人設定タブからAPI_keyをメモしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/4cb08a5a-8d38-55e0-4986-c79a2831fdbf.png)







## 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 XML, v6.0
- Microsoft HTML Object Library
- Microsoft Forms 2.0 Object Library
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/1b8a339d-de7c-b8f9-8bd5-b524ad150d26.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/415035fe-9e85-b4a0-e6a4-7ef78ed0c440.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/39b5fa05-16a8-9f38-c8a0-94fd0b3fe676.png)

Microsoft Forms 2.0 Object Libraryはリストに表示されていないため，参照ボタンから，「C:\Windows\System32\FM20.DLL」または「C:\Windows\SysWOW64\FM20.DLL」を選択して追加します。


## 3. workbook_openでチケットをAPI経由で呼び出す
ThisWorkbookに，作成したマクロを登録します。
Workbook_openに指定することで，マクロ有効化にしたタイミングで最新版を自動で確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/0d8841d5-a8dc-7266-812c-6b245de25527.png)

※本記事のバージョン管理は，マクロが使われること，つまりは高度な操作を行われるタイミングを対象としています。


## 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 です。 変更点 　・１ 　・２ 　・３ </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が走るタイミング(マクロが有効されたタイミング)で，メッセージダイアログが出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434780/0fdff71b-7326-1926-7706-d3a20b48c9d9.png)

クリップボードに入る親切設計です！


以上です。

※マクロの作りはちょっと雑なので，そのうち更新できればと思います