VBAでCSVを読み込む方法|複数形式に対応できる汎用コード付き

アイキャッチ画像

Excel業務の中でも「CSVファイルを読み込んで加工する」という作業は頻度が高く、毎月の定型業務として発生することが多いと思います。売上データ、勤怠データ、システム出力など、CSV形式はさまざまな場面で利用されています。

ただ、実務では次のような悩みがよくあります。

  • 毎回手作業でCSVを開くのが手間
  • 文字化けして読み込めないことがある
  • 複数ファイルをまとめて読み込みたい
  • CSV以外にもTXTやExcelファイルを扱いたい
  • 上の方に不要な行が入っていて整形が面倒
  • ファイル形式がバラバラで処理が複雑になる

こうした悩みは、VBAで読み込み処理を自動化することで大きく改善できます。

この記事では、「VBAでCSVを読み込む方法」から始めて、「複数形式に対応できる汎用コード」まで順を追って紹介していきます。

実務でそのまま使えるテンプレートとして、ぜひ活用してみてください。


目次

VBAでCSVを読み込む最小構成のコード

まずは、最もシンプルな「CSVを開くだけ」のコードです。

Sub OpenCSV()
    Workbooks.Open Filename:="C:\test\data.csv"
End Sub

これは単純にCSVを開くだけですが、実務では「毎回パスが変わる」「複数ファイルを選びたい」などの要望が出てきます。

そこで次に、GetOpenFilenameを使った柔軟な方法を紹介します。

実務での使い方

ファイルの保存場所やファイル名が毎回変わる場合は、固定パスを指定するよりも、ファイル選択画面から対象ファイルを選べるようにすると便利です。


GetOpenFilenameを使ってCSVを選択する

VBAでファイルを選択する場合、Application.GetOpenFilenameがよく使われます。

Application.GetOpenFilename("CSVファイル,*.csv")

このコードを実行すると、CSVファイルだけを選択できるダイアログが表示されます。

フィルタの例

CSVファイルに限定

Application.GetOpenFilename("CSVファイル,*.csv")

Excelファイルに限定

Application.GetOpenFilename("Excelファイル,*.xlsx;*.xlsm")

テキストファイルに限定

Application.GetOpenFilename("テキスト,*.txt")

複数のファイル形式に対応

Application.GetOpenFilename( _
    "CSV,*.csv,テキスト,*.txt,Excel,*.xlsx")

すべてのファイル形式に対応

Files = Application.GetOpenFilename( _
    "CSV,*.csv,テキスト,*.txt,Excel,*.xlsx", _
    MultiSelect:=True)

フィルタを柔軟に設定できるため、「CSVだけでなく、複数形式に対応した読み込み処理」を作る土台になります。

実務での使い方

「CSVを選択してください」と毎回ファイルパスを入力してもらうのではなく、ファイル選択画面から選んでもらうことで、入力ミスやパス変更への対応も簡単になります。


CSVを読み込む基本処理

次は、選択したCSVを実際に開くコードです。

GetOpenFilenameは、ユーザーがキャンセルするとFalseを返すため、変数はVariant型にしておくと扱いやすくなります。

Sub ReadCSV()

    Dim filePath As Variant

    filePath = Application.GetOpenFilename("CSVファイル,*.csv")

    If filePath = False Then Exit Sub

    Workbooks.Open filePath

End Sub

ここまでで「CSVを選んで開く」という基本処理が完成します。

実務での使い方

この処理をベースにすれば、

「CSVを選択 → 読み込み → データ加工 → 集計」

という一連の作業を自動化できます。


上の方に不要な行があるときの対処法

CSVを開いたとき、「ヘッダーより上に不要な行が入っている」というケースがあります。

システム出力のCSVでは、次のような情報が先頭に入っていることがあります。

  • タイトル行
  • 日付行
  • コメント行
  • 空白行

たとえば、次のようなCSVです。

売上データ
2026年8月分
作成日:2026/8/1

商品名,数量,金額
商品A,10,5000
商品B,20,10000

この場合、必要なのは

商品名,数量,金額
商品A,10,5000
商品B,20,10000

という部分です。

