(VBA) Input # の仕様

CSV ファイルを読み込むマクロを作る時にいろいろ調べたのでメモしておく。

  • 読み込んだデータは Shift-JIS として扱われる。
  • 一回の実行でデリミタまで読み込む。デリミタはカンマと改行、終端側の引用符。
  • 改行として扱われるのは CRLF と CR。LF は文字データと同等に扱われる。

データバイナリ改行として処理
CRLF0D0A
CR0D
LF0A×

  • 読み込んだデータから空白文字を除いて、最初に現れた文字がダブルクォートだった場合、そのダブルクォートは引用符として扱われる。
    • 引用符で始まった場合、次のダブルクォートまたは改行までが一つの値と見なされる。このため、引用符で囲まれた値の中にダブルクォートを含める事はできない。
    • 引用符に囲まれた中に現れたカンマはデリミタではなく文字データとして扱われる。
  • 空白文字は、スペースとタブ。
  • スペース、カンマ、ダブルクォートは全角も有効。
    • 読点はカンマ扱いされない。

文字Shift-JIS コードカンマとして処理
8141×
8143

    • 引用符として扱われるのは「”」 だけ。

文字Shift-JIS コード引用符として処理
8167×
8168
?8780×

  • 読み込んだデータからは以下が除去される。
      • 先頭および末尾の空白文字
      • 引用符としてのダブルクォート
      • デリミタ
    • 除去の順番は空白文字 → 引用符。よって引用符に囲まれた空白文字は除去されない。
    • 末尾の引用符が無い場合でも先頭の引用符は除去される。


例 1

"ABC""DEF"

先頭のダブルクォートは引用符として処理される。
次のダブルクォートまでが一つの値として処理されるので「"ABC"」までが読み込まれる。
引用符は除去される。
取得される値は「ABC」
もう一度実行すると「DEF」が取得される。


例 2

"ABC,

先頭のダブルクォートは引用符として処理される。
終端側のダブルクォートが存在しないため「"ABC,」まで一行全て読み込まれる。
途中のカンマは引用符の中にあるためデリミタとしては処理されない。
先頭のダブルクォートは引用符として扱われているため除去される。
取得される値は「ABC,」


例 3

A"B",C

ダブルクォートが含まれているが先頭ではないので文字データとして扱われる。
引用符ではないので除去されない。
取得される値は「A"B"」
もう一度実行すると「C」が取得される。