CSVファイルを文字列として開きたいが?

Question 26.2   Previous Next
Workbooks.OpenText FileName~で、CSVファイルを文字列として開きたいのですが上手く行きません。
fieldinfo:=Array(Array(1, 2), Array(2, 2)~ という感じで、文字列として開くように指定しているのですが、 なぜか標準で開きます。
私の調べによると、上記と同じファイルで拡張子が".txt"のものは、上手く行きます。 でもあくまで".csv"のファイルを開きたいのです。 どうかお力を貸して下さい。 Excel97を使っています。
Answer   Copyright (C) 2000.3.3 永井善王
郵便番号のように前ゼロが付いた数字などで、文字列として開きたい場合が、しばしばありますね。
私はCSVファイルは滅多に扱わないので、的確な回答ができません。しかし、「お力を貸して…」とのことですので、 いろいろ調べたり試したりしてみて、その結果をまとめました。参考になると良いのですが。
school
Excel がテキストファイルとして開いてくれるものには、ファイル拡張子が
 (A) 'prn' のスペース区切りテキストファイル
 (B) 'txt' のテキストファイル
 (C) 'csv' のCSVファイル があります。
(A) については、ここでは触れません。
(B) と (C) とでは、どこがどう違うのでしょうか。 そして、ExcelのVBAでは、どのようにして読み込まれるのでしょうか。
【 OpenTextメソッド 】

このメソッドは、テキストファイルを分析して1枚のシートに読み込み、新しいブックとして開いてくれます。
構文は次のとおりです。

expression.OpenText(Filename, Origin, StartRow, DataType, TextQualifier, ConsecutiveDelimiter, Tab, Semicolon, Comma, Space, Other, OtherChar,
FieldInfo, DecimalSeparator, ThousandsSeparator)

くわしいことは、
こちら を見ていただくことにして、ここではポイントを押さえてみます。
質問には、
Workbooks.OpenText FileName~ fieldinfo:=Array(1,2),Array(2,2)~として、「文字列として開くように指定している」と書かれています。 たしかに、 FieldInfoは、データを読み込むための各列のデータ形式を示す配列を指定する引数で、その中のArray関数の2番目の引数に2と書かれているのは「文字列」を意味します。もし 1 となっていると「標準」になります。 しかし、この指定が有効になるのは、拡張子が 'txt' のテキストファイルであって、拡張子が 'csv' のCSVファイルに対しては無効と思われます。 なぜでしょうか ・・
【 Openメソッド 】

CSVファイルを作っておいて、実際に Excelでそのファイルを開いてマクロを自動記録してみるとわかるのですが、次のように Openメソッドが使われます。
    Workbooks.Open Filename:="C:\My Documents\YNxv980.csv"
Openメソッドはブックを開くメソッドですが、ご覧のとおりFileName以外の引数はすべて省略されています。
この他の特徴として、拡張子が 'txt'のテキストファイルを開くときのテキストファイル ウイザードが起動されることなく、 すぐにマクロが記録されます。これらを考え合わせると、'csv'と 'txt'は明らかに別ものとして扱われているようです。

Openメソッドの構文は次のとおりです。

expression.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU)

( )の中の引数に、
FieldInfoがないことに気づかれましたか。引数の要点を一覧表にすると、次のようになります。
引 数 説 明
FileName 開くブックのファイル名
UpdateLinks ファイル内のリンクの更新方法
ReadOnly 読み取り専用モードで開く
Format 区切り文字
Password 保護されたブックを開くためのパスワード
WriteResPassword 書き込み保護されたブックに書き込みするためのパスワード
IgnoreReadOnlyRecommended 読み取り専用を推奨するメッセージを非表示にする
Origin テキストファイルの形式 (日本版 Excelでは非サポート)
Delimiter テキストファイル読み取り時の特殊な区切り記号
Editable テンプレートファイルを編集用に開く
Notify ファイルを読み取り/書き込みモードで開けない場合に通知リストに追加 
Converter ファイルを開くときに最初に使うファイルコンバータ
AddToMru 最近使用したファイルの一覧をこのブックに追加
困りました。
CSVファイルは Openメソッドで開くのですが、細かい指定をするすべがありません。 なんとかできないものでしょうか ・・
Excel にズバリの機能がないからと言って、すぐに諦めることはありません。やわらか頭で進みましょう。 いくつかの解決方法があるかと思いますが、ここでは2つ、ご紹介します。

【 1. 読み取ってからなんとかする方法 】
この方法は一概にうまくいくとは限りません。ひとまず Openメソッドで読み取らせてしまいます。次に、文字列にしたい列を選択して、 セルの書式設定で文字列に変更します。その後、必要があれば前ゼロを復活します。

【 2. 読み取る前後で工夫する方法 】
あなたが確認済みのとおり、「拡張子が".txt"のものは、上手く行く」のですから、CSVファイルの拡張子を 'txt'に変更してから OpenTextメソッドで開く方法が考えられます。 「そんなことをするとファイルが壊れてしまうのではないか?」と心配でしたら、コピーしておいてから試してみてください。
警告 拡張子を変更しようとするときに、右図のような警告が表示されたら、「はい」ボタンをクリックします。
CSVファイルは異なるOS(Macintoshなど)で作られたり、ホストコンピュータで作られる場合があるので、一概には言えないかも知れませんが、 カンマ区切りで文字列および値が保存された一般的な形式ならば、試してみる価値があると思います。

注意点としては、
(1) 開く前に変更した拡張子 'csv' を、終了後に 'txt' にもどしておく必要があるかどうか。
(2) これらの機能をマクロに組み込んでおくかどうか。
(3) 不慣れなユーザーなど、マクロの実行が中断されずに安全に実行されるかどうか。
などが考えられます。
拡張子を変更した後のマクロ実行途中で中断すると、拡張子が元にもどらないなどの問題が、発生する場合もあり得ます。
一応、注意して進んでください。

【 参考 】
・ファイル名や拡張子を変更する方法がわからなければ、こちら に掲載済みですから見てください。
・前ゼロを付けて桁数を揃える方法は、
こちら です。

Excel VBA Macro