VBAでエクセルをCSVに変換する方法とは?

このQ&Aのポイント
  • VBAを使用してエクセルファイルをCSVに変換する方法を教えてください。
  • 現在、エクセルファイルをCSVに変換するためにVBAを使用していますが、コンバート先のソフトへの設定が不足しているようです。文字コードをUTF-8に、改行コードをLFに指定する方法を教えてください。
  • 初心者ですが、VBAを使用してエクセルファイルをCSVに変換する方法を教えてください。また、コンバート先のソフトへの設定についても教えてください。
回答を見る
  • ベストアンサー

VBAでエクセルをCSVに変換時

業務上、エクセルファイルのデータをCSV変換し、他のソフトへコンバートする 作業を行う事になったのですが、初心者なので全くわからず、 ネットの力に頼ってVBAでCSV変換するコマンドまでは作成できたのですが、 コンバート先のソフトへは、以下(1)、(2)の設定が不足している事がわかりました。 現在利用しているコマンドにその機能を持たせる事は可能でしょうか。 (1)文字コードをUTF-8へ指定 (2)改行コードをLFへ指定 VBAのバージョン:VisualBasic6.5 Sub Test() Dim ws As Worksheet On Error Resume Next For Each ws In ActiveWorkbook.Worksheets ws.SaveAs ThisWorkbook.Path & "\" & ws.Name & ".csv", xlCSV Next ws End Sub 初めての質問なので内容が解りづらいと思いますが申し訳ありません。 ご回答をお待ちしております。

質問者が選んだベストアンサー

  • ベストアンサー
  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。 一応、仰せのまま、書いてみました。 セル内のカンマ(桁区切りの数値とか)だけは Excelのcsv保存の仕様に合わせて手当てしてますが、 完全とは言えないです。 csv経由で移植する際は  3-11-22 のような(住所の番地だけ抜き出したような)セル値が化けることがあったり、 注意深く作業にあたった方がよいです。 ところで、Excel2007?ですよね? csv以外にも方法があるなら、もっと簡単に出来たりするような気もしますけれど。 大雑把な処理の流れだけコメントにしておきました。 簡単なことしかしてないけれど、易しくはないでしょうね。 とりあえず、試してみてください。 (追記)書いてるうちに回答ありましたが、せっかく書いたので、、、。 Option Explicit Sub Re8057743() ' ' シートデータを "UTF-8" Lf改行 csvテキストで出力 ' ' 解り易くする為に、すべて直値で統一。   Dim oDTObj   As Object ' DataObject   Dim oRegExp   As Object ' RegExp   Dim oADODB_Strm As Object ' ADODB.Stream   Dim ws   As Worksheet   Dim sPath  As String ' Path & "\"   Dim sBuf  As String ' ' 保存先のパス   sPath = ThisWorkbook.Path & "\" ' ' クリップボードからテキストデータを読み込む為の DataObject   Set oDTObj = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") ' New DataObject ' ' テキスト整形用の RegExp(正規表現)   Set oRegExp = CreateObject("VBScript.RegExp")   oRegExp.Global = True ' ' テキストを "UTF-8" で出力する為の ADODB.Stream   Set oADODB_Strm = CreateObject("ADODB.Stream")   oADODB_Strm.Charset = "UTF-8" '  On Error Resume Next ' ?? ' ' シートをループ   For Each ws In ActiveWorkbook.Worksheets ' ' セル範囲をコピー → クリップボードへ ' ' セル範囲は運用に合わせて適宜指定     ws.UsedRange.Copy ' ' テキストデータをクリップボードから DataObject を介して sBufに格納 ' ' この時点では、tsv(tab区切り)テキスト     With oDTObj       .GetFromClipboard       sBuf = .GetText       .Clear     End With ' ' 正規表現でテキストデータを整形     With oRegExp ' ' CrLf を Lf に置換       .Pattern = "\s?\r(\n)"       sBuf = .Replace(sBuf, "$1") ' ' セルの値に"," が含まれるなら、セルの値を DQ(")で括るように置換       .Pattern = "([^\t\n]*\,[^\t\n]*)"       If .Test(sBuf) Then sBuf = .Replace(sBuf, """$1""") ' ' tsv を csv に変換(タブをカンマに置換)       .Pattern = "\t"       sBuf = .Replace(sBuf, ",")     End With ' ' ストリームファイルで "UTF-8" 出力     With oADODB_Strm       .Open       .WriteText sBuf       .SaveToFile sPath & ws.Name & ".csv", 2       .Close     End With   Next ws   Application.CutCopyMode = False   Set oDTObj = Nothing:  Set oRegExp = Nothing:  Set oADODB_Strm = Nothing End Sub

dp05060
質問者

お礼

