- ベストアンサー
エクセルで特定の列だけを抽出してcsvで保存したい
- みんなの回答 (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
その他の回答 (2)
- mitarashi
- ベストアンサー率59% (574/965)
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列の一番下に無い事が前提です)
お礼
一応解決?しましたのでこちらでご報告させていただきます。 ソースは以下のようにしました。 ---------------------------------------------------- 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 ---------------------------------------------------- 一旦全てを範囲選択し、該当する列だけ何もしないようにしました。 少々力技のような気がします。 他によい方法があればご教授お願いいたします。
補足
回答ありがとうございます! ご指摘の方法で Set targetRange = .Range(.Range("B2"), .UsedRange.Cells(.UsedRange.Rows.Count, .UsedRange.Columns.Count)) としてデータを抽出することができました。 別のデータの取得方法としてA列とC列(住所と電話番号)を抽出するといった場合も考えていたのですが、 ご指摘の方法だと列が連続していないとだめですよね。 RangeとFor文の使い方がキモなのかもしれませんが、ソースはなんとなくわかる、程度の初心者です。 良い方法がありましたがご教示ください。(丸投げですいません。。。)
- MackyNo1
- ベストアンサー率53% (1521/2850)
エクセルのシートから項目名や特定の列を削除してcsvファイルとして保存する機能は用意されていません(VBAを使えばできますが)。 このようなケースでは、必要なデータ範囲を選択して「コピー」し新規ブック(シート)に貼り付け、これをcsvファイルで保存するのが実戦的に最も簡単な方法です。
お礼
やはりVBAの知識が必要なんですね。 コピペというやり方も考えていましたが、作業をもっと簡潔にできたらという思いで質問させていただきました。 回答ありがとうございました!
お礼
なるほど、Unionというのを使うのですね。 ソースを参考にしてうまく書き出せるようになりました。 回答ありがとうございました!