CSVを特定の列だけ抽出してエクセルへ変換したい

このQ&Aのポイント
  • VBA初心者がCSVの特定の列を抽出してエクセルに変換する方法を教えてください。
  • エクセル2013を使用して、長さ200行程度のCSVファイルから特定の5列のデータを抜き出し、同じフォルダにエクセルファイルとして保存する方法を教えてください。
  • CSVファイルから特定の列のデータを抜き出すVBAコードを教えてください。エクセル2013を使用して、200行程度のデータを抽出し、エクセルファイルとして保存する方法を知りたいです。
回答を見る
  • ベストアンサー

CSVを特定の列だけ抽出してエクセルへ変換したい

図々しい質問で本当に申し訳ありません。当方VBAの初心者というか、ほぼ何もわかっていません。本来ならばきちんと自分で勉強し地道に解決すべきであるのは重々承知しているのですが、どうしても来週必要になるので無礼は承知で質問させていただきます。 20列、長くても200行程のCSVファイルから特定の5列程のデータだけを抜き出し、エクセルに変換し、CSVと同じフォルダに格納したいと思っております。(エクセルのファイル名はCSVと同じで構いません) どのようなコードを書けばよいのか、ネットで似たような質問を拝見し自分なりに調べて書いてみたのですが、全く上手くいきません。 厚かましいお願いで本当に、情けなく、お怒りを買ってしまうかもしれませんが、「このコードをそのまま貼り付けたら動くよ」といった感じでお教えいただけませんでしょうか・・・。 使うバージョンはエクセル2013です。 本当にすみません。 何卒お願いいたいます。

質問者が選んだベストアンサー

  • ベストアンサー
  • SI299792
  • ベストアンサー率48% (716/1482)
回答No.4

情報不足! CSV は,区切りでいいですか? 特定の5列程とはどこですか? 書いてないので、B~Fとしました。 読み込んだ後、それ以外を消して保存しています。違っている場合、[A:A,G:Z] を直して下さい。 複数のフォルダということは、1つのフォルダのサブフォルダということでしょうか。 このマクロを入れたワークブックを作り、処理したい1番上のフォルダに保存してから実行してください。このワークブックのフォルダと、サブフォルダが対象になります。 csv と同じ名前のxlsxファイルがあれば、消去してから実行します。 ' Sub Macro1() '   Dim OldLen As Long   Dim NewLen As Long   Dim FileName As String '  サブフォルダを含むファイル一覧取得   ChDrive ThisWorkbook.Path   ChDir ThisWorkbook.Path   Shell ("Cmd /C Dir *.csv /B /S > Dir.Txt") '  Dir が終わるまで止める   On Error Resume Next   Do While OldLen <> NewLen Or NewLen = 0     OldLen = NewLen     NewLen = FileLen("Dir.Txt")     DoEvents   Loop   On Error GoTo 0 '  本処理   Open "Dir.Txt" For Input As #1   Do Until EOF(1)     Line Input #1, FileName     Workbooks.Open FileName     OldLen = Len(FileName) - 4     FileName = Left(FileName, OldLen) & ".xlsx"     On Error Resume Next     Kill FileName     On Error GoTo 0     [A:A,G:Z].ClearContents '消す場所を指定     ActiveWorkbook.SaveAs FileName, FileFormat:=xlOpenXMLWorkbook     ActiveWindow.Close     DoEvents   Loop   Close End Sub

tikuwasan
質問者

お礼

ご丁寧にありがとうございます。

tikuwasan
質問者

補足

