hiko-blog

VBA業務改善

MENU

データをバッチ処理し、複数の小さなファイルに分割するサンプルコード(1,000単位ごと)

Sub ExportDataInBatches()
    Dim rs As Recordset
    Dim db As Database
    Dim strSQL As String
    Dim batchCount As Integer
    Dim batchSize As Integer
    Dim recordCount As Long
    Dim i As Integer
    
    ' バッチサイズとエクスポートするデータの数を設定
    batchSize = 1000 ' 1つのバッチのサイズ
    strSQL = "SELECT * FROM YourTableName" ' エクスポートするデータのクエリを指定
    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)
    recordCount = rs.RecordCount
    
    ' バッチの数を計算
    batchCount = recordCount \ batchSize
    If recordCount Mod batchSize > 0 Then
        batchCount = batchCount + 1
    End If
    
    ' バッチごとにデータをエクスポート
    For i = 1 To batchCount
        rs.MoveFirst
        rs.Move (i - 1) * batchSize
        If i = batchCount Then
            ' 最後のバッチの場合、残りのすべてのレコードをエクスポート
            batchSize = recordCount Mod batchSize
        End If
        ExportBatchToExcel rs, batchSize, i
    Next i
    
    rs.Close
    Set rs = Nothing
    Set db = Nothing
End Sub

Sub ExportBatchToExcel(rs As Recordset, batchSize As Integer, batchNumber As Integer)
    Dim xlApp As Object
    Dim xlBook As Object
    Dim xlSheet As Object
    Dim i As Integer
    Dim j As Integer
    
    ' 新しいExcelアプリケーションを開始
    Set xlApp = CreateObject("Excel.Application")
    xlApp.Visible = False ' Excelを表示しないように設定
    
    ' 新しいブックを作成
    Set xlBook = xlApp.Workbooks.Add
    
    ' レコードセットからデータをエクセルにコピー
    For i = 1 To batchSize
        For j = 0 To rs.Fields.Count - 1
            xlBook.Sheets(1).Cells(i, j + 1).Value = rs.Fields(j).Value
        Next j
        rs.MoveNext
        If rs.EOF Then Exit For
    Next i
    
    ' エクセルファイルを保存
    xlBook.SaveAs "Batch_" & batchNumber & ".xlsx"
    
    ' ブックを閉じる
    xlBook.Close
    
    ' Excelアプリケーションを終了
    xlApp.Quit
    
    ' オブジェクトを解放
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
End Sub