【VBA】EDINETからEDINETコードリストを取得してシートへ取り込む【自動化】

VBAでEDINETから
 ・EDINETコードリストを取得して
 ・シートへ取り込む
VBAコードを紹介します!

EDINETコードリストを取得後にシートへ取り込んだ結果
EDINETコードリストを取得後にシートへ取り込んだ結果
PR

前提

下記で紹介するVBAコードは「SeleniumBasic」等を使用しているため、これらのインストール等が必要です。
「SeleniumBasic」のインストール等については以下の記事をご確認ください。

PR

VBAコード

可読性や保守性を良くするために、処理を以下の6つに分けて作成します。

  • メイン処理
    役割は「フォルダやシート名の指定など」

  • EDINETコードリスト(ZIP)取得処理
    役割は「EDINETからコードリスト(ZIP)を取得」

  • ZIPファイル展開処理
    役割は「ZIPファイルを展開する(CSVファイルを取得する)」

  • EDINETコードCSVファイル読み込み処理
    役割は「コードリスト(CSV)をシートへ読み込む」

  • テーブル化処理
    役割は「シートへ読み込まれたコードリストのテーブル化」

  • ZIP/CSV削除処理
    役割は「ZIPファイルとCSVファイルの削除」 ※後片付けです


呼び出し関係は以下です。
※「メイン処理」が「それ以外の処理」を呼び出します。

呼び出し関係
呼び出し関係

「EDINETコードリスト(ZIP)取得処理」で「SeleniumBasic」等を使用してEDINETのWebサイトからZIPファイルをダウンロードします。ダウンロード先はブラウザに設定されているフォルダです。
※基本的に「C:\Users\[ユーザー名]\Downloads」となっていると思います。
※私の場合は「C:\Users\user\Downloads」です。
※下記で紹介するVBAコードを実行する際はこのフォルダのパス(12行目の変数「zipCsvFolder)を修正してください。

ブラウザに設定されているダウンロード先のフォルダは「設定画面」-「ダウンロード」で確認できます。
※下記はブラウザ「Chorome」の「設定」-「ダウンロード」の画面です。

ダウンロード先として設定されているフォルダ
ダウンロード先として設定されているフォルダ
Option Explicit

Sub main()

    Dim zipCsvFolder As String
    Dim loadSheetName As String
    Dim startRange As String
    Dim tableName As String
    Dim result As Boolean
    
    'EDINETコードリスト(ZIP)がダウンロードされる、かつEDINETコードリスト(CSV)へ展開するフォルダ
    zipCsvFolder = "C:\Users\user\Downloads"
    'CSVファイルを読み込むシート名
    loadSheetName = "EdinetCodeList"
    '書き出し開始セル
    startRange = "B2"
    'テーブル名を指定
    tableName = "EdinetCodeテーブル"
    
    'EDINETコードリスト(ZIP)取得処理
    Call getEdinetCodeListZip(zipCsvFolder)

    'ZIPファイル展開処理
    result = zipExpandArchive(zipCsvFolder)
    If (result = False) Then
        MsgBox ("ZIPファイル展開に失敗しました。")
        Exit Sub
    End If
    
    'EDINETコードCSVファイル読み込み処理
    Call readEdinetCodeCsv(zipCsvFolder, loadSheetName, startRange)

    'テーブル化処理
    Call makeTable(loadSheetName, startRange, tableName)
    
    'ZIP/CSV削除処理
    Call deleteZipCsv(zipCsvFolder)
    
    MsgBox ("EDINETコードリストの取得と読み込み完了!")

End Sub


'##########################################
'EDINETコードリスト(ZIP)取得処理
'##########################################
Sub getEdinetCodeListZip(ByVal zipCsvFolder As String)
    
    Dim url As String
    Dim fso As Object
    Dim zipFile As String
    
    'EDINETコードリスト(ZIP)のリンクがあるURL
    url = "https://disclosure2.edinet-fsa.go.jp/weee0010.aspx?2"
    
    'Chromeを起動
    Dim driver As New ChromeDriver
    'URLを表示
    driver.Get url
    
    'EDINETコードリスト(ZIP)のダウンロード実行 ※JavaScriptの実行
    driver.ExecuteScript ("onDownloadEdinet()")
    
    'ダウンロード完了待ち
    Set fso = CreateObject("Scripting.FileSystemObject")
    zipFile = zipCsvFolder & "\Edinetcode_" & Format(Date, "YYYYMMDD") & ".zip"
    Do While Not fso.FileExists(zipFile)
        driver.Wait 1000
    Loop
    
    '後片付け
    Set fso = Nothing
    
    'Chromeを閉じる
    driver.Close
    Set driver = Nothing

End Sub


