VBAでEDINETから
・EDINETコードリストを取得して
・シートへ取り込む
VBAコードを紹介します!
前提
下記で紹介するVBAコードは「SeleniumBasic」等を使用しているため、これらのインストール等が必要です。
「SeleniumBasic」のインストール等については以下の記事をご確認ください。
VBAコード
可読性や保守性を良くするために、処理を以下の6つに分けて作成します。
呼び出し関係は以下です。
※「メイン処理」が「それ以外の処理」を呼び出します。
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
実行結果
EDINETからEDINETコードリストを取得してシートへ取り込めました。
参考①
上記のVBAコードは以下の記事を参考にして作成しました。
●ブラウザを自動化する
●ZIPファイルを解凍(展開)する
●CSVファイルをシートへ読み込む
●シート上の表をテーブル化する
●ファイルの削除
参考②
「EDINETコードリスト」は以下のページの下部にある「EDINETコードリスト」の「ダウンロード」をクリックにより入手できます。