ありがとうございました!! 情報不足ですみません・・・! 約100程のフォルダの中にそれぞれ5つ前後のCSVが格納されており、その中から特定の列のデータだけを管理用エクセルへ書き出す作業を します。CSVデータの形式は全て共通、20列(固定)100~200行(これは各々まちまち)程で、抜き出したい列は2・7・13・17・18列の5つです。(今後増えるかもしれません)管理票エクセルシートに転記する際、データを昇順したり、特定のものだけを抜き出し、チェックしながら管理票エクセルに貼り付けて行くといった作業が必要になる為、CSVファイルのままではなく、エクセルに変換したいのです。したい作業をまとめると、 (1)任意のCSVファイルを選択する(実行ボタンを押したらファイルパスを入力する画面が出て、入力をしてエンターを押したら以下(2)~(4)のアクションが起こるようにしたい) (2)そのCSVファイルから特定の列だけ抜き出す(3・5・9・11・17)など (3)特定の列のみなったCSVファイルをエクセルに変換し、元となったCSVファイルと同じフォルダに格納する(元となったCSVファイルは何のう変更もせずそのまま閉じる) (4)出来れば元となったCSVファイルを閉じたあと、特定列だけ抜き出しエクセルに変換されたファイルが自動で開くようにしたい 以上の質問でした。 先程教えていただいたコードを貼り付けてみましたが、上手くいきませんでした。本当に図々しいお願いで心苦しいのですが、上記内容が上手くいくようなコードをお教えいただくことは出来ますでしょうか・・・。 情報不足なのに、親切にご回答を下さったSI299792様にこれ以上のお手数をお掛けするのは本当に申し訳ないのですが、何卒よろしくお願いいたします。不躾なのですが、ビットコインのお礼もさせていただきたいです。どうぞよろしくお願いいたします。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

csvファイルは、今どきのエクセルなら、エクセルでそのまま読み込めるはず。 読み込んで、例えばC列だけを範囲指定してコピーして、他シートや、他ブックのシートの列に張り付けたらしまいではないか。 それでVBA、VBSは必要ないのだが、VBAコード作成の経験はあるの。 >どのようなコードを書けばよいのか 今更なのだが、ついでなので、初心者向けの解説を上げておく。 本番の前に、下記簡単な例をやってみて、理解・類推して。 ーー 例データを作る。 メモ帳で、下記の例の通りデータ打ち込み a1,a2.a3,a4,a5 <--ここで改行。以下行同じ b1,b2,b3,b4,b5 c1,c2,c3,c4,c5 ファイルの名前をテスト1.csvで保存。 ーー エクセルの白紙のシートを開いて ALTキーとF11キーを同時押し。 VBEの画面で 挿入ー標準モジュール 下記コードをコピペ。 Sub test01() Open "テスト1.csv" For Input As #1 i = 0 Do Until EOF(1) Line Input #1, x MsgBox x y = Split(x, ",") 'カンマで分割 MsgBox y(2) '第3番目だけ取り上げ=第3列に相当 i = i + 1 Cells(i, "A") = y(2) 'A列i行目にデータをセット Loop Close #1 End Sub これでアクチーブシートのA列に 第1行目(上記i=0の部分で何合目からを指定できる)からで a3 b3 c3 Msgboxは本番では削除して実行。指定する列は変更のこと。

tikuwasan
質問者

お礼

詳しいご回答をありがとうございました。 勉強してみます。

  • msMike
  • ベストアンサー率20% (363/1775)
回答No.2

≫ あまりにも数が多すぎるので、… 何の数ですか、余りにも多過ぎるってのは?

tikuwasan
質問者

お礼

コメントを下さってありがとうございます。 数が多いのは、CSVファイルのことです。 複数のフォルダ(全100程)にそれぞれ多くて20程のCSVファイルがあります。CSVファイルは全て同じ構成になっており、中身のデータが違います。 (例:郵便番号、住所、電話番号・・・の列にそれぞれのデータが行として格納されてるようなイメージです) 複数のフォルダの中の複数のCSVの特定の列だけのデータを1つの管理表としているエクセルブックに書き出していく作業が必要なのですが、全て自動化はせず、必要な列のデータだけをCSVから取り出し、エクセルに変換し、確認作業をしながら管理票エクセルブックに貼り付けていこうと思っていました。 図々しい上に分かりにくい質問で申し訳ありませんでした。

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

