excel

【Excel】エクセルでテキストファイルを読み込む方法(VBA)

VBAでテキストファイルを読み込む基本手順 - ファイルパスの指定
当サイトでは記事内に広告を含みます

ExcelでCSVやTXT形式のテキストファイルを扱う際、毎回画面から取り込む作業を繰り返していると、処理時間だけでなく設定ミスも増えやすくなります。

VBAを使えば、指定フォルダにあるテキストファイルを開き、区切り文字や文字コードを指定しながらワークシートへ読み込む処理を自動化できます。

この記事では、1行目にヘッダーが含まれるサンプルデータを前提に、テキストファイルをExcelへ安全かつ実用的に取り込むVBAを解説します。

取り込みで押さえたいポイント

・OpenTextでCSVや区切り文字付きTXTを開く

・QueryTablesで既存シートへデータを展開する

・FileSystemObjectで1行ずつ柔軟に読み込む

サンプルとして、顧客ID、氏名、売上金額がカンマで区切られたCSVファイルを使用します。

 

VBAでテキストファイルを読み込む基本手順

A B C
顧客ID 氏名 売上金額
C001 田中 恒一 125000
C002 佐藤 美咲 98000

それではまず、VBAでテキストファイルを読み込む基本的な流れについて解説していきます。

 

読み込み先シートの準備

最初に、データの取り込み先となるワークシートを用意します。

ここでは、シート名を「取込結果」とし、既に入力されている内容は削除してから新しいデータを配置するものとします。

取り込み前に古いデータを消去する処理を入れておくと、前回分の行が残る事故を防ぎやすくなります。

1行目はテキストファイル側のヘッダーを取り込むため、Excel側で見出しを事前入力する必要はありません。

シート名は実際のブックに存在する名前と完全に一致させましょう。

全角半角や余分なスペースが異なると、実行時エラーになることがあります。

 

ファイルパスの指定

続いて、読み込み対象となるCSVまたはTXTファイルの保存場所をVBAに指定します。

VBAでテキストファイルを読み込む基本手順 - ファイルパスの指定

固定のファイルを取り込む場合はフルパスを記述し、毎日更新されるファイルを扱う場合はフォルダ内の最新ファイルを探す方法も有効です。

Windowsのパスでは、フォルダ名とファイル名をバックスラッシュでつなげます。

例として、Cドライブ内のDataフォルダにあるsales.csvを指定します。

C:\Data\sales.csv

ファイル名を変更する運用では、固定パスのままでは読み込めないため、命名規則もあわせて確認することが大切です。

 

マクロの実行準備

VBAコードは、AltキーとF11キーで開くVisual Basic Editorから標準モジュールへ貼り付けます。

VBAでテキストファイルを読み込む基本手順 - マクロの実行準備

Excelのリボンに「開発」タブが表示されていない場合は、オプションからリボンのユーザー設定を開き、開発にチェックを入れると操作しやすくなります。

マクロを保存するブックは、拡張子をxlsmにして保存してください。

xlsx形式のまま保存すると、VBAプロジェクトを保持できません。

【操作のポイント】最初はコピーした元ファイルを使って試し、読み込み結果と元のテキスト内容を見比べましょう。

 

OpenTextによるCSVファイルの取り込み

テキストの行 内容
1 顧客ID,氏名,売上金額
2 C001,田中 恒一,125000
3 C002,佐藤 美咲,98000

続いては、OpenTextメソッドを使ってCSVファイルを開く方法を確認していきます。

 

OpenTextを使った基本コード

OpenTextによるCSVファイルの取り込み - OpenTextを使った基本コード

OpenTextは、テキストファイルを新しいブックとして開くためのメソッドです。

カンマ区切り、タブ区切り、固定長などを指定できるため、形式が決まったファイルを素早く読み込む処理に向いています。

Sub OpenTextでCSVを開く()

    Workbooks.OpenText _
        Filename:="C:\Data\sales.csv", _
        DataType:=xlDelimited, _
        Comma:=True, _
        Local:=True

