以下に、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
コメント