'##########################################
'ZIPファイル展開処理
'##########################################
Function zipExpandArchive(ByVal zipCsvFolder As String) As Boolean
    
    Dim zipFile As String
    Dim psCommand As String
    Dim wsh As Object
    Dim result As Integer
    
    zipExpandArchive = False
    
    '解凍(展開)するZIPを指定
    zipFile = zipCsvFolder & "\Edinetcode_" & Format(Date, "YYYYMMDD") & ".zip"
    
    '実行するPowerShellのコマンドレットを組み立て
    psCommand = "powershell -NoProfile -ExecutionPolicy Unrestricted Expand-Archive -Path " & zipFile & " -DestinationPath " & zipCsvFolder & " -Force"
    
    Set wsh = CreateObject("WScript.Shell")
    
    'PowerShellのコマンドレットを実行
    result = wsh.Run(Command:=psCommand, WindowStyle:=0, WaitOnReturn:=True)
    
    If (result <> 0) Then
        Exit Function
    End If
    
    '後片付け
    Set wsh = Nothing
    
    zipExpandArchive = True
    
End Function


'##########################################
'EDINETコードCSVファイル読み込み処理
'##########################################
Sub readEdinetCodeCsv(ByVal zipCsvFolder As String, ByVal loadSheetName As String, ByVal startRange As String)
    
    Dim csvFile As String
    Dim sheet As Worksheet
    Dim csvSheet As Worksheet
    Dim i As Long
    Dim n As Variant
    Dim arrDataType(255) As Long
    
    '読み込むCSVファイル
    csvFile = zipCsvFolder & "\EdinetcodeDlInfo.csv"
    
    '既に「CSVファイルを読み込むシート」が存在する場合は削除
    For Each sheet In ThisWorkbook.Worksheets
        If sheet.Name = loadSheetName Then
            '確認メッセージを非表示
            Application.DisplayAlerts = False
            'シート削除
            Worksheets(loadSheetName).Delete
            '確認メッセージを表示
            Application.DisplayAlerts = True
        End If
    Next
    
    '「CSVファイルを読み込むシート」を新規作成
    Set csvSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
    csvSheet.Name = loadSheetName

    '読み込むファイルの形式を【文字列】と指定するための配列を作成
    For i = 0 To 255
        arrDataType(i) = xlTextFormat
    Next
    
    '「QueryTableオブジェクト(=クエリと接続)」を作成
    With csvSheet.QueryTables.Add(Connection:="TEXT;" + csvFile, Destination:=Range(startRange))
        '区切り文字に「カンマ区切り」を指定
        .TextFileCommaDelimiter = True
        '文字コードに「Shift_JIS」を指定
        .TextFilePlatform = 932
        '読み込み開始行を指定
        .TextFileStartRow = 1
        '読み込むファイルの形式を指定
        .TextFileColumnDataTypes = arrDataType
        '読み込み実行
        .Refresh BackgroundQuery:=False
        '名前(後続で削除できるように名前を設定)
        .Name = "仮テーブル"
        '作成された「QueryTableオブジェクト(=クエリと接続)」を削除
        .Delete
    End With
    
    '上記で作成されてしまう名前定義(仮テーブル)を削除
    For Each n In ActiveWorkbook.Names
        If n.Name = loadSheetName & "!" & "仮テーブル" Then
            n.Delete '
        End If
    Next
    
    '不要行(最初の1行目)を削除
    Worksheets(loadSheetName).Rows(Range(startRange).Row).Delete
    
End Sub


'##########################################
'テーブル化処理
'##########################################
Sub makeTable(ByVal sheetName As String, ByVal startRange As String, ByVal tableName As String)
    
    With Worksheets(sheetName)
        '対象シートをアクティブにする
        .Activate
        'テーブル化する(名前定義も含む)
        .ListObjects.Add(Source:=Range(startRange).CurrentRegion, XlListObjectHasHeaders:=xlYes).Name = tableName
    End With
    
End Sub


'##########################################
'ZIP/CSV削除処理
'##########################################
Sub deleteZipCsv(ByVal zipCsvFolder As String)

    Dim fso As Object
    Dim zipFile As String
    Dim csvFile As String
    
    'ZIP
    zipFile = zipCsvFolder & "\Edinetcode_" & Format(Date, "YYYYMMDD") & ".zip"
    'CSV
    csvFile = zipCsvFolder & "\EdinetcodeDlInfo.csv"
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    'ZIP削除
    If fso.FileExists(zipFile) Then
        fso.DeleteFile zipFile
    End If
    
    'CSV削除
    If fso.FileExists(csvFile) Then
        fso.DeleteFile csvFile
    End If
    
    '後片付け
    Set fso = Nothing
    
End Sub

以下を指定します(12~18行目)。
※状況に応じて任意の値を指定してください。

・EDINETコードリスト(ZIP)がダウンロードされる、かつEDINETコードリスト(CSV)へ展開するフォルダ
 →上記にも記載した変数「zipCsvFolder」のことです。
・CSVファイルを読み込むシート名
・書き出し開始セル
・テーブル名を指定

PR

実行結果

EDINETからEDINETコードリストを取得してシートへ取り込めました。

実行結果①
実行結果①
実行結果②
実行結果②
PR

参考①

上記のVBAコードは以下の記事を参考にして作成しました。

●ブラウザを自動化する


●ZIPファイルを解凍(展開)する


●CSVファイルをシートへ読み込む


●シート上の表をテーブル化する


●ファイルの削除

PR

参考②

「EDINETコードリスト」は以下のページの下部にある「EDINETコードリスト」の「ダウンロード」をクリックにより入手できます。

タイトルとURLをコピーしました