法令の更新一覧の取得
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・官報とかも今後さらに便利になっていくようです。