dポイントプレゼントキャンペーン実施中!

エクセルで特定の列だけを抽出してcsvで保存したい

例えば、A列:住所、B列:氏名、C列:電話番号といった3つの列がありそれぞれデータがはいっているとします(図参照)。
そしてcsvとして書き出すときにB列とC列だけを書き出したい場合どのようにすればよいでしょうか。
この場合、書き出すときにA列だけを一旦削除、などということはしたくないです。
また1列目のタイトルも書き出さないようにしたいです。
ご教授よろしくお願いいたします。

「エクセルで特定の列だけを抽出してcsvで」の質問画像

A 回答 (3件)

#2です。

非連続な列群を指定した場合に対応させてみました。ご参考まで。
Unionに各範囲を与えるところは、ご自分でお願いします。
Sub test()
Dim targetRange As Range, myArea As Range, myColumn As Range
Dim i As Long, j As Long, columnCount As Long
Dim buf As Variant, buf2 As String
Dim FSO As Object

Set FSO = CreateObject("Scripting.FileSystemObject")
Set targetRange = Union(Range("a1:a3"), Range("c1:d3"), Range("f1:f3"))
'データチェック 先頭行位置、行数の一致チェック 必要ならご自分で作成下さい。
'If Not checkRanges(targetRange) Then Exit Sub
For Each myArea In targetRange.Areas
columnCount = columnCount + myArea.Columns.Count
Next myArea
With FSO.createTextFile("C:\Sample.txt", True) 'overwrite
For i = 1 To targetRange.Areas(1).Rows.Count
ReDim buf(1 To columnCount)
j = 1
For Each myArea In targetRange.Areas
For Each myColumn In myArea.Columns
buf(j) = myColumn.Cells(i).Text 'Value
j = j + 1
Next myColumn
Next myArea
buf2 = Join(buf, ",")
.writeline buf2
Next i
.Close
End With
End Sub
    • good
    • 2
この回答へのお礼

なるほど、Unionというのを使うのですね。
ソースを参考にしてうまく書き出せるようになりました。
回答ありがとうございました!

お礼日時:2010/06/26 19:38

http://okwave.jp/qa/q5992285.html
で回答した者ですが、そのコードで、targetRangeに書き出したい範囲を与え、
(例)
With ActiveSheet
Set targetRange = .Range("B2:C100")
End With
Join関数で、区切り文字を#→カンマに替えれば、お望みの事ができます。
ご参考まで。
なお、B,C列の最後までという事でしたら、
Set targetRange = .Range(.Range("B2"), .Range("C" & .Rows.Count).End(xlUp))
でいけると思います。(空白セルがC列の一番下に無い事が前提です)

この回答への補足

回答ありがとうございます!
ご指摘の方法で
Set targetRange = .Range(.Range("B2"), .UsedRange.Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count))
としてデータを抽出することができました。
別のデータの取得方法としてA列とC列(住所と電話番号)を抽出するといった場合も考えていたのですが、
ご指摘の方法だと列が連続していないとだめですよね。
RangeとFor文の使い方がキモなのかもしれませんが、ソースはなんとなくわかる、程度の初心者です。
良い方法がありましたがご教示ください。(丸投げですいません。。。)

補足日時:2010/06/26 05:19
    • good
    • 0
この回答へのお礼

一応解決?しましたのでこちらでご報告させていただきます。
ソースは以下のようにしました。
----------------------------------------------------
Sub XLS2HASH()
Dim targetRange As Range, myRow As Range
Dim buf() As String, buf2 As String
Dim i As Long
Dim FSO As Object

Set FSO = CreateObject("Scripting.FileSystemObject")
With ActiveSheet
Set targetRange = .Range(.Range("A2"), .Range("C" & .Rows.Count).End(xlUp))
End With


For Each ws In ThisWorkbook.Sheets

With FSO.CreateTextFile(Application.ThisWorkbook.Path + "\" + ActiveSheet.Name + ".txt", True)

For Each myRow In targetRange.Rows
ReDim buf(1 To myRow.Columns.Count)
For i = 1 To myRow.Columns.Count
If i = 2 Then

Else
buf(i) = myRow.Cells(i).Text + "#"
buf2 = Join(buf, "")
buf2 = Left(buf2, Len(buf2) - 1)
End If
Next i
.WriteLine buf2
Next myRow

.Close
End With

Next


Set FSO = Nothing
End Sub
----------------------------------------------------
一旦全てを範囲選択し、該当する列だけ何もしないようにしました。
少々力技のような気がします。
他によい方法があればご教授お願いいたします。

お礼日時:2010/06/26 08:39

エクセルのシートから項目名や特定の列を削除してcsvファイルとして保存する機能は用意されていません(VBAを使えばできますが)。



このようなケースでは、必要なデータ範囲を選択して「コピー」し新規ブック(シート)に貼り付け、これをcsvファイルで保存するのが実戦的に最も簡単な方法です。
    • good
    • 2
この回答へのお礼

やはりVBAの知識が必要なんですね。
コピペというやり方も考えていましたが、作業をもっと簡潔にできたらという思いで質問させていただきました。
回答ありがとうございました!

お礼日時:2010/06/26 05:00

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