プロが教える店舗&オフィスのセキュリティ対策術

第3者にExcel記入頂いた「データレコード(固定列数・変動行数)」を用いて、
・ヘッダレコード(1行:固定値) → 1列目(図のX)
・データレコード(記入された列数=r列とする) → 2~r列目(図のY)
・トレーラレコード(1行:固定値) → r+1列目(図のZ)
とサンドイッチ式に結合し、CSVファイルにて出力する作業をExcelマクロにて自動化しようと思っています。

3種類のレコードはどれも固定の列数ですが、それぞれデータ数が違います。
そのためそもそも「ExcelファイルをCSVファイルとして保存」した際の機能制限上、
もっとも列数の多い行に合わせ、列数の少ないレコードの後ろに勝手にカンマが複数個足されてしまいます。
(※ここの認識合ってますでしょうか。念のため確認です。)


そのため一旦ExcelデータをCSVファイルとして保存したのち、
それをTXTファイルとして開き直し内部データの置換(カンマ個数の調整)をしたいと思っています。

'「Workbooks.Add」で新規生成し、内容編集したファイルを「作業日付」でCSV保存する
'特にパスは指定していないため「カレントフォルダ」に保存
ActiveWorkbook.SaveAs Filename:=Format(Now, "yyyymmddHHMMSS"), FileFormat:=xlCSV

この後の作業について、どういった手順で進めれば良いかご存知の方はいらっしゃいますでしょうか。

※指定パスにあるTXTファイルの読み込み→内容編集・置換
といった作業であれば以下のURLのような事例が参照可能ですが、「生成したばかりのCSVファイルをTXTとして読み返す」ことはそもそも可能なのか解らず。。
http://detail.chiebukuro.yahoo.co.jp/qa/question …


どうぞ宜しくお願いします。

「ExcelマクロにてCSV出力したデータ」の質問画像

A 回答 (1件)

>もっとも列数の多い行に合わせ、列数の少ないレコードの後ろに勝手にカンマが複数個足されてしまいます。


そういう解釈もあるのでしょうが、四角形に範囲を取っているからだと思います。

>CSVファイルにて出力する作業をExcelマクロ

Excel VBAでするなら、
>それをTXTファイルとして開き直し内部データの置換(カンマ個数の調整)をしたいと思っています。
これは不要でしょう。最初から、そう出力すれば済む話ですから。

それとも、既存のCSVを直す方法もありますが、それは、また補足にでも加えてください。

マウスで範囲を選択します。だから、画像には出てきませんが、空行を選択範囲に入れると、それも入ってしまいます。

なお、このマクロは、Excel 97~2000 によく見かけられた、懐かしい古典的なものです。

'//
'Option Explicit

Sub CSVExportMacro()
Dim Rng As Range
Dim Fname As String
Dim i As Long, j As Long
Dim buf As String
Dim FNo As Integer
Dim mPath As String
mPath = ThisWorkbook.Path & "\"
If TypeName(Selection) <> "Range" Then
 Exit Sub
End If
Set Rng = Selection
If WorksheetFunction.CountA(Rng) < 2 Then
  MsgBox "データが不足しています。", vbExclamation
  Exit Sub
End If
Fname = Format$(Now(), "yyyymmddHHMMSS")
Fname = mPath & Fname & ".csv"
FNo = FreeFile
Open Fname For Output As #FNo
With Rng
For i = 1 To .Rows.Count
 For j = 1 To .Columns.Count
  If Trim(.Cells(i, j).Value) <> "" Then
   buf = buf & "," & Trim(.Cells(i, j).Value)
  End If
 Next j
 Print #FNo, Mid$(buf, 2)
 buf = ""
Next i
Close #FNo
Beep
End With
End Sub
'///
「ExcelマクロにてCSV出力したデータ」の回答画像1
    • good
    • 1
この回答へのお礼

ありがとうございます!

> そういう解釈もあるのでしょうが、四角形に範囲を取っているからだと思います。
色々コードを試していたのですがうまく行かず、
たまたま見かけた記事でもそう書かれていたので勝手に
「行ごとにデータ個数が異なるファイルをそのままCSV出力することは出来ない」と思い込んでいました。

ですが記載頂いた例を見て解りました。
元データをRange().Copyで取得し形式を指定して貼り付けていたのですが、
そこを「各セルごとに」転記を行っていた点が差分だったようです。

元々の問題は何とか解決しそうです。ありがとうございましたm(_ _)m

お礼日時:2015/07/01 18:46

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