hiko-blog

VBA業務改善

MENU

指定フォルダのbook集計 その2(500件以上はADODB利用)

'//指定フォルダのbook集計 その2(500件以上はADODB利用)

Sub 指定フォルダのbook集計2()
    Dim folderPath As String
    Dim fileName As String
    Dim newWb As Workbook
    Dim newWs As Worksheet
    Dim newRow As Long
    Dim todayDate As String
    Dim conn As Object
    Dim rs As Object
    Dim sql As String
    Dim fullPath As String
    Dim wb As Workbook
    Dim ws As Worksheet
    Dim lastRow As Long

    ' デスクトップのパスを取得
    Dim desktopPath As String
    desktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\"
    
    ' 指定フォルダーのパスを入力
    folderPath = "C:\Your\Folder\Path\" ' フォルダーのパスを適宜変更してください
    
    ' 新しいブックの作成
    Set newWb = Workbooks.Add
    Set newWs = newWb.Sheets(1)
    newRow = 2 ' 1行目にタイトルを書き込むので、新しいデータは2行目から始める
    
    ' 指定フォルダー内のファイルをループ
    fileName = Dir(folderPath & "*.xls*") ' Excelファイルを検索
    
    Do While fileName <> ""
        fullPath = folderPath & fileName
        
        ' まずはExcelを開いて行数を確認
        Set wb = Workbooks.Open(fullPath)
        Set ws = wb.Sheets(1) ' シート名を適宜変更
        
        lastRow = ws.Cells(ws.Rows.Count, "C").End(xlUp).Row ' C列の最終行
        
        ' 3行目のタイトルを新しいシートにコピー
        ws.Range(ws.Cells(3, 1), ws.Cells(3, 26)).Copy newWs.Cells(1, 2) ' B1からZ1にタイトルをコピー
        newWs.Cells(1, 1).Value = "ブック名" ' A1に「ブック名」を追加
        
        If lastRow > 500 Then
            ' ADODBを使用してExcelファイルを接続
            Set conn = CreateObject("ADODB.Connection")
            conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & fullPath & ";Extended Properties='Excel 12.0 Xml;HDR=YES';"
            
            ' C列に「ABC」が含まれる行を検索するSQL
            sql = "SELECT * FROM [Sheet1$] WHERE C LIKE '%ABC%'" ' シート名を適宜変更
            
            ' SQLを実行
            Set rs = conn.Execute(sql)

            ' 結果を新しいシートに書き込む
            Do While Not rs.EOF
                newWs.Cells(newRow, 1).Value = fileName ' A列にブック名を追加
                
                ' 各列をB列からZ列に書き込む
                For i = 1 To 26
                    newWs.Cells(newRow, i + 1).Value = rs.Fields(i - 1).Value
                Next i
                
                newRow = newRow + 1
                rs.MoveNext
            Loop
            
            ' 接続を閉じる
            rs.Close
            conn.Close
            
        Else
            ' 通常の方法で処理する場合
            ' 結果を新しいシートに書き込む
            Dim dataArray As Variant
            dataArray = ws.Range("C1:C" & lastRow).Value
            
            ' 配列をループして「ABC」をあいまい検索
            For i = 1 To UBound(dataArray, 1)
                ' C列の値に「ABC」が含まれているかチェック
                If InStr(dataArray(i, 1), "ABC") > 0 Then
                    ' A列にブック名を設定
                    newWs.Cells(newRow, 1).Value = fileName
                    
                    ' A列からZ列を新しいシートにコピー(B列からZ列)
                    ws.Range(ws.Cells(i, 1), ws.Cells(i, 26)).Copy newWs.Cells(newRow, 2)
                    newRow = newRow + 1
                End If
            Next i
        End If
        
        ' ブックを閉じる
        wb.Close SaveChanges:=False
        fileName = Dir
    Loop
    
    ' 今日の日付を取得し、_yyyymmdd形式にフォーマット
    todayDate = Format(Date, "yyyymmdd")
    
    ' 新しいブックをデスクトップに保存
    newWb.SaveAs desktopPath & "ExtractedData_" & todayDate & ".xlsx"
    newWb.Close
    
    MsgBox "データの抽出が完了しました!"
End Sub