<Array to CSV> 「配列」を「CSV」へ。Excelで保存。高速処理。

二次元配列を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

このマクロを使用していて、以下の問題が発生ました。

Follow me!

<Array to CSV> 「配列」を「CSV」へ。Excelで保存。高速処理。” に対して2件のコメントがあります。

コメントを残す