【Excel・Access】セル内で改行されているcsvファイルの扱い方

Access

ExcelおよびAccessにて、下図のようにセル内で改行されているcsvファイルの扱い方について、ご説明します。
「そもそもそんなcsvファイルを作るなよ!」と言われると、ごもっともですが、そうは言ってもスキルの低い顧客を担当する場合など、このようなcsvファイルを扱わざるを得ないことがあります。
そこで、この記事を書くことにしました。
※「セル」って表計算ソフトの用語なので、csvファイルに「セル」という言葉を使うのは不適切かもしれませんが、わかりやすく「セル」という用語で表現しました。

前提条件

まずは、csvファイルがセル内で改行されている場合は、改行されいてるセルがダブルクォーテーションで囲まれていることが必須です。
そうでないと、読み取ることが出来ません。
※どうしてもと言うなら、vbaを使ってファイルを1行ずつ読み取って、1行あたりのカンマの数が足りなければ次の行をつなげるとかすれば、出来ないことはありませんが、強引な手段であり、データ形式に不整合などがあっても検知できないリスクもあります。

Excelでの開き方

正しい扱い方

拡張子が「csv」になっていれば、エクスプローラーでファイルをダブルクリックすれば、下図のようにセル内の改行を考慮して、普通にExcelで開くことが出来ます。

正しく扱えない方法

しかし、拡張子が「csv」以外(txtなど)では、正しく開くことが出来ません。
Excel上で[ファイル]→[開く]でファイルを指定すると、下図のように「テキストファイルウィザード」が起動しますが、改行された項目がセル内におさまってくれません。
そのため、拡張子を「csv」に変えて開く必要があります。

ExcelのVBAでの扱い方

正しい扱い方

ExcelのVBAで扱う場合は、Excelのブックを開くように、

Workbooks.Open "csvファイルのフルパス"

で開いて下さい。
VBAで扱う場合も、拡張子が「csv」になっている必要があります。

正しく扱えない方法①

以下のように、拡張子が「csv」以外では正しく開けません。そのため、拡張子を「csv」に変えて開く必要があります。

Workbooks.Open "C:\work\サンプルファイル.txt"

正しく扱えない方法②

また、「Line Input」で1行ずつ読む方法でも、正しく扱えません。

Dim buf As String

Open "C:\work\サンプルファイル.csv" For Input As #1
Do Until EOF(1)
    Line Input #1, buf
    Debug.Print buf
Loop
Close #1

Accessでの扱い方

Accessでは、手動でもVBAでも、セル内の改行を考慮してcsvファイルをインポート出来ます。
また、拡張子が「csv」以外(txtなど)でも大丈夫です。

手動でインポートする場合

下記画面は、Office2021です。Officeのバージョンによって、インターフェースが多少異なる可能性があります。
[外部データ]→[新しいデータソース]→[ファイルから]→[テキスト ファイル]を選択します。

テキストインポートウィザードで、[区切り記号付き]を選んで下さい。

[フィールド区切り記号]を「コンマ」、[テキスト区切り記号]を「”」にして下さい。
csvファイルにヘッダーがある場合は、[先頭行をフィールド名として使う]にもチェックしましょう。
※[テキスト区切り記号]の指定を忘れると、正しく取り込めませんので、ご注意下さい。

あとは、[次へ]で画面を進めていけば、下図のようにセル(Accessの場合は「フィールド」と言ったほうが適切かと思います)内の改行を考慮して、テーブルに取り込めます。

VBAでインポートする場合

以下の構文で、csvファイルをテーブルにインポートできます。
※長くて見づらいので、途中で改行しましたが、もちろん1行で書いても大丈夫です。

DoCmd.TransferText acImportDelim,《インポート定義名(省略可能)》, _
    《インポート先のテーブル名》, _
    《インポートするファイルのフルパス》, _
    《ヘッダー有無:Trueが「あり」、Falseが「なし」》

例:

DoCmd.TransferText acImportDelim, , _
    "サンプルファイル", _
    "C:\work\サンプルファイル.csv", _
    True

実行すると、上記の手動インポートの例と同様に、改行が考慮された状態でテーブルにインポートできます。

補足:セル内改行の改行コードについて

改行コードについては、別の機会に改めて説明しようと思いますが、Accessの説明をしたついでに、触れておきます。
上記の例で使用したcsvファイルは、Windows PCのテキストエディタで手作成しました。

Windowsで扱う改行コードは、16進のコードにすると「0x0D」+「0x0A」の2バイトで構成されます。
(VBAでは、「VbCrLf」という定数で表せます。)

一方、Excelのセル内改行では、改行コードは「0x0A」の1バイトとなります。
(VBAでは、「VbLf」という定数で表せます。)


この結果、何が起きるかというと、「Excelでセル内で改行されたシートを作る ⇒ csv形式で保存 ⇒ 上記の方法でAccessにインポート」を行うと、下図のように改行されていないように見える状態でインポートされます。

しかし、住所のフィールドにカーソルを当てて、キーボードで[→]キーを押していくと、「県」と「相」の間に見えない文字があるかのように、[→]キーを1回多く押さないとカーソルが右に進みません。
また、「神奈川県相模原市」の部分をAccessからテキストエディタにコピペすると、改行が入っていることがわかります。
改行コードの違いを知らないと、予期せぬ事象が起きて手こずる可能性がありますので、ご説明しました。

まとめ

セル内で改行されているcsvファイルの扱い方

  • 前提として、改行されいてるセルがダブルクォーテーションで囲まれていることが必須
  • 拡張子が「csv」になっていれば、エクスプローラーでファイルをダブルクリックすれば、改行を考慮した状態でExcelで開ける
  • ExcelのVBAで扱うには、ブックを開くように「Workbooks.Open 《ファイルのフルパス》」でcsvファイルを開く(拡張子が「csv」になっている必要がある)
  • Accessでは、手作業・VBAともに、セル内の改行を考慮してcsvファイルをインポート出来る

コメント

タイトルとURLをコピーしました