LoginSignup
1
3

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

Last updated at Posted at 2023-09-28

法令の更新一覧の取得

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

[追記]
こちらではパワークエリで取得してみました!

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

vba全体

参照設定が必要です。
Microsoft XML, v6.0

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
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/"
    
    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
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
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
  • 合計で16列になる。
  • テーブル化して名前は「table」
  • A2セルにデータ取得したい日付のマイナス1日を入力しておく。
  • この日付以降で法令API取得される。
  • 前回のデータそのままで実行したら、既にあるデータの翌日分~昨日までを対象に更新情報を取得するようになっている。

getWebAPI

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

行列の入替え

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

ConvertDate

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

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

法改正の確認

ってどうしてますか?
職場では担当の部署があるのですが、なんかまともに確認しているのかよく分からなくて。
世の中に影響大きい事はニュースとかやってますけど、業種固有のものとかだと難しい。
実際に大きな法令違反とかまではないでしょうが、ISO認証の監査とかで見られたりもするので、もう少し管理された状態にしたいなあ。

法制のデジタル化

e-Gov・官報とかも今後さらに便利になっていくようです。

参考

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3