こんにちは、藤田です。
前回は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で自動送信する処理(メール本文、添付、複数宛先、ログ付き) について詳しく掘り下げます