- ベストアンサー
CSVファイルへの文字列データの書き出しについて
OS:WindowsXP、Excel:2003 です。 Excelマクロ(VBA)で、あるデータをCSVファイルに出力しているのですが、 文字列型(String)を書き出すと、必ずダブルクォーテーションで囲まれます。 CSVへ書き出すときは、そういう仕様になっているということは分かったのですが、 処理の都合上、どうしてもダブルクォーテーションで囲まずに書き出ししたいと思っています。 そういう場合にはどのようにすれば良いのか教えて下さい。 ちなみに、書き出しは「Write」を使っています。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
Write# ステートメントはDOS-BASIC時代からあり、文字列は””で囲むが標準方式であった時代は使っていたものです。今はよく使われるのはどの方式なんでしょうか。 下記はAーE5列の例です。(これもEnd(xlToLeft)で察知にできますが略。) Sub test01() d = Range("A65536").End(xlUp).Row Open "C:\Documents and Settings\XXXXX\My Documents\testc.csv" For Output As #1 For i = 1 To d For j = 1 To 5 If j < 5 Then Print #1, Cells(i, j) & ","; Else Print #1, Cells(i, j) End If Next j Next i Close #1 End Sub で 0,sdfg,7,10, 0 2,5,8,11, 0 3,cvb,9,12, 0 4,0,0,a,f 5,0,0,s, 0 になりました。0の前のスペースが気になるのですが、Trim()をCells()にかぶせるとか。 参考にしてください。
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。#2 の Wendy02です。 >WriteとPrintの違いがいまいちよく分からないのですが、 >Writeだとカンマ区切りでの出力になり、 >Printでは区切りがないという理解でよいのでしょうか? それはそうなんですが、コード全体の考え方が違います。 以下は、最も簡単な例ですが、以下のように、ループで、buf に溜めておいてから、出力するという方法を取ります。つまり、もしも、文字列のみに、クォーテーションをつける時などは、QT="""" などと変数を置いて、囲んで出力させます。ですから、圧倒的に、Print ステートメントで出力するほうが多いです。 Sub OutPutCsv() Dim rng As Range Dim r As Variant Dim i As Long Dim buf As String Dim Fno As Integer Const FNAME As String = "myCsv1.csv" Set rng = Range("A1").CurrentRegion Fno = FreeFile() Open FNAME For Output As #Fno For Each r In rng.Rows For i = 1 To r.Columns.Count buf = buf & "," & r.Cells(1, i).Value Next If Len(buf) > 1 Then Print #Fno, Mid$(buf, 2) End If buf = "" Next r Close #Fno MsgBox "出力しました。!" End Sub ※ただし、実際のコードは、もう少し複雑になることが多いです。
お礼
ご回答ありがとうございました! printステートメントでは1行分を一気に出力する、という使い方をするんですね。 そのほうが処理速度があがりそうですね。 ありがとうございました☆
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
WSH のTextStream の Write または WriteLine を使う
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 Write ステートメントで、カンマ区切りはしていらっしゃると思いますから、後は、Print ステートメントに換えてください。
お礼
ご回答ありがとうございました。 writeステートメントを単純にPrintステートメントに変更しただけでは出力形式が変わってしまいましたが、 少し処理をはさむことで、うまく出力されました。 ありがとうございます! ところで、WriteとPrintの違いがいまいちよく分からないのですが、 Writeだとカンマ区切りでの出力になり、 Printでは区切りがないという理解でよいのでしょうか?
- cockerel
- ベストアンサー率46% (253/548)
>文字列型(String)を書き出すと、必ずダブルクォーテーションで囲まれます。 少なくとも私の知る限り、ダブルクォーテーションで囲まれる文字列は、セル内に改行を含むものだけのようです。もしそのとおりであれば、セル内の改行を取り除けばよいと考えられます。 検索と置換によりセル内の改行(ctrl+J)を代用文字に全置換し、エクスポートした後に、代用文字をインポート先のフィールド内改行文字(アプリケーションによって異なります)に置換すればよいと思われます。 はずれでしたらごめんなさい。
お礼
ご回答いただきありがとうございます。 せっかくお答えいただいたのですが、 今回のデータは別ファイルから読み込んできたものを加工して書き出すものですので、 直接セルのデータを扱うものではありません。 説明不足で非常に申し訳ございませんでした。 ありがとうございました。
お礼
ご回答いただきありがとうございました。 アドバイス通り、 (前)write #intFF, intCode, strName, intNo,・・・ ↓ (後)print #intFF, intCode & "," & Trim(strName) & "," & ・・・ と変更したところ、理想通りの出力になりました。 本当にありがとうございました☆