VBAでCSVを読み込む方法

投稿日: 2024年6月21日

VBAを使用してCSVファイルを読み込むための方法を説明します。

Workbooks.OpenTextを使う方法

この方法は、CSVファイルを直接開く際に使用します。

サンプルのcsvデータを用意します。以下のデータを「file.csv」として任意のフォルダに保存します。保存にはUTF-8(BOM付き)で保存してください。

名前,年齢,性別,職業,国籍
山田太郎,30,男,エンジニア,日本
佐藤花子,25,女,デザイナー,日本
参考次郎,20,男,タレント,日本
ジョンスミス,40,男,警察官,アメリカ

メモ帳などで保存するときにエンコードをUTF-8(BOM付き)に指定して保存します。

次にこのコードのファイルパスをcsvが保存しているフォルダに変更します。

Sub ImportCSV()
    Dim filePath As String
    filePath = "C:\path\to\your\file.csv" ' CSVファイルのパスを指定してください

    Workbooks.OpenText Filename:=filePath, Origin:=65001, DataType:=xlDelimited, Comma:=True
End Sub

UTF-8エンコーディングのCSVファイルを読み込む場合は、Workbooks.OpenTextメソッドのOriginパラメータに適切な値を設定する必要があります。65001はUTF-8エンコーディングを表します

ファイルシステムオブジェクト (FileSystemObject) を使う方法

この方法は、より柔軟にCSVファイルを読み込むことができ、セルに手動でデータを挿入することが可能です。

FSOのcsv読み込みの注意点
エンコーディングの対応の引数のformat
object.OpenTextFile (filename, [ iomode, [ create, [ format ]]])
このformatがUnicode 形式とAscii 形式とシステムの既定の設定でファイルを開くことしかできません。日本語のUTF-8にすると文字化けになります。

メモ帳などで保存するときにエンコードをANSIに指定して保存します。昔ははShift_JISというのがありましたがANSIに置き換わりました。

コードを実行する為には「Microsoft Scripting Runtime」のライブラリが必要になります。
VBAエディタで「ツール」→「参照設定」から「Microsoft Scripting Runtime」にチェックを入れてください。

FSOのコードは以下になります

Sub ImportCSV_ANSI()
    Dim fso As Scripting.FileSystemObject
    Dim ts As Scripting.TextStream
    Dim filePath As String
    Dim textLine As String
    Dim rowNum As Long
    Dim colNum As Long
    Dim cellData As Variant
    Dim lineData() As String

    ' ファイルパスを設定
    filePath = "C:\path\to\your\file.csv"
    
    ' FSOを使ってファイルを開く
    Set fso = New Scripting.FileSystemObject
    Set ts = fso.OpenTextFile(filePath, ForReading, False, TristateFalse) ' TristateFalseはANSIを指定
    
    ' シートをクリア
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Sheet1")
    ws.Cells.Clear
    rowNum = 1
    
    ' ファイルを読み込む
    Do While Not ts.AtEndOfStream
        textLine = ts.ReadLine
        lineData = Split(textLine, ",")
        colNum = 1
        
        For Each cellData In lineData
            ws.Cells(rowNum, colNum).Value = cellData
            colNum = colNum + 1
        Next cellData
        
        rowNum = rowNum + 1
    Loop
    
    ' ファイルを閉じる
    ts.Close
    Set ts = Nothing
    Set fso = Nothing
End Sub

「FileSystemObject(FSO)」を作成し、テキストファイルをANSIとして開きます。「TristateFalse」はANSIエンコーディングを指定します。
ファイルを1行ずつ読み込み、カンマで区切られたデータをセルに書き込みます。

このコードを実行することで、ANSIエンコーディングのCSVファイルを正しく読み込み、シートにデータを表示することができます。

記事