このような場合は、ヘッダーの位置を特定して、その上にある行をまとめて削除する方法が便利です。


先頭数行を削除する例

削除する行数が毎回決まっているのであれば、単純に指定する方法が使えます。

Sub DeleteTopRows()

    Dim ws As Worksheet
    Set ws = ActiveSheet

    '上から3行削除する例
    ws.Rows("1:3").Delete

End Sub

行数が固定であれば、この方法が最も簡単です。

ただし、ファイルによって不要な行数が変わる場合には向いていません。


ヘッダーより上の行を削除する

ファイルによってヘッダーの位置が変わる場合は、ヘッダーに含まれる文字を検索して、そこより上の行を削除する方法が使えます。

たとえば、ヘッダーに「商品名」という文字が必ず含まれている場合は、次のようにできます。

Sub DeleteRowsAboveHeader()

    Dim ws As Worksheet
    Dim headerCell As Range
    Dim headerKeyword As String

    Set ws = ActiveSheet

    'ヘッダーに含まれる文字を指定
    headerKeyword = "商品名"

    Set headerCell = ws.Cells.Find( _
        What:=headerKeyword, _
        LookAt:=xlWhole, _
        LookIn:=xlValues)

    If headerCell Is Nothing Then
        MsgBox "ヘッダーが見つかりませんでした。"
        Exit Sub
    End If

    'ヘッダーより上の行を削除
    If headerCell.Row > 1 Then
        ws.Rows("1:" & headerCell.Row - 1).Delete
    End If

End Sub

この方法なら、たとえば

タイトル
2026年8月分
作成日:2026/8/1

商品名,数量,金額
商品A,10,5000

のようにヘッダーの位置が変わっても、「商品名」が見つかれば、その上の行をまとめて削除できます。

実務での使い方

システムによって先頭に入るタイトルや出力日時などの行数が変わる場合に便利です。

「3行削除」のように固定するのではなく、「ヘッダーを探して、その上を削除する」ことで、ファイルの形式変更にも対応しやすくなります。


特定の文字を含む行を削除する例

「不要行」という文字を含む行を削除する場合は、次のような方法もあります。

Sub DeleteRowsByKeyword()

    Dim ws As Worksheet
    Dim r As Long

    Set ws = ActiveSheet

    For r = ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row To 1 Step -1

        If InStr(ws.Cells(r, 1).Value, "不要行") > 0 Then
            ws.Rows(r).Delete
        End If

    Next r

End Sub

1列目のセルに「不要行」という文字を含む行が削除されます。


特定の文字を含む列を削除する例

不要な列を削除したい場合には、次のような処理もできます。

Sub DeleteColumnsByKeyword()

    Dim ws As Worksheet
    Dim c As Long

    Set ws = ActiveSheet

    For c = ws.UsedRange.Columns(ws.UsedRange.Columns.Count).Column To 1 Step -1

        If InStr(ws.Cells(1, c).Value, "不要列") > 0 Then
            ws.Columns(c).Delete
        End If

    Next c

End Sub

1行目のセルに「不要列」という文字を含む列が削除されます。


読み込み後にヘッダーより上の行を自動削除するテンプレート

CSVの読み込みと不要行の削除を一つにまとめると、次のようになります。

Sub ReadCSVAndClean()

    Dim filePath As Variant
    Dim ws As Worksheet
    Dim headerCell As Range
    Dim headerKeyword As String

    filePath = Application.GetOpenFilename("CSVファイル,*.csv")

    If filePath = False Then Exit Sub

    Workbooks.Open filePath

    Set ws = ActiveSheet

    'ヘッダーに含まれる文字を指定
    headerKeyword = "商品名"

    Set headerCell = ws.Cells.Find( _
        What:=headerKeyword, _
        LookAt:=xlWhole, _
        LookIn:=xlValues)

    If headerCell Is Nothing Then
        MsgBox "ヘッダーが見つかりませんでした。"
        Exit Sub
    End If

    'ヘッダーより上の行を削除
    If headerCell.Row > 1 Then
        ws.Rows("1:" & headerCell.Row - 1).Delete
    End If

End Sub

