この記事のターゲット
e-statのデータを使いたいけどデータが分割されてる場合あったりで使いづらいなーと感じてるVBAユーザー(MS Acces)
この記事を書いた背景
DATA Saberにチャレンジ中で、Vizを作って公開する必要がある。
→業務や趣味で使うe-statのデータを使いたい。
→使いたいデータがそのままだと扱いにくかったのでAccessに取り込むコード書いたので共有しよう。
Viz作ったり分析する前にはちゃんと前処理した方が結局楽だよね!
準備
今回は「令和4年産野菜生産出荷統計」を使います。
↓の「3.都道府県別の作付面積、10a当たり収量、収穫量及び出荷量」のExcelデータをダウンロードします。
データの取り込み
ダウンロードが完了したら、フォルダを作成してまとめておいてください。
Accessを開き、テーブルを作成。(ここではT_野菜とします。)
プログラムコード
Alt+F11でVBAエディタを開き、「挿入→標準モジュール」で標準モジュールを追加してその中に以下のコードをコピー。
' フォルダパス
targetFolder = "データを保存したフォルダ"
を任意の場所に修正して実行
Sub 野菜データ取り込み()
Dim objFSO As Object
Dim objFolder As Object
Dim objFile As Object
Dim xlApp As Object
Dim xlBook As Object
Dim xlSheet As Object
Dim DB As DAO.Database
Dim RS As DAO.Recordset
Dim targetFolder As String
Dim FilePath As String
Dim i As Integer
Dim VegetableName As String
' フォルダパス
targetFolder = "データを保存したフォルダ"
' FileSystemObjectを作成
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(targetFolder)
' Excelアプリケーションを起動
Set xlApp = CreateObject("Excel.Application")
xlApp.Visible = False
' データベースオブジェクトを取得
Set DB = CurrentDb
' フォルダ内のファイルをループ
For Each objFile In objFolder.Files
If objFSO.GetExtensionName(objFile.Name) = "xls" Then
FilePath = objFile.Path
' Excelファイルを開く
Set xlBook = xlApp.Workbooks.Open(FilePath)
Set xlSheet = xlBook.Sheets(1)
' A5の値を取得してA29:A75に挿入
VegetableName = Split(xlSheet.Range("A5").Value, ") ")(1)
'Debug.Print xlSheet.Range("A5").Value, VegetableName
Set RS = DB.OpenRecordset("T_野菜", dbOpenDynaset)
' データ取得範囲を読み取る
For i = 29 To 75
If xlSheet.Cells(i, 1).Value <> "" Then
If i = 29 And xlSheet.Cells(i, 1).Value <> "北海道" Then
MsgBox "データ取得範囲を確認してください。"
ElseIf i = 75 And xlSheet.Cells(i, 1).Value <> "沖縄" Then
MsgBox "データ取得範囲を確認してください。"
End If
RS.AddNew
RS("野菜名") = VegetableName
' 県名しかないので県等を追加
RS("都道府県") = xlSheet.Cells(i, 1).Value
Select Case RS("都道府県")
Case Is = "北海道"
Case Is = "東京"
RS("都道府県") = "東京都"
Case Is = "大阪"
RS("都道府県") = "大阪府"
Case Is = "京都"
RS("都道府県") = "京都府"
Case Else
RS("都道府県") = RS("都道府県") & "県"
End Select
If IsNumeric(xlSheet.Cells(i, 3).Value) = True Then
RS("作付面積") = xlSheet.Cells(i, 3).Value
End If
If IsNumeric(xlSheet.Cells(i, 4).Value) = True Then
RS("10a当たり収量") = xlSheet.Cells(i, 4).Value
End If
If IsNumeric(xlSheet.Cells(i, 5).Value) = True Then
RS("収穫量") = xlSheet.Cells(i, 5).Value
End If
If IsNumeric(xlSheet.Cells(i, 6).Value) = True Then
RS("出荷量") = xlSheet.Cells(i, 6).Value
End If
If IsNumeric(xlSheet.Cells(i, 7).Value) = True Then
RS("対前年産比_作付面積") = xlSheet.Cells(i, 7).Value
End If
If IsNumeric(xlSheet.Cells(i, 8).Value) = True Then
RS("対前年産比_10a当たり収量") = xlSheet.Cells(i, 8).Value
End If
If IsNumeric(xlSheet.Cells(i, 9).Value) = True Then
RS("対前年産比_収穫量") = xlSheet.Cells(i, 9).Value
End If
If IsNumeric(xlSheet.Cells(i, 10).Value) = True Then
RS("対前年産比_出荷量") = xlSheet.Cells(i, 10).Value
End If
If IsNumeric(xlSheet.Cells(i, 11).Value) = True Then
RS("対平均収量比") = xlSheet.Cells(i, 11).Value
End If
RS.Update
End If
Next i
RS.Close
Set RS = Nothing
' Excelファイルを閉じる
xlBook.Close False
End If
Next objFile
' 終了処理
xlApp.Quit
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing
Set objFolder = Nothing
Set objFSO = Nothing
MsgBox "インポートが完了しました。"
End Sub
実行完了後、T_野菜を確認。
問題なく取得できました。
e-satのExcelフォーマットはケースにより異なるのでコード書くの大変...
e-satにはAPIも用意されている(https://www.e-stat.go.jp/api/)
けどVBAの民はちょっと使いずらい。
でも会社でPythonとかはインストール許可されない民はVBAを使うしかないのだ。