[[20161115201532]] 『指定した列でCSV出力するには』(ハル) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『指定した列でCSV出力するには』(ハル)

教えてください。
以下のようにエクセルデータがA1〜F3まであるとします。
(A列からF列まで途切れることなくデータがある状態) 

    A   B   C   D  E   F
1行 500 200 300 500 350 400
2行 400 100 700 140 270 600
3行 200 900 120 300 800 250

このデータをCSV出力した時に,エクセルのD列〜E列にあったデータは
CSVファイルのF列,G列へ,エクセルのF列にあったデータは,CSV
ファイルのI列へ書き出しをする場合(以下のとおり),どのようなコードとなりますか?

    A   B   C  D   E   F  G   H  I
1行 500 200 300      500 350     400
2行 400 100 700      140 270      600
3行 200 900 120      300 800     250

あらかじめ,エクセル側のD列,E列,H列を空白列にして,書き出し側の配置に合わせてからCSV出力をすれば良いとは思いますが,現行のエクセルデータの配置を変更せずにCSV出力する方法がありましたら教えてください。

< 使用 Excel:Excel2013、使用 OS:Windows10 >


↓なぜ、そうしないのでしょうか。

>あらかじめ,エクセル側のD列,E列,H列を空白列にして,

(マナ) 2016/11/15(火) 21:12


 マナさんに激しく同意!! ですが、たとえば。

 ★の部分は実際のものに変更してください。

 Sub Sample()
    Dim d As String
    Dim c As Range
    Dim fPath As String

    fPath = "c:\Test\Sample.csv"    '★CSV フルパス

    On Error Resume Next
    Kill fPath  '念のため
    On Error GoTo 0

    Open fPath For Output As #1

    For Each c In Range("A1", Range("A" & Rows.Count).End(xlUp))
        With c.EntireRow
            Print #1, Join(Array(.Range("A1").Value, .Range("B1").Value, .Range("C1").Value, Empty, Empty, .Range("D1").Value, .Range("E1").Value, Empty, .Range("F1").Value), ",")
        End With
    Next

    Close #1

 End Sub

(β) 2016/11/15(火) 21:24


マナさん,βさんありがとうございます。

サンプルもありがとうございます。

エクセル側のデータですが,リスト形式でまとまっていることで,データの確認用として使っておりました。
そのため,なるべく空白列を挿入することで,データのまとまりを崩したくなかったというのが理由です。

CSVで書き出す側ですが,空白列が実際には数十列ほどになる箇所もあります。
配列のような感じで書き出す方法があればと思ったのですが,なかなか難しそうなんですね。

(ハル) 2016/11/15(火) 23:15


 >>配列のような感じで

 というのが、どういう意味なのか、ちょっと不明ですが、アップしたコードでは、列を、ベタベタと
 固定で、かつ、列数も少ない。

 実際には、もっと列も多く、アップしたようなコード構成だと、記述が面倒ということでしょうか?

 いずれにしても、元シートの列を、どのように、csv上で配置するかは、それが、どんなに多くても、プログラムに教えてやらなければいけませんね。

 それを定義するということは必須です。
 あとは、その定義した内容をもとに、元シートから展開して書きだすということが実現できればいいのですよね。

 という理解のもとで、コード案は頭の中でできていますが、実際に、どういうものなら満足されるのかが不明なので
 コード案のアップは、いったん控えています。

(β) 2016/11/16(水) 00:51


 エクセルVBAでcsvファイルを作成する場合、
 ・アップしたように VBA標準IOを使う
 ・FSOを使う
 ・マナさん示唆のように、エクセルシートを、csvに変換して保存。変換はすべてエクセルがやってくれる。

 こういった方法がありますね。この中では、3番目の方法が今回の場合ベストだと思っています。
 元シートは変更したくないということが、この方法の利用を躊躇させている理由でしょうか?
 元シートは変更する必要はありません。元シートからcsvで希望するフォーマットに変換したものを作り上げて
 それを保存すればいいだけのことです。

 なお、3つ挙げた方法、いずれも、どのように変換するのか、元シートと、変換後のシートの列の紐つけ、マッピングは必須です。
 アップしたコードは項目が少ない場合の例で、コード内で定義していますが、これが何十項目もあれば
 コード記述も大変ですし、わかりにくいですし、レイアウト変更時の対応も面倒ですね。

 なので、別途紐つけシートを用意します。(コード内では "Sheet2" としています)

    |[A]|[B]
 [1]|A:C|A  
 [2]|D:E|F  
 [3]|F  |I  

 こんな定義を何行でも必要なだけ記述します。A列が元シートの列、B列がそれ(それら)のcsv上での開始列です。

 これを元に、3番目の方法で処理するコード例です。

 Sub Sample2()
    Dim shC As Worksheet
    Dim shN As Worksheet
    Dim fPath As String
    Dim r As Range

    Application.ScreenUpdating = False

    fPath = "c:\Test\hoge.csv"                                      '★フルパス
    Set shC = ThisWorkbook.Sheets("Sheet2")                         '★転記列規定シート
    Set shN = Workbooks.Add(xlWBATWorksheet).Sheets(1)

    With ThisWorkbook.Sheets("Sheet1").Range("A1").CurrentRegion    '★元シート
        For Each r In shC.Range("A1").CurrentRegion.Rows
            .Columns(r.Cells(1).Value).Copy shN.Range(r.Cells(2).Value & 1)
        Next
    End With

    With shN.Parent
        Application.DisplayAlerts = False   '同名のファイルがあれば無条件上書き
        .SaveAs Filename:=fPath, FileFormat:=xlCSV
        Application.DisplayAlerts = True
        .Close False
    End With

 End Sub

(β) 2016/11/16(水) 09:50


βさん,ありがとうございました。

大変勉強になりました。

サンプルコードを参考に,3番目の方法で対処したいと思います。
(ハル) 2016/11/16(水) 18:46


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.