ここから本文です

CSV(タブ区切り)ファイルを出力させるExcelマクロを教えてください。

質問者

eco_h_keiさん

2012/4/2612:52:32

CSV(タブ区切り)ファイルを出力させるExcelマクロを教えてください。

Excel VBAの初心者です。
Excel VBAを利用して、CSVファイルを効率的に作成したいと考えております。
自分でも何日か試みているのですがどうにもうまくできませんでした。
そこで、皆様のお力をお借りしたいと思いまして投稿させて頂きました。
下記の結果が出力できるプログラムをご教示頂きたいと希望しております。
何卒よろしくお願いいたします。

具体的には、画像にもアップさせております通り、以下の形式のデータが
Excelファイルの各シートに存在します。

【Excelファイル 各シート】
1行目 A列(数字) B列(数字)
2行目 A列(数字) B列(文字列) E列(数字) F列(数字)
3行目 AH列(数字)
4行目 A列(数字) B列(英数字) D列(数字) E列(数字)
5行目以降は4行目と同じ形式が続き、最終行はシートにより異なる。


このデータを「シート名.csv」の形式で、各シート毎にcsvファイルを作成し
デスクトップの結果フォルダへ連続して出力したいと考えています。
※csvファイルはシート分作成され、結果フォルダへ格納されるようにしたいです。

csvファイルは、タブ区切りで出力させます。
ただし、他システムで利用するため以下の形式になるようにしたいと
思っております。

【csvファイル】
1行目:タブ区切りでA~B列まで。
2行目:タブ区切りでA~L列まで。(空欄セルもタブ出力)
3行目:タブ区切りでA~AH列まで。(空欄セルもタブ出力)
4行目~最終行:タブ区切りでA~E列まで。(空欄セルもタブ出力)
※2行目はB列までしかデータは存在しないですが、L列までタブ出力になります。

【出力先】
デスクトップの「結果」フォルダ

分かりにくい説明かもしれませんが、皆様のお力添えのほど何卒よろしくお願い申し上げます。

投稿画像

閲覧数:
5,568
回答数:
1
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

2012/4/2617:32:07

>4行目~最終行:タブ区切りでA~E列まで。(空欄セルもタブ出力)

の最終行はどうやって求めるのかが不明なのでA列最終行で求めています。
一応UsedRangeで求める場合もコメントになっています。
'lastRow = sh.UsedRange.Rows.Count

UsedRangeの場合で1行目が空白の場合(A1もB1も空白でC列以降も空白の場合)はRows.Countと最終行が一致しないので、こうなります。
'lastRow = sh.UsedRange.Rows.Count - sh.UsedRange.Row + 1

デスクトップの「結果」フォルダはあるものとしてます。
同名のファイル名がある場合は上書きします。


Sub sample()
Dim sh As Worksheet
Dim lines As Variant
Dim lastRow As Long
Dim r As Long
For Each sh In Sheets
lines = Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(sh.Range("A1:B1"))), vbTab) & vbCrLf
lines = lines & Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(sh.Range("A2:L2"))), vbTab) & vbCrLf
lines = lines & Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(sh.Range("A3:AH3"))), vbTab) & vbCrLf
'lastRow = sh.UsedRange.Rows.Count
'lastRow = sh.UsedRange.Rows.Count - sh.UsedRange.Row + 1
lastRow = sh.Range("A" & Rows.Count).End(xlUp).Row
For r = 4 To lastRow
lines = lines & Join(WorksheetFunction.Transpose(WorksheetFunction.Transpose(sh.Range("A" & r & ":E" & r))), vbTab) & vbCrLf
Next
With CreateObject("Scripting.FileSystemObject").CreateTextFile(CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\結果\" & sh.Name & ".csv", True)
.Write lines
.Close
End With
Next
End Sub

質問した人からのコメント

2012/4/27 09:08:14

成功 素晴らしい!!
おかげさまで想定していた結果を得ることができました。本当にありがとうございました。
このコードは、1行づつトレースして勉強させていただきます。
私もあなたほどのVBスキルを身に着けられるように頑張りたいと思います。

ちょい足しを取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

ID/ニックネームを選択し、「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する