早速上記の構文で実践させていただきました 完璧です。どうお礼をしたらよいのかわかりません。 本当にどうもありがとうございました!!

その他の回答 (2)

noname#217196
noname#217196
回答No.3

技術的には可能ですが、あなたがスムーズかつメンテナンスしやすいようにプログラミングできるかどうか、ちゃんと検証できるかどうかは別の話です。 テキストファイル出力方法、テキストファイル出力時の文字エンコード指定方法、OSによる文字エンコード/BOM/改行コードの違いを技術解説書等(Webサイトだと、Excelの学校、moug、Office TANAKA、インストラクターの独り言などがExcelの高度な使い方を知るには有効です)で勉強の上で、Excel VBAでプログラミングするか、いったん出力したCSVファイルに対し、ファイル・コンバータやテキスト置換ユーティリティツール(nkfとか)で処理するか(FTPツールでも可)、TeraPad、秀丸エディタなどのテキストエディタでCSVファイルを開いて、文字エンコードと改行コードを指定して保存しなおしても対応可能です。 運が良ければ、FFFTPのようなFTPツールやnkfでWindows用のテキストファイルからたとえばLinux用のテキストファイルに変換しておしまいです。いずれにしろ、コンバート先のソフトが受け入れ可能なCSVファイルの仕様定義書で、ほかにも事前チェックしておかないとまずいこと(日付書式、項目ごとの制約条件、最大行数、ファイル名規則など)が抜け落ちていないか確認してからでないと完了のめどが立たないでしょう。使ってみてから不足している機能や詰めが甘い仕様が判明する都度プログラムの修正が必要になり一進一退を繰り返すのは避けたいところです。 なお、ExcelのCSVファイル出力は、Excelで開く上では目立ちませんがバグっぽい点があるので、単純にSaveAsでxlCSVを指定して安心しないでください。ExcelがCSVファイルに出力する単位はたしか16行(バージョンによって異なる可能性があります。また新しめのバージョンで以下の問題が解消されている可能性もあります)で、16行単位ごとにチェックして最大項目数を決めています。このためデータの入力がないセルが最終項目に16行単位で連続してあるときは期待した最大項目数より少なく出力されてしまいます。逆に最終項目列の右側にあやまって入力したデータを削除してもダーティ・セルとしてマーキングされて、最大項目数より多く出力されることがあります。書式設定により数値データの右側に空白文字がつくケースもあります。ほかに悩ましいのが、Excelのワークシート上では正常に表示された文字や記号が、CSVファイルへの出力時にUTF16LBからSHIFT JIS(MS932)へコンバートされることで文字化けする可能性が出てくること。round trip conversionが保証されていない符号類(代表例は、~)をデータに含んでいる場合も厄介です。CSVファイルに出力する前にエラーデータのあるセルを特定できる仕組みか、出力したCSVファイルに対しエラーデータを全件特定できる仕組みがふつうは必要です。 インポート先のシステムが、定義しているインポート可能なCSVファイルは、項目名つきか否か、データ項目値は二重引用符で括る(データ自体に二重引用符を含む場合はエスケープ処理を施す。この指定は、数値の書式に桁区切りカンマを使用しているなどデータ自体にカンマを含むことを許容している場合に必要になります)のか否か、特定項目の文字長や数値の有効桁数に制限があるか否か等、システムによって様々なので、対応可能なプログラムを自作するなり、業者に開発依頼して用意しておくことも検討するとよいと思います。

dp05060
質問者

お礼

『FFFTPのようなFTPツールやnkfでWindows用のテキストファイルからたとえばLinux用のテキストファイルに変換』 そんな事もできるんですね・・・まったく知りませんでした。 ご教授いただいた内容について、今後のお役に立てさせて頂きたいと思います。 皆さん本当にご親切で、勇気を出して質問して本当によかったです どうもありがとうございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

UTF-8のCSVを読む方は作成した(切り貼りした)事がありましたが、書き出す方はストックになかったのでやってみました。 参考URLのコードをお借りしてアレンジすると、こんな感じです。 保存するセル範囲をUsedRangeで取得しておりますが、意図に反する場合もあるかと思います。 また、ADODB.Streamを都度作成しては破棄しているので効率は悪いと思いますが、ブック一つ分のシート数程度なら問題にならないでしょう。 Microsoft Active Data Object 2.x Library(最近では...Object 6.xというのもありますが)に参照設定が必要です。 Sub test() Dim ws As Worksheet On Error Resume Next For Each ws In ActiveWorkbook.Worksheets makeUTF8CSV ws.UsedRange, ThisWorkbook.Path & "\" & ws.Name & ".csv" Next ws End Sub Sub makeUTF8CSV(targetRange As Range, destFilePath As String) Dim i As Long Dim j As Long Dim strList As String Dim adoSt As ADODB.Stream Set adoSt = New ADODB.Stream With adoSt .Type = adTypeText .Charset = "UTF-8" .LineSeparator = adLF .Open End With With targetRange For i = 1 To .Rows.Count strList = "" For j = 1 To .Columns.Count If j > 1 Then strList = strList & "," End If strList = strList & .Cells(i, j) Next adoSt.WriteText strList, adWriteLine Next End With adoSt.SaveToFile destFilePath, adSaveCreateOverWrite adoSt.Close Set adoSt = Nothing End Sub ※参照設定については下記ページの下半分をご覧下さい。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_130_030.html

