e-Govの法令APIで更新法令一覧を取得する_VBAで

# 法令の更新一覧の取得
e-Govで法令の更新一覧が閲覧できるのは、過去30日分のみのようです。
それより前は、法令APIから取得する必要があるのでエクセルVBAで試してみました。

https://elaws.e-gov.go.jp/update/

[追記]
[こちら](https://qiita.com/gug1msp/items/918f078a208f150b2fb3)ではパワークエリで取得してみました！

[追記2]
日付について追記ました。
⇒[ConvertDate](#ConvertDate)

[追記3]
e-GOVのURL変更により修正しました。
⇒[vba全体](#vba全体)

# vba全体
参照設定が必要です。
Microsoft XML, v6.0
```vb
Option Explicit

'参照設定
'Microsoft XML, v6.0

Sub main()

    Const column最大 As Long = 16
    Dim arrayXml As Variant
    Dim countDate As Date
    
    ReDim arrayXml(1 To column最大, 0 To 0)
    
    'テーブル日付の最新日+1～昨日までを対象に更新情報を取得
    For countDate = CDate(WorksheetFunction.Max(Range("table[Date]"))) + 1 To Date - 1
        
        arrayXml = getWebAPI(arrayXml, UBound(arrayXml, 2), countDate)
    
    Next
    
    Call 行列の入替え(arrayXml)
    Call ConvertDate(arrayXml)
    
    With ActiveSheet.Range("A1").CurrentRegion
        .Offset(.Rows.count, 0).Resize(UBound(arrayXml, 1), UBound(arrayXml, 2)) = arrayXml
    End With
    
End Sub
```
```vb
Private Function getWebAPI(arrayXml, count, date検索)
'法令APIで更新の情報を取得する

    '法令APIのURI
- '    https://elaws.e-gov.go.jp/apitop/#
- '    https://elaws.e-gov.go.jp/file/houreiapi_shiyosyo.pdf
-    Const requestURI As String = "https://elaws.e-gov.go.jp/api/1.3/updatelawlists/"
+    'https://laws.e-gov.go.jp/file/houreiapi_shiyosyo.pdf
+    Const requestURI As String = "https://laws.e-gov.go.jp/api/1/updatelawlists/"
    
    Dim http As XMLHTTP60
    Dim doc As DOMDocument60
    Dim node As IXMLDOMNode
    Dim childNode As IXMLDOMNode
    Dim url As String
    Dim row As Long
    
    Set http = New XMLHTTP60
    url = requestURI & Format(date検索, "yyyymmdd")
    http.Open "GET", url, False
    http.send
    
    '取得したデータから必要な部分のみ配列へ入れる
    Set doc = New DOMDocument60
    doc.LoadXML (http.responseText)

    For Each node In doc.getElementsByTagName("LawNameListInfo")
        
        count = count + 1
        ReDim Preserve arrayXml(1 To UBound(arrayXml, 1), 1 To count)
        
        row = 1
        arrayXml(row, count) = doc.getElementsByTagName("Date").Item(0).Text
        
        For Each childNode In node.ChildNodes
            row = row + 1
            arrayXml(row, count) = childNode.Text
        Next
    Next

    getWebAPI = arrayXml
    
End Function
```
```vb
Private Sub 行列の入替え(myArray)
'配列の列/行を入替え

    Dim i As Long
    Dim j As Long
    Dim myArray2()
    
    ReDim myArray2(LBound(myArray, 2) To UBound(myArray, 2), LBound(myArray, 1) To UBound(myArray, 1))
    
    For i = LBound(myArray, 1) To UBound(myArray, 1)
        For j = LBound(myArray, 2) To UBound(myArray, 2)
            myArray2(j, i) = myArray(i, j)
        Next
    Next
    
    myArray = myArray2

End Sub
```
```vb
Private Sub ConvertDate(myArray)
'yyyymmddの文字列を日付型に変換する

    Dim i As Long
    Dim j As Long
    
    For i = LBound(myArray, 1) To UBound(myArray, 1)
    
        For j = LBound(myArray, 2) To UBound(myArray, 2)
            
            If j = 1 Or j = 7 Or j = 10 Or j = 11 Then
                
                If Len(myArray(i, j)) = 8 Then
                
                    myArray(i, j) = CDate(Format(myArray(i, j), "####/##/##"))
                End If
            End If
        Next
    Next

End Sub
```

## main
ここから開始。
その前にエクセルシート上の準備。
- 一行目に項目名を入れる
- A1セルはDate　e-Govでの更新日の事
- B1以降は、2.4.3.応答結果XMLの項目名にしています
- 他は「LawNameListInfo」内の15項目
- ~~https://elaws.e-gov.go.jp/file/houreiapi_shiyosyo.pdf~~
- https://laws.e-gov.go.jp/file/houreiapi_shiyosyo.pdf
- 合計で16列になる
- テーブル化して名前は「table」
- A2セルにデータ取得したい日付のマイナス1日を入力しておく
- この日付以降で法令API取得される
- 前回のデータそのままで実行したら、既にあるデータの翌日分～昨日までを対象に更新情報を取得するようになっている

## getWebAPI
法令APIで、法令の更新情報一覧を取得して配列へまとめている。

## 行列の入替え
getWebAPIでは、シートへの表示する時とは、行列が逆になっているので、その配列を戻している。

## ConvertDate
取得したままでは「yyyymmdd」なのでそれを「yyyy/mm/dd」の日付型にしている。
xxxDateという名前で8文字の時を対象にしているけど、仕様書では全角？の所もある？
もしかしたら変換でおかしくなる事があるかもしれない。

[追記]
日付が1900年より前の場合はエラーになってしまいます。
PromulgationDate（公布年月日）でありえるようです。
（日本の法律は歴史ありますね）


# 法制のデジタル化
e-Gov・官報とかも今後さらに便利になっていくようです。

https://www.digital.go.jp/councils/administrative-research-wg-legal-practice-team


# 参考
- https://www.depthbomb.net/?p=8264
- https://qiita.com/isamusuzuki/items/b2e88184e7cfb75877a8