CSVを開いた直後にヘッダーより上の不要な行を削除できるため、毎月の定型業務がとても楽になります。


複数形式に対応できる汎用読み込みテンプレート

ここからは、CSVだけでなく複数形式に対応できる汎用コードです。

Sub ReadAnyFile()

    Dim filePath As Variant

    filePath = Application.GetOpenFilename( _
        "すべてのファイル,*.*," & _
        "CSV,*.csv," & _
        "テキスト,*.txt," & _
        "Excel,*.xlsx;*.xlsm")

    If filePath = False Then Exit Sub

    Select Case LCase(Right(filePath, Len(filePath) - InStrRev(filePath, ".")))

        Case "csv", "txt"
            Workbooks.Open filePath

        Case "xlsx", "xlsm"
            Workbooks.Open filePath

        Case Else
            MsgBox "対応していない形式です"

    End Select

End Sub

拡張子を判定して処理を分岐することで、CSV・TXT・Excelなど複数の形式をまとめて扱えるようになります。

実務での使い方

「部署によってCSVだったりExcelだったりする」「システムごとに出力形式が違う」といった場合に、ファイル形式ごとに別々のマクロを用意する必要がなくなります。


複数ファイルをまとめて読み込む

毎月の業務では「複数CSVをまとめて読み込みたい」という要望も多いです。

MultiSelect:=Trueを指定すると、複数ファイルを選択できます。

Sub ReadMultipleFiles()

    Dim Files As Variant
    Dim i As Long

    Files = Application.GetOpenFilename( _
        "CSV,*.csv;テキスト,*.txt;Excel,*.xlsx", _
        MultiSelect:=True)

    If TypeName(Files) = "Boolean" Then Exit Sub

    For i = LBound(Files) To UBound(Files)

        Workbooks.Open Files(i)

    Next i

End Sub

複数形式をまとめて読み込めるため、システム出力がバラバラでも対応できます。

実務での使い方

月次の売上データや各拠点のデータなど、同じ形式のファイルを複数処理する業務では、ファイルを1つずつ開く手間を減らせます。


よくあるエラーと対処法

文字化け(Shift-JIS / UTF-8)

UTF-8のCSVは、Excelでそのまま開くと文字化けすることがあります。

CSVの文字コードがUTF-8の場合は、文字コードを指定して読み込む方法などを検討する必要があります。


改行コードの違い(CRLF / LF)

システムによっては、改行コードがLFのみの場合があります。

CSVを読み込んだ際に、意図した位置で改行されない場合は、改行コードの違いを確認してみましょう。


セルに入りきらない

桁数が多い数値や長い文字列を読み込む場合、Excel上で意図せず指数表記になることがあります。

必要に応じて、読み込み後にセルの表示形式を設定しましょう。


拡張子が違う

ファイル名の拡張子だけでは、実際のファイル形式を判断できないケースもあります。

たとえば、.csvと表示されていても、実際にはテキスト形式で出力されている場合があります。


実務で使える応用例

毎月のCSVをまとめて読み込む

複数ファイル読み込みのテンプレートを使えば、毎月の定型業務を自動化できます。

フォルダ内のCSVを全部読み込む

Dir関数を使えば、フォルダ内のファイルを順番に処理できます。

複数形式のファイルをまとめて読み込む

CSV+TXT+Excelなど、複数形式を扱えるようにしておけば、システム出力がバラバラでも対応できます。

読み込んだデータを自動整形する

不要行の削除、不要列の削除、日付変換などを読み込み処理と組み合わせることで、データ加工まで自動化できます。


まとめ

CSV読み込みはExcel業務の中でも頻度が高く、自動化することで毎月の作業時間を大きく削減できます。

この記事では、

  • VBAでCSVを読み込む基本
  • GetOpenFilenameの使い方
  • ヘッダーより上の不要な行を削除する方法
  • 複数形式に対応できる汎用コード
  • 複数ファイル読み込み
  • 読み込み後の整形
  • よくあるエラー対処

以上をまとめて紹介しました。

実務でそのまま使える内容になっているので、ぜひ業務改善に役立ててみてくださいね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次