二次元配列をCSVファイルに出力、高速化
二次元配列をCSVファイルに出力するマクロを、以下で紹介しました。
そこで、見直ししたのが、以下です。
'*******
'* 二次元配列をCSVファイルに出力、高速化。20230912
'* https://excel-vba.work/2021/01/03/%E3%80%90vba%E3%80%91%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%9F%E7%AF%84%E5%9B%B2%E3%82%92csv%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%B8%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B/
'* arr:二次元配列。これが、csvファイルに出力される
'* FileName:csvファイル名、フルパス
Private Sub array_to_csv_Excel(ByRef arr As Variant, ByVal FileName As String)
Dim csvFile As String
' Dim targetRange As Range
Dim wb As Workbook
Dim fso As Object
'出力するCSVファイルを指定
csvFile = FileName
'CSVファイルへ出力する範囲を指定 ※例としてシート「sample」のセル「B2」から続く一連の範囲を指定
'Set targetRange = Worksheets("sample").Range("B2").CurrentRegion
'Set targetRange = arr
Set fso = CreateObject("Scripting.FileSystemObject")
'出力するCSVファイルが既に存在する場合は削除
If fso.FileExists(csvFile) Then
If IsBookOpened(csvFile) Then
Dim rc As Integer
rc = MsgBox("ファイルが開いています。" & vbCrLf & _
"はい:閉じて、削除して、処理を続けます。" & vbCrLf & _
"いいえ:処理を中断します", vbYesNo + vbQuestion, "確認")
If rc = vbYes Then
Dim FileNameOnly As String
FileNameOnly = fso.GetFileName(csvFile)
Windows(FileNameOnly).Close
Else
End
End If
End If
' ファイル削除
fso.DeleteFile csvFile
End If
'新規ブックを作成
Set wb = Workbooks.Add
' 配列をブックにコピー
wb.Worksheets(1).Range("A1").Resize(UBound(arr), UBound(arr, 2)) = arr
'新規ブックをCSVファイルとして出力
wb.SaveAs FileName:=csvFile, FileFormat:=xlCSV, Local:=True
' 「xlCSV」・・・・・文字コードは「Shift_JIS」となります。
' 「Local:=」に「True」を指定することで、「日付の形式」を「Excelの言語設定で指定されている言語(日本語と思います)」にします
'新規ブックを保存せずに閉じる
wb.Close SaveChanges:=False
'後片付け
Set fso = Nothing
End Sub
配列を、新しいブックに書込み、それを、csvで保存する方法です。これで、高速化がはかれました。
「IsBookOpened」は、ファイルが開かれているか確認する関数で、以下の通りです。
Public Function IsBookOpened(ByVal FilePath As String) As Boolean
On Error Resume Next
Open FilePath For Append As #1
Close #1
If Err.Number > 0 Then
IsBookOpened = True
Else
IsBookOpened = False
End If
End Function
このマクロを使用していて、以下の問題が発生ました。
“二次元配列をCSVファイルに出力、高速化” に対して2件のコメントがあります。