End Sub

DataTypeにxlDelimitedを指定すると、区切り文字を基準として列を分割します。

CommaをTrueにすると、カンマを列の境目として認識します。

LocalをTrueにすると、WindowsとExcelの地域設定に合わせて処理しやすくなります。

 

開いたブックからデータを転記する処理

OpenTextで開いたファイルは別ブックになるため、必要に応じて作業中のブックへ値をコピーします。

OpenTextによるCSVファイルの取り込み - 開いたブックからデータを転記する処理

以下のコードでは、取り込み用CSVの使用範囲を、マクロを保存したブックの「取込結果」シートへ貼り付けます。

Sub CSVを開いて転記する()

    Dim wbCSV As Workbook
    Dim wsDest As Worksheet

    Set wsDest = ThisWorkbook.Worksheets("取込結果")
    wsDest.Cells.Clear

    Workbooks.OpenText Filename:="C:\Data\sales.csv", _
        DataType:=xlDelimited, Comma:=True, Local:=True

    Set wbCSV = ActiveWorkbook

    wbCSV.Worksheets(1).UsedRange.Copy _
        Destination:=wsDest.Range("A1")

    wbCSV.Close SaveChanges:=False

End Sub

ThisWorkbookはコードを保存しているブックを表します。

一方でActiveWorkbookは、その時点で画面上で選択されているブックを表すため、複数ブックを開く処理では使い分けが必要です。

 

文字化けを防ぐ文字コードの考え方

CSVを開いたときに日本語が文字化けする場合、原因は文字コードの違いである可能性があります。

Windows環境で作られたCSVにはShift-JISが多く、Webサービスから出力したCSVにはUTF-8が使われることがあります。

OpenTextではOriginの指定で読み込み元の文字コードを調整できます。

UTF-8形式のファイルを扱う場合の指定例

Origin:=65001

文字化けを確認したら、まず元のテキストファイルをメモ帳で開き、保存形式を確認すると原因を絞り込みやすくなります。

【操作のポイント】UTF-8とShift-JISを混在させず、受け取るファイルの文字コードを運用ルールとして統一しましょう。

 

QueryTablesによる既存シートへの展開

取込先 開始セル 読み込み形式
取込結果 A1 カンマ区切り

続いては、既存のワークシートへ直接データを配置できるQueryTablesについて確認していきます。

 

QueryTablesの特徴

QueryTablesは、外部テキストファイルの内容を指定セルから展開する機能です。

別ブックを開いてコピーする手順を省けるため、定型的なインポート処理に適しています。

取り込み先をRangeで明示できるので、既存の集計表の下へデータを追加する処理にも応用できます。

1行目のヘッダーもデータとして取り込まれます。

既存ヘッダーを残したい場合は、開始セルをA2に変更するか、読み込み後に1行目を削除します。

 

QueryTablesのVBAコード

次の例では、「取込結果」シートのA1セルからCSVデータを読み込みます。

Sub QueryTablesでCSVを取り込む()

    Dim ws As Worksheet
    Set ws = ThisWorkbook.Worksheets("取込結果")

    ws.Cells.Clear

    With ws.QueryTables.Add( _
        Connection:="TEXT;C:\Data\sales.csv", _
        Destination:=ws.Range("A1"))

        .TextFileParseType = xlDelimited
        .TextFileCommaDelimiter = True
        .TextFilePlatform = 65001
        .Refresh BackgroundQuery:=False
        .Delete

    End With

End Sub

TextFileParseTypeでxlDelimitedを指定し、TextFileCommaDelimiterをTrueにすることでカンマ区切りとして扱います。

RefreshのBackgroundQueryをFalseにすると、読み込みが完了するまで次のVBA処理へ進みません。

取り込み直後に集計や書式設定を行う場合はFalseが安全です。

