以下に、Excel VBAを使って「CSVファイルを読み込み、不要な列をスキップしてExcelシートへ転記する」サンプルマクロの一例を示します。
基本的な考え方は、テキストファイルとしてCSVを行単位で読み込み、Split関数で区切って配列に落とし込み、必要な列だけをExcelシートに書き込むという流れです。
実際にご利用になる際は、ご自身の環境に合わせてパスや不要な列番号などを調整してください。
マクロの概要
- 読み込みたいCSVのファイルパスを
csvFilePathで指定します。 - CSVの区切り文字(一般的にはカンマ
,)をdelimiterで指定します。TSVの場合はタブ文字vbTab等に置き換えます。 - 取り込みたい列の番号を
columnsToKeepで指定します。VBAの配列は0番始まりなので、- CSVの「1列目」は
Array(0) - CSVの「2列目」は
Array(1) - CSVの「4列目」は
Array(3)
のようになります。不要な列はこの配列に含めなければ取り込まれません。
- CSVの「1列目」は
- 出力を開始するセル位置を
startRow、startColで指定します。
※「この列とこの列は取って、この列はスキップしたい」といったニーズに合わせて columnsToKeep を調整してください。
ポイント&アレンジ例
「ヘッダー行をスキップしたい」場合は、最初の行だけ読み飛ばすロジックを追加すればOKです。たとえば rowCount = startRow の前あたりで Line Input #fileNo, textLine を一度実行して読み飛ばすなど工夫してください。
「最大列数や動的に列数を把握したい」場合は、読み込んだ配列 spl の UBound(spl) で列数(インデックスの最大値)を確認できますので、その情報を使って必要列を判定する方法もあります。
「貼り付け先をシート名指定で行いたい」場合は Sheets("Sheet名").Cells(rowCount, startCol + (i)).Value = ... とするなど、Cells の前に対象シートを付けてください。
このマクロをベースに、不要な列を省いて取り込みたい場合は
-
- すべての列を配列に読み込む
- 一部の列のみをExcelに書き込む
という形になります。ぜひカスタマイズしてご利用ください。
サンプルコード
Sub ImportCsvSkippingColumns()
'---【設定項目】--------------------------------------------
' 1. CSVファイルのパスを指定
Dim csvFilePath As String
csvFilePath = "C:\temp\testdata.csv" '←ご自身のCSVの場所に合わせて変更してください
' 2. CSVファイルの区切り文字(一般的にはカンマ)を指定
Dim delimiter As String
delimiter = ","
' 3. 取り込みたい列(インデックス)を指定
' 例: CSVの1列目・2列目・4列目のみ取り込みたい場合 → 配列(0,1,3)
' VBAの配列は0始まりなので、CSVの1列目ならインデックス0になります
Dim columnsToKeep As Variant
columnsToKeep = Array(0, 1, 3) ' この例では1列目,2列目,4列目を取り込み
' 4. データの貼り付け先を開始するセルを指定
Dim startRow As Long
Dim startCol As Long
startRow = 1 ' 行方向の開始位置 (ヘッダを入れたい場合は2などにする)
startCol = 1 ' 列方向の開始位置
'---------------------------------------------------------
Dim fileNo As Integer
Dim textLine As String
Dim spl() As String
Dim i As Long
Dim rowCount As Long
' CSVファイルを開く
fileNo = FreeFile
Open csvFilePath For Input As #fileNo
rowCount = startRow
' 行の終わりまで読み込み
Do Until EOF(fileNo)
Line Input #fileNo, textLine
' 区切り文字で分割して配列に格納
spl = Split(textLine, delimiter)
' 必要な列だけをExcelに出力
' columnsToKeepに指定した順で貼り付ける
For i = LBound(columnsToKeep) To UBound(columnsToKeep)
Cells(rowCount, startCol + (i)).Value = spl(columnsToKeep(i))
Next i
rowCount = rowCount + 1
Loop
Close #fileNo
MsgBox "CSVの取り込みが完了しました。"
End Sub
コメント