dポイントプレゼントキャンペーン実施中!

「よくある質問」とはちょっと違うと思います。

あるCSVファイルを、そのままダブルクリックするとエクセルで開いてくれるPCがあります。
そのようにして開くとレイアウト崩れはありません。

で、同じCSVファイルをエクセルの「データ」→「外部データの取り込み」→「テキストファイル」で読み込むと、レイアウトが崩れてしまうのはなぜでしょうか。

なぜこのような質問をするのかというと、ちょっと説明が難しいのですが、なるべく簡潔に箇条書きにしてみます。


1 まず、このCSVファイルは自社で使っているオリジナルのシステムがCSV形式で吐き出すファイルであるという事実

2 このファイルは、ところどころ長文があり、セル内で改行が必要。なので長文の部分はダブルクォーテーションで改行を含め全体を囲んである。

3 従来はCSVファイルをそのままダブルクリックして開いて、内容をチェックする時、担当者がエクセル上でセル幅や高さをマウスで調節して文章を読んでいた。なお、その際にレイアウト崩れは発生したことがないので、もともとのファイルのCSV形式はちゃんと整って吐き出されているものと思われる。

4 しかし、いちいち手動でそんなことをするのは大変だろうと、私がマクロでCSVファイルを読み取り、自動的にセル内の文章を全部表示できるサイズに各行や列を自動調節できるようにしたいと考えた。

5 具体的には、まずマクロを記録したエクセルファイルを開き、そこから次のシートに当該のCSVファイルを読み取らせればよかろうと考えた。

6 ところが、シートにCSVファイルを読み込ませるために冒頭のような読み込み作業を行ったら、同じエクセルの同じバージョン、同じPCなのにも関わらず、レイアウトに崩れが生じた。


7 具体的にどの部分でレイアウト崩れが起きているのかをテキストエディターで調べると、やはり長文内の改行部分で次のセルに移動してしまっている。

8 しかし、改行部はダブルクォーテーション内に収まっており、(そうでなかったらCSVファイルを直接ダブルクリックしてエクセルを開いた際にもレイアウト崩れが生じていたはず)自分でも訳がわからなくなる。

9 つまり、CSVファイルをテキストデータとして読み込んだ際、設定で「カンマでセル移動、ダブルクォーテーションを「文字列の引用符」に指定しているにも関わらず、エクセルがダブルクォーテーションを無視しているとしか考えられない

10 なぜこのような違いが同じエクセルで生じるのかがわからない

11 いろいろ調べると、「ひょっとして改行コードの解釈の問題(例のLF+CRの問題)か?もしくはダブルクォーテーションのコードの解釈の違いがあるのか??」と思い当たる。


…と、以上のような経緯があったわけです。

それにしても不可解な話なので、どなたかエクセルに詳しい方の解説がいただけたらなあ…と思うのですが、いかがでしょうか。

もしくはどこかに、「一発でCSVファイルを正しく読み込んでくれるモジュールがあるよ」的なアドバイスをいただけると非常に助かります。
よろしくお願いいたします。長文失礼いたしました。

A 回答 (1件)

こんにちは。



>「ひょっとして改行コードの解釈の問題(例のLF+CRの問題)か?
最初にネックになるのは、それです。CSVは、基本的には、Unix型、Win/Dos型、Mac型と三種類あって、CSV代表的なのは、Unix型です。私は、Win/Dosがほとんどですので、Unix型が標準なのに、それに慣れていないせいか、とてもややこしく感じます。

>テキストエディターで調べると、長文内の改行部分で次のセルに移動してしまっている。

私は、CSVインポートが失敗した時は、「NotePad++」を使って、調べることが多いです。(便利なツールですが、インストールが面倒で、使用方法も重装備でややこしいです。)ただ、これでなくても、テキストエディタで、改行コード/復帰コードの見分けの付くものがありますから、それでもよいです。

>もしくはダブルクォーテーションのコードの解釈の違いがあるのか
そのとおりです。私は、Excelの問題だと思っています。それは、文字型と数値型の区別がないということです。全部、Variant型(中間型)になってしまいます。

そのデリミタ(,)といっしょについている改行コードやバイナリコードが、分かりさえすれば、半分は解決すると思うのです。残りの半分は、今度こそ、本格的に、バイナリエディタあたりで、調べないといけない種類です。ここらになると特殊すぎて、VBAの教本でしかやったことはありません。

>「一発でCSVファイルを正しく読み込んでくれるモジュールがあるよ
データベースのテキストデータ用のフリーツールを、「窓の杜」で見た記憶はあるのですが、Excelに直接インポートとなると、個別のモジュールを作らないと、既存のツールで提供しても必ずしもうまくいくとは思えません。Excelに入れても、不要な機能も多く入って重くなってしまいかねません。

ヒントだけになりますが、基本的には、以下のようなスタイルのVBAでするしかないのかなって思います。VBAが分かれば、イメージは沸くと思います。

  FNum = FreeFile()
  Open FileName For Input As #FNum
  Do While Not EOF(FNum)
   Line Input #FNum, textLine
   iCount = iCount + 1
   myArray = Split(textLine, ",") 'デリミタは、「,」●
   Cells(iCount, 1).Resize(, UBound(myArray) + 1).Value = myArray
  Loop
  Close #FNum

●の前処理なら、textLineに、Replace関数を使います。
"" (ダブルクォーテーション)は、一応、削除になります。
改行コード(LF)と復帰コード(CR)が分かれている場合は、置換値のvbCrLfは、そのまま使えないこともあります。その置換の組み合わせを考えながら、進めないといけません。また、セル内改行のLFコードがあるようですから、例えば、一端別のものに置き換えるとかして、たぶん、二回か三回の置換になるような気がします。今のところは、想像の範囲です。

>自動的にセル内の文章を全部表示できるサイズに各行や列を自動調節できるようにしたい
なお、これは、インポートが完成してからで、今、ここでは、後にしてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!