参考URL:
http://excel-ubara.com/EXCEL/EXCEL220.html

関連するQ&A

  • (VBA)書式が変更されてしまいます

    ↓SaveAsで保存すると書式が変更されてしまいます。 ActiveWorkbook.SaveAs FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close False ネットで↓の回避策を見つけたのですがうまくいきません。 **************************************************************** Sub CSV_Save() 'Sheet1をCSV形式で保存します。 With ActiveWorkbook.Sheets(1) 'A1:A10まで日付あるいは通貨設定のデータが入っているとします。 For Each rng In Range("A1:A10") 'テキスト文字列に変更します。 rng.Value = "'" & rng.Text Next rng End With ActiveWorkbook.SaveAs FileName:="C:\test.csv", FileFormat:=xlCSV End Sub **************************************************************** ご指導お願いします。

  • ExcelのマクロでCSVファイルを開くと遅いのですが

    ExcelのマクロでCSVファイルを開くと遅いのですが速く開く方法はありますか? 普通にファイル-開くに比べてかなり遅いです。 下記のVBAで記述してあります。 Workbooks.Open Filename:=fname ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlCSV, _ CreateBackup:=False ActiveWorkbook.Close savechanges:=False

  • エクセルからCSVファイルに出力したい?

    エクセルのシートからマクロを使ってCSVファイルに出力したいです。 そこで調べたのですが、 http://oshiete1.goo.ne.jp/kotaeru.php3?q=2376607 こちらの質問で以下のようなコードが参考になりました。 Sub Macro1() Dim myBook As String myBook = ActiveWorkbook.FullName myBook = Left(myBook, Len(myBook) - 3) & "CSV" ActiveSheet.Copy ActiveWorkbook.SaveAs Filename:=myBook, FileFormat:=xlCSV ActiveWindow.Close False End Sub このコードではCSVのファイル名がエクセルシートのファイル名になってしまいます。 今回の質問ですが、CSVファイルを違う名前で保存するにはどのようにすればいいのでしょうか? (CSVファイルの名前は常にabc.csvで保存するものとします)

  • Excel VBAでCSV出力をすると実行時エラー

    Excelで品番ごとの数量データなどを他のシステムに取り込むためにCSV形式で出力するプログラムをVBAで作りました。 CSV出力を実行すると 「実行時エラー1004: 'ファイル名.csv'は読み取り専用です。アクセスできません。」 のエラーが出てしまいます。 このプログラムを作成したのは去年であり、Windows XPとExcel2003の環境では一度も出なかったエラーなのですが、PCの更新で新しい端末がWindows7とExcel2010となってから出るようになりました。 コードは以下の通りです ================================================================== 11桁の品番の間のハイフンや後ろに記号などを削除してTempシートのA列にデータを貼り付け(コード省略) bolTemp = Application.DisplayAlerts Application.DisplayAlerts = False Sheets("temp").Copy 'CSV出力 ActiveWorkbook.SaveAs Filename:="C:\Hinban Data.csv", FileFormat:=xlCSV, Local:=True ActiveWorkbook.Saved = True ActiveWorkbook.Close Application.DisplayAlerts = bolTemp MsgBox ("CSVデータの出力が完了しました(C:\Hinban Data.csv)") End Sub ================================================================== エラーが起きるエクセルファイルを以前の端末(廃棄前)にコピーして実行したらCSV出力ができました。 Windows7とExcel2010の環境下では何かコードの追記が必要なのでしょうか。 ネット検索などで調べましたがそれらしいヒントが見つかりません。 対処法などご存じでしたら、教えていただけるととても助かります。 よろしくお願いいたします。

  • エクセルと同じファイル名でcsvを作成するマクロ

    エクセルからCSVファイルをYYMMDD付でマクロを使って 作ろうとしていますが拡張子の「.xls」がどうしても残ってしまいます。 例えば、「test.xls」が「test.xls070326.csv」のように。 これを「test070326.csv」とするにはどうしたらよいでしょう。 今のコードはつぎのようにしています。 Sub test1() Dim flname As Variant Dim wb As Workbook flname = ActiveWorkbook.Name + CStr(Format(Date, "yymmdd")) ActiveSheet.Copy ActiveSheet.SaveAs Filename:=flname, _ FileFormat:=xlCSV ActiveWindow.Close savechanges:=False ActiveWorkbook.Close End Sub これでもCSVとしては使えるのですが、気持ちがすっきりしません。 どなたか正解をお願いします。

  • VBAでのCSV保存

    VBAでExcelのデータを保存したく、 ActiveSheet.SaveAs _ Filename:=xxxxx, _ FileFormat:=xlCSV といった感じにしています。 ほぼこの方法で問題ないのですが、なぜか変形してしまう データがあります。 文字列として2004/6/18といった形で入力しているデータが 6/18/2004のように変化してしまいます。 FileFormatを指定しなければ、2004/6/18のままですが、 それではCSVファイルになりません。 どうしたらいいのでしょうか?

  • エクセルVBA【ワークシートのコピー】について

    以下のVBA記述で、とあるエクセルファイルのシートをCSV化しようとしております。記述の場合、すべてのワークシートが対象となっていますが、10個くらいあるWorkSheetの【sheets(8)】のみを対象としたいのですが、どのようにしたら良いのでしょうか? お手数ですがご教授下さい。 Sub test() Dim sh As Worksheet Dim fname As String Application.ScreenUpdating = False For Each sh In ActiveWorkbook.Worksheets fname = "C:\temp\" & sh.Name & ".csv" sh.Copy With ActiveWorkbook .SaveAs Filename:=fname, FileFormat:=xlCSV .Close savechanges:=False End With Next sh Application.ScreenUpdating = True End Sub

  • (Excel vba)ExcelシートをCSV保存する時、通貨記号を\にする方法

    セルの書式設定で通貨(記号は¥)を設定しているセルを含むexcelのシートをCSV形式に保存しようとしています。手作業でメニューの「ファイル」-「名前を付けて保存」をクリックし、ファイル形式をCSVにして保存した場合は通貨記号¥がついた金額が入っていて問題ありません。 次のようにvbaのSaveAsメソッドを使用した場合、通貨記号$のついた金額になってしまいます。 ActiveWorkbook.SaveAs Filename:=FCsvName, FileFormat:=xlCSV vbaで通貨記号を\にする方法を教えてください。環境はExcel2000・Windows98SEです。

  • エクセルファイル(book)のシートの内容をCSVファイルにおとしたい

    こんにちは。 VB初心者です。 実はVBではなく、Excel VBAで行なっているのですが。 ここに質問していいかもよく分かってないのですが。 プログラムの処理としては、あるBookのシートの内容を 別のCSVファイルとして生成したいのです。マクロを組んだのですが、一つ問題があって困っています。 問題: 生成したCSVファイルが一度Window上に表示されて (それはいいのですが、あとで閉じますから) 以下の確認メッセージがでてしまいます。 「outFile.csvはExcel97のファイル形式では、ありません。変更を保存しますか?」 要はプログラムがここで、一旦ユーザアクションを要求してしまうのです。 アクションなしに普通に終了させたいのですが。 マクロではなくVBだったらこんなことはならないのでしょうか? 初心なのでよく分かりません。 もしくはもっとほかの簡単なコードできるのでしょうか。 以下にコードを記述します。 Sub OutFile() Dim myWBpath As String myWBpath = ActiveWorkbook.Path Workbooks.Open FileName:=myWBpath & "\testData1.xls" Sheets("sheet1").Select ActiveWorkbook.SaveAs FileName:="C:\outFile.csv", _ FileFormat:=xlCSV, CreateBackup:=False ActiveWorkbook.Close End Sub

  • Excelの複数シートからcsvファイルを出力

    Dim objXL Dim f Dim m Dim ws Set objXL=CreateObject("Excel.Application") 'objXL.Visible=True objXL.DisplayAlerts=False For Each f In WScript.Arguments objXL.WorkBooks.Open f For Each ws In objXL.ActiveWorkBook.Worksheets If ws.UsedRange.Rows.Count=1 and ws.UsedRange.Columns.Count=1 and ws.Cells(1,1)="" Then 'MsgBox ws.Name&"Empty" Else ws.SaveAs f & "." & ws.Name & ".csv", 6 End If Next objXL.ActiveWorkBook.Close Next objXL.Quit WScript.Quit 上記スクリプトファイルで ファイル名が「[元Excelファイル名].[シート名].csv」 のcsvファイルが出力されますが、これを ファイル名を「[シート名].csv」にするには どのようにすればいいのでしょうか。 ws.SaveAs f & "." & ws.Name & ".csv", 6 の箇所を ws.SaveAs ws.Name & ".csv", 6 に変更したのですが、うまくいきませんでした。