1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

e-statは宝の山!だけどVBAの民には使いにくかったりするよね(´・ω・`)

Posted at

この記事のターゲット

e-statのデータを使いたいけどデータが分割されてる場合あったりで使いづらいなーと感じてるVBAユーザー(MS Acces)

この記事を書いた背景

DATA Saberにチャレンジ中で、Vizを作って公開する必要がある。
→業務や趣味で使うe-statのデータを使いたい。
→使いたいデータがそのままだと扱いにくかったのでAccessに取り込むコード書いたので共有しよう。

Viz作ったり分析する前にはちゃんと前処理した方が結局楽だよね!

準備

今回は「令和4年産野菜生産出荷統計」を使います。
↓の「3.都道府県別の作付面積、10a当たり収量、収穫量及び出荷量」のExcelデータをダウンロードします。

令和4年産野菜生産出荷統計
https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00500215&tstat=000001013427&cycle=7&year=20220&month=0&tclass1=000001032286&tclass2=000001032933&tclass3=000001212604&tclass4val=0)

データの取り込み

ダウンロードが完了したら、フォルダを作成してまとめておいてください。
Accessを開き、テーブルを作成。(ここではT_野菜とします。)
image.png

プログラムコード

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_野菜を確認。
問題なく取得できました。

image.png

e-satのExcelフォーマットはケースにより異なるのでコード書くの大変...

e-satにはAPIも用意されている(https://www.e-stat.go.jp/api/)
けどVBAの民はちょっと使いずらい。
でも会社でPythonとかはインストール許可されない民はVBAを使うしかないのだ。

1
1
1

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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?