不要な行を削除して、名前を付けて保存でExcelブックを選んでみてください。

tikuwasan
質問者

お礼

ありがとうございます。 その作業をするには、あまりにも数が多すぎるので、マクロで自動化したいと思い質問したのですが・・・。 図々しい質問ですみませんでした・・・。

関連するQ&A

  • CSVファイルの特定列だけを呼び出し

    はじめまして。VBA初心者です。 質問させてください。 横に十列、縦に1万レコードのcsvデータがあり、このうちの2列分だけをエクセルシートに取り出すマクロが必要になりました。 外部データ呼び出し後、列を削除、というのを作ってみましたが、僕の力量不足にためか、改変ポイントがよくわかりませんでした。 opentextを使ってarrayで読み込む、というのもやってみましたが、結構時間がかかってスムーズにはいきませんでした。 ネットでさがしているうちに、読み込む列が少ないならcsvから特定の列をコピーして、それを新しいブックに貼り付け、すればいいみたいな記述をみたのですが、参考になるコードが見つかりませんでした。 そういうことは可能なんでしょうか?また、大量のデータを読み込む時に一番早い方法はどんなものでしょうか?

  • CSVファイルの指定列だけを読み込んでEXCELに表示したい

    EXCELのVBAの .ActiveSheet.QueryTables.Add メソッドを利用する方法で、 (不可能ならば別な方法でもお願いします。) CSVファイルを読み取って、シートに書き込みたいと思ったのですが、 その際、CSVファイル全体ではなくて、特定番目の列だけを読み取って、書き込むことは出来ないでしょうか。 その特定の列の指定を複数にすることも出来ますでしょうか。 もし複数でも可能でしたら、EXCELに書き込むときに、 一列目、二列目、と詰めて書くのではなく、間に空列をはさんだりして、 バラバラに好きな位置の列に、読み取ったそれぞれの列を、書き込むことは出来るでしょうか。

  • ExcelのVBAでCSVを読み込むと通貨になる

    Excel2010のVBAでCSVファイルを読み込んで処理させたいのですが、読み込んだデータをExcelが勝手に別のデータに変えてしまうので困っています。 例えば、123,456というデータは、フィールドにカンマがあるので、CSVでは"123,456"となりますが、これを以下のようなVBAのコードで読み込ませると、書式が通貨として扱われてしまって、データも123456になってしまいます。文字列として読み込まれていれば正しいデータとして読み込まれるように思うのですが、文字列として読み込ませる方法が分かりません。正しく元のデータ123,456のまま読み込ませるにはどうすればいいのでしょうか。 なお、CSVの各フィールドにカンマやダブルクォーテーションが混在していると、各フィールドに分割する処理が複雑でよく分からないので、下記のコードのようにExcelの機能でCSVを各フィールドに分割される方法で読み込ませたいです。 よろしくお願いします。 Workbooks.Open Filename:= "file.csv"

  • エクセルVBAでCSVを読み込んで別ファイルにまとめたいです。

    エクセルVBA初心者の者です。 マクロの記録でできたコードをいじって、 なんとか動くものができるレベルです。 Aというフォルダに20~40行程度の内容のCSVファイルが 数百個あります。開けてみないと何行あるのかわかりません。 そのAフォルダのCSVの内容をエクセルで開いて、別のエクセルファイルの一枚のシートにまとめたいのです。 最初にCSVファイル名を一枚のシートのA列に書き出すところ まではやれたのですが、それを順番に読み込んでコピペの 流れができません。 CSVファイル名読み込み 読み込んだファイル1つめCSV開く CSVの20~40行をコピー 別のエクセルファイルのシートに貼り付け 1つめCSV閉じる ↓ 読み込んだファイル2つめCSV開く 繰り返し こういうやり方じゃない方がいいのかもわかりません。 もしかして考え方も違うのでしょうか? サンプルコード教えていただけるとありがたいです。 よろしくお願いします。

  • excel vbaで複数のcsvファイルの読み込み

    100シート分のcsvファイルのデーターを一つずつ読み込んでexcelにコピーして使用してますが莫大な時間がかかって困ってます。 vbaを使用して作業を簡素化出来る事は出来ないでしょうか? ------------------------------------------ ※ csvの概要 excelで1枚のcsvファイルを開くとA列の11行目から65536行まで数値データがあります。 ※ vbaできたらよいなと思う仕様 そこで、複数のcsvファイルを選択して読み込むとCSV_データと言うSeetのA列の10行目から1枚目のcsvファイル、B列の10行目から2枚目のcsvファイルと言う風に選択した分のcsvを列に続けて数値データを貼り付けしてくれるvbaをご教授していただけると大変助かります。 不躾で申し訳ございませんが宜しくお願い致します。 excel2003 ------------------------------------------

  • 特定の列の抽出

    CSVファイルがあり特定の列を抽出したいんですが、excelが入ってなくマクロ(VB)が使用できない為、そのような処理をバッチで処理することは可能でしょうか?教えてください。ちなみに抽出条件は日付です。

  • csvをExcelに変換したい

    CSVファイルをEXCELで開いたとき、表の列毎に意味をもった表示がされているのですが、 それを拡張子を単にcsvをxlsに書き直したものを開くとデータが”、”で区切られただけでいわゆる1列の形にごちゃごちゃデータが詰まった形の表示になってしまう。最初に開いた形でそのままxlsの形にしたいのですがどうすれば、 なおExcel2000を使用しています。

  • CSVファイルをエクセルファイルにインポートさせるには?

    おせわになります CSVファイルをエクセルファイルにインポートさせたいのですが 方法は ユーザーフォームをにテキストボックスと参照ボタン、実行ボタンを作成し 参照ぼたんでCSVファイルを選ぶ テキストボックスには参照先の住所が記載され 実行ボタンでsheet1にB2から貼り付けさせたいのですが可能ですか? 又、CSVの情報が不要な列もあります 必要な列のみ落とし込みをしたいです 当方初心者でVBAコードがあれば幸いです。 わかる方よろしくおねがいします

  • エクセルデータからCSVファイルへの変換について

    現在エクセルファイルにあるデータをCSVファイルへ変換する作業(エクセルでデータを作成して、保存時にCSVファイルを選択)をしているのですが、以下の例の場合うまく変換ができません・・・。 基本的な質問かもしれませんがどなたかご存知でしたら教えていただけると助かります。 よろしくお願いします。 【例】         (エクセル) ⇒  (CSV) うまくいく   12345     12345 うまくいかない 01234     1234 上記のようにエクセル上は文字列で管理されている ケースだとCSVファイルに変換した時数列に変換 され、上記例のうまくいかないケースのように 頭に0がある場合CSVだと0が消えてしまいます。 よろしくお願いします。

  • 先頭にゼロを含む数字列のcsvをExcelに取込む

    UTF-8のCSVファイルがあり、含まれるデータに先頭がゼロで始まる数字列があります(例えば00123や0123で桁数は不定)。 これをVBAを使ってExcelに取り込み、ゼロ付きのまま扱いたいのですが、取り込んだデータは先頭のゼロが欠けてしまいます。 VBAコードは以下のとおりです。 どこを見直したらよろしいでしょうか。 strConnPhrase = "TEXT;" & strFilePath Set qt = ws.QueryTables.Add(Connection:=strConnPhrase, Destination:=ws.Range("A1")) With qt .TextFilePlatform = 65001 .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True .PreserveFormatting = True .RefreshStyle = xlOverwriteCells .Refresh .Delete End With

専門家に質問してみよう