Excel VBAで複数CSVファイルを対応するシートへ自動転記する方法|閉じたCSVからデータ取得するマクロ例

Visual Basic

Excel VBAを使うと、複数のCSVファイルから必要なデータを取得し、指定したワークシートへ自動的に転記する処理を作成できます。特に店舗別や拠点別など、同じ形式のCSVを毎回取り込む作業は、マクロ化することで大幅に効率化できます。この記事では、フォルダ内にある複数のCSVファイルを開き、最終行までのデータを取得して対応するExcelシートへ貼り付ける方法を解説します。

複数CSVをVBAで転記する基本的な考え方

今回のような処理では、以下の流れでVBAを組むと分かりやすくなります。

  • マクロファイルと同じフォルダ内のCSVファイルを指定する
  • CSVファイルをVBAで開く
  • A1:G列の最終データ行までを取得する
  • 対応するマクロファイル内のシートへ値貼り付けする
  • CSVファイルを保存せず閉じる

CSVファイル名と転記先シート名が対応している場合は、配列やループを利用するとコードを簡潔にできます。

CSVファイル名と転記先シートを対応付ける

今回は以下のような対応関係を作成します。

CSVファイル 転記先シート
01_東京.csv 東京シート
02_名古屋.csv 名古屋シート
03_大阪.csv 大阪シート

このような固定の対応なら、配列にファイル名とシート名を登録して順番に処理すると管理しやすくなります。

CSVから最終行まで取得して転記するVBAコード例

以下は、マクロファイルと同じフォルダにある3つのCSVを読み込み、対応するシートへC1セルから値貼り付けするサンプルコードです。

Sub CSV転記()

Dim csvFiles As Variant
Dim sheetNames As Variant
Dim i As Long
Dim wbCSV As Workbook
Dim wsCSV As Worksheet
Dim wsDest As Worksheet
Dim lastRow As Long
Dim filePath As String

csvFiles = Array("01_東京.csv", "02_名古屋.csv", "03_大阪.csv")
sheetNames = Array("東京シート", "名古屋シート", "大阪シート")

Application.ScreenUpdating = False

For i = 0 To UBound(csvFiles)

filePath = ThisWorkbook.Path & "\" & csvFiles(i)

Set wbCSV = Workbooks.Open(filePath)
Set wsCSV = wbCSV.Worksheets(1)

lastRow = wsCSV.Cells(wsCSV.Rows.Count, "A").End(xlUp).Row

Set wsDest = ThisWorkbook.Worksheets(sheetNames(i))

wsDest.Range("C1").Resize(lastRow, 7).Value = wsCSV.Range("A1:G" & lastRow).Value

wbCSV.Close False

Next i

Application.ScreenUpdating = True

MsgBox "CSV転記が完了しました"

End Sub

このコードでは、CSVを開いて内容を読み込みますが、コピー操作ではなくValueによる代入を使っています。そのため、クリップボードを使用せず高速に処理できます。

コードの重要ポイントを解説

最終行の取得方法

Cells(Rows.Count, "A").End(xlUp).Rowを利用すると、A列に入力されている最後の行番号を取得できます。

例えばA1からA500までデータがある場合、取得される値は500になります。これにより、毎回データ件数が変わるCSVにも対応できます。

値貼り付けで転記するメリット

通常のコピー&ペーストでは、以下のような問題が発生する場合があります。

  • クリップボードの状態に影響される
  • 処理速度が遅くなる
  • 貼り付け形式の問題が発生する

そのため、単純にデータだけを移したい場合は、Range.Valueによる直接代入がおすすめです。

CSVの列数やシート構成が変わる場合の注意点

今回の例ではA列からG列まで7列固定として処理しています。

もしCSVによって列数が変わる可能性がある場合は、最終列も自動取得するように変更すると安全です。

また、CSVファイル名やシート名が変更される場合は、配列部分だけ修正すれば対応できます。

既存データを消してから転記したい場合

毎回CSVの内容を最新状態に置き換えたい場合は、転記前に対象シートの既存データを削除します。

例えば以下のコードを転記前に追加できます。

wsDest.Range("C:G").ClearContents

これにより、以前のデータが残ったままになることを防げます。

まとめ|VBAなら複数CSVの定型転記作業を自動化できる

複数のCSVファイルを対応するExcelシートへ転記する作業は、VBAを利用することで簡単に自動化できます。

ファイル名とシート名の対応表を配列で管理し、CSVを開いて必要範囲だけ取得する方法にすると、データ数が変化しても柔軟に対応できます。

また、コピー&ペーストではなくValueによる直接代入を使うことで、高速で安定したマクロを作成できます。毎月や毎日のように発生するCSV取り込み作業であれば、ぜひVBAによる自動化を検討するとよいでしょう。

コメント

タイトルとURLをコピーしました