【操作のポイント】一時的に作成されたQueryTableは、取り込み後にDeleteで削除しておくと、同じ処理を繰り返し実行しやすくなります。

 

Excel画面で確認する読み込み結果

取り込み後は、ヘッダーが1行目に入り、各項目がA列からC列へ分割されているか確認します。

sales_import.xlsm – Excel − □ ×
ファイル ホーム 挿入 ページ レイアウト 数式 データ 校閲 表示 開発
太字 B
罫線
中央揃え
fxC001
A B C
1 顧客ID 氏名 売上金額
2 C001 田中 恒一 125000
3 C002 佐藤 美咲 98000
取り込み結果を確認 ➤

赤枠で示したA2セルを選択すると、数式バーには読み込まれた値が表示されます。

文字列が1列にまとまっている場合は、区切り文字の指定が合っていない可能性があります。

カンマではなくタブで区切られたTXTファイルなら、TextFileCommaDelimiterをFalseにし、TextFileTabDelimiterをTrueへ変更してください。

 

FileSystemObjectによる一行単位の処理

処理行 分割後の配置
C001,田中 恒一,125000 A2、B2、C2

続いては、テキストを1行ずつ読み込み、内容を個別に判定できるFileSystemObjectを確認していきます。

 

一行ずつ読み込む利点

FileSystemObjectは、テキストファイルの各行を順番に取得する方法です。

空白行を無視したい場合、特定の文字を含む行だけを取り込みたい場合、行ごとに加工したい場合に役立ちます。

単純なCSV読み込みよりも条件分岐を組み込みやすい点が大きな特長です。

FileSystemObjectを使う方法では、参照設定をしなくてもCreateObjectで実行できます。

 

Split関数を使った列分割

1行分の文字列をカンマで分割するには、Split関数を使用します。

Splitで作られた配列は0番目から始まるため、1列目はdata(0)、2列目はdata(1)として扱います。

1行の文字列

C001,田中 恒一,125000

Split後の配列

data(0)はC001、data(1)は田中 恒一、data(2)は125000

項目数がファイルによって異なる場合は、UBound関数で配列の最後の番号を確認してから処理すると安全です。

 

FileSystemObjectの実用コード

以下のコードでは、1行目のヘッダーを含めてCSVを読み込み、A1セルから順に出力します。

Sub 一行ずつCSVを読み込む()

    Dim fso As Object
    Dim ts As Object
    Dim ws As Worksheet
    Dim lineText As String
    Dim data As Variant
    Dim rowNo As Long

    Set ws = ThisWorkbook.Worksheets("取込結果")
    ws.Cells.Clear

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.OpenTextFile("C:\Data\sales.csv", 1, False)

    rowNo = 1

    Do Until ts.AtEndOfStream
        lineText = ts.ReadLine

        If Len(lineText) > 0 Then
            data = Split(lineText, ",")
            ws.Cells(rowNo, 1).Resize(1, UBound(data) + 1).Value = data
            rowNo = rowNo + 1
        End If
    Loop

    ts.Close

End Sub

Resize(1, UBound(data) + 1)により、分割した項目数に合わせた横幅のセル範囲を取得します。

配列をまとめてセルへ代入するため、セルへ1件ずつ書き込むより処理が軽くなりやすい方法です。

【操作のポイント】氏名や住所にカンマが含まれるCSVでは、単純なSplitだけでは正しく分割できないため、QueryTablesやPower Queryの利用も検討しましょう。

 

取り込み後の整形と集計

顧客ID 氏名 売上金額 判定
C001 田中 恒一 125000 確認済

続いては、読み込んだテキストデータをExcelで使いやすくする整形と集計を確認していきます。

 

見出し行の書式設定

1行目にヘッダーがあるデータでは、見出し行に色と太字を設定すると一覧性が高まります。

取り込み後の最終列を調べ、1行目だけに書式を設定するのが効率的です。

With ws.Range("A1").CurrentRegion.Rows(1)
    .Font.Bold = True
    .Interior.Color = RGB(33, 115, 70)
    .Font.Color = RGB(255, 255, 255)
