0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

第3回:CSVをExcelVBAでクレンジング&成形する【整形ロジック+コード解説編】

Posted at

こんにちは、藤田です。
前回はPADでAccessやSQLからデータを取得してCSV出力する流れについて解説しました。今回は、その出力されたCSVファイルをExcel VBAでクレンジングし、帳票や報告書として整形するパートについて、がっつり掘り下げていきます。

このフェーズ、地味なんですが作業者にとっては命綱なんですよね。未成形のまま使われたらミスが出るし、Excel職人の腕の見せ所でもあります。


🔄 処理の流れ(この回の構成)

1. CSV読込 → ワークシート展開
2. 空白行/NULL値の除去
3. データ型・桁数の補正
4. 表示レイアウトの整形(罫線/フォント/列幅)
5. データ分類&色分け(条件付きフォーマット)
6. 保存 → メール送信へ受け渡し

📥 CSVをワークシートに読み込む処理

まずはPADから出力されたCSVをVBAで取り込みます。Open 文で1行ずつ読み込み、2次元配列に格納→シートに展開という王道パターンです。

📄コード例:CSVを読み込んでシートに展開

Sub LoadCSVToSheet()
    Dim filePath As String: filePath = "C:\Output\data.csv"
    Dim lineText As String
    Dim splitVals() As String
    Dim rowIdx As Long: rowIdx = 1
    Dim colIdx As Long

    Open filePath For Input As #1
    Do Until EOF(1)
        Line Input #1, lineText
        splitVals = Split(lineText, ",")
        For colIdx = LBound(splitVals) To UBound(splitVals)
            If Trim(splitVals(colIdx)) <> "" Then
                Sheet1.Cells(rowIdx, colIdx + 1).Value = Trim(splitVals(colIdx))
            End If
        Next colIdx
        rowIdx = rowIdx + 1
    Loop
    Close #1
End Sub

🧼 空白行&NULL値のクレンジング

SQL出力されたCSVは、先頭数行がヘッダーなし・空白やNULL入りということもよくあります。VBAでこれを除去するには、1行ずつチェック → 条件除去がベスト。

✅処理例:空白行削除

Sub RemoveBlankRows()
    Dim r As Long
    With Sheet1
        For r = .UsedRange.Rows.Count To 1 Step -1
            If WorksheetFunction.CountA(.Rows(r)) = 0 Then
                .Rows(r).Delete
            End If
        Next r
    End With
End Sub

🔢 データ型の補正(桁数/日付/数値)

データベースから出力された値には「1列に混在してる」問題もあります。郵便番号が「1234567」と出てきても、見せ方は「123-4567」にしたいですよね。

🎯郵便番号整形の例:

Sub FormatPostalCode()
    Dim r As Long
    With Sheet1
        For r = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row
            If Len(.Cells(r, 3)) = 7 Then
                .Cells(r, 3).Value = Left(.Cells(r, 3).Value, 3) & "-" & Right(.Cells(r, 3).Value, 4)
            End If
        Next r
    End With
End Sub

※3列目に郵便番号が入っている前提


🧩表示整形:罫線、フォント、列幅調整

処理されたデータをそのまま報告に使える形にしておくことで、見た瞬間に「ちゃんと整ってる感」が出ます。

📐コード例:

Sub FormatReportLayout()
    With Sheet1
        .UsedRange.Borders.LineStyle = xlContinuous
        .UsedRange.Font.Name = "メイリオ"
        .UsedRange.Font.Size = 10
        .UsedRange.Rows(1).Font.Bold = True
        .UsedRange.Columns.AutoFit
    End With
End Sub

🎨 データの条件分岐と色分け

たとえば売上データなら「金額が50万以上は赤/それ以下は青」など、条件付きフォーマットで視覚的に差を出すこともできます。

💡コード例:条件付きセル色分け

Sub HighlightSales()
    Dim r As Long
    With Sheet1
        For r = 2 To .UsedRange.Rows.Count
            If .Cells(r, 5).Value >= 500000 Then
                .Cells(r, 5).Interior.Color = RGB(255, 200, 200)
            Else
                .Cells(r, 5).Interior.Color = RGB(220, 255, 255)
            End If
        Next r
    End With
End Sub

📤 ファイル保存処理とメール送信準備

次回(第4回)でOutlook送信を扱いますが、ここで整形されたファイルを保存しておく必要があります。

Sub SaveReportFile()
    Dim fileName As String
    fileName = "C:\Output\Report_" & Format(Date, "yyyymmdd") & ".xlsx"
    ThisWorkbook.SaveAs Filename:=fileName, FileFormat:=xlOpenXMLWorkbook
End Sub

🛠エラーハンドリングとログ記録

複数の処理が走る場合、エラーが出た箇所の特定が重要。VBAでも On Error を使って最低限の記録を残すようにしています。

⚙️例:ログ記録付き

Sub CleanseWithLog()
    On Error GoTo ErrHandler
    ' ... 各種処理
    LogMessage "整形処理成功"
    Exit Sub
ErrHandler:
    LogMessage "整形処理エラー: " & Err.Description
End Sub

Sub LogMessage(msg As String)
    Open "C:\Logs\cleanselog.txt" For Append As #1
    Print #1, Format(Now, "yyyy-mm-dd hh:nn:ss") & " - " & msg
    Close #1
End Sub

🧠まとめと次回予告

この回では、CSVのクレンジングと帳票整形処理を中心に扱いました。VBAは見た目の整形に強いので、PADで取得 → VBAで仕上げ という構成が相性抜群です。

次回はこの成形済みファイルを Outlookで自動送信する処理(メール本文、添付、複数宛先、ログ付き) について詳しく掘り下げます

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?