End With

ws.Columns.AutoFit

CurrentRegionは連続したデータ範囲を自動認識するため、取り込む行数が毎回違っても対応できます。

 

売上金額の合計式

売上金額がC列に読み込まれた場合、最終行の次の行にSUM関数を入れると合計を確認できます。

合計の数式

=SUM(C2:C最終行)

VBAで最終行を取得して数式を入れる場合は、Cells(Rows.Count, 3).End(xlUp).RowでC列の最終データ行を求めます。

1行目はヘッダーであるため、合計範囲は必ずC2から始める点に注意しましょう。

文字列として読み込まれた金額はSUMで計算できないことがあるため、数値化も必要です。

 

数値と日付の型変換

CSVの値は見た目が数値でも、Excel上では文字列になっている場合があります。

売上金額を数値に変換するには、ValueまたはCDblを利用できます。

日付データでは、地域設定によって月日を誤認識する可能性があるため、元ファイルの日付形式を統一することが重要です。

数値化の考え方

セルの文字列が125000なら、Valueで数値として扱える状態に変換します。

【操作のポイント】取り込み直後に数値列、日付列、文字列列を確認し、集計前にデータ型を整えておくと後工程のエラーを減らせます。

 

エラー防止と運用上の注意点

確認項目 確認内容
ファイル存在 指定パスに対象ファイルがあるか
区切り文字 カンマ、タブ、セミコロンのどれか
文字コード UTF-8またはShift-JISか

続いては、VBAでのテキスト取り込みを安定して運用するための注意点を確認していきます。

 

ファイルが存在しない場合の判定

指定したパスにファイルがなければ、OpenTextやOpenTextFileはエラーになります。

Dir関数で存在を確認してから処理を開始すると、利用者に分かりやすいメッセージを表示できます。

If Dir("C:\Data\sales.csv") = "" Then
    MsgBox "対象のCSVファイルが見つかりません。"
    Exit Sub
End If

エラーが起きてから止めるのではなく、事前に条件を確認することが自動化では重要です。

 

ヘッダー行と空白行の扱い

今回のサンプルでは、1行目が顧客ID、氏名、売上金額のヘッダーです。

そのため、データ件数だけを数える場合は、ヘッダーを除いた2行目以降を対象にします。

空白行が末尾や途中にあるときは、Len関数で文字数を判定し、空白行を読み飛ばす処理を追加するとよいでしょう。

ヘッダー付きCSVでは、1行目を項目名として残すか、読み込み後に削除するかを事前に決めておくと処理がぶれません。

 

複数ファイルを扱う運用

日別や月別に複数のCSVファイルを受け取る業務では、フォルダ内のファイルを順に処理する仕組みが便利です。

ただし、対象外のCSVまで取り込むと重複集計につながるため、ファイル名の接頭語や更新日時で対象を限定する必要があります。

読み込み済みファイルを別フォルダへ移動する運用を組み合わせると、二重取り込みの防止に役立ちます。

【操作のポイント】本番運用では、ファイル名、保存場所、文字コード、ヘッダー有無を固定し、仕様が変わったときだけVBAを見直しましょう。

 

まとめ エクセルでテキストファイルを読み込むVBAの方法

Excelでテキストファイルを読み込むVBAでは、用途に応じてOpenText、QueryTables、FileSystemObjectを使い分けることができます。

CSVを別ブックとして開いて確認しながら転記したい場合はOpenTextが分かりやすく、既存シートへ直接展開したい場合はQueryTablesが便利です。

行ごとに条件判定や加工を行いたい場合は、FileSystemObjectとSplit関数を使う方法が適しています。

1行目にヘッダーがある前提をコードと集計式の両方で統一することが、正しい処理結果につながります。

文字コード、区切り文字、ファイルパス、数値のデータ型まで確認し、日常業務で使える安定したインポート処理へ仕上げましょう。