大量のCSVデータを行列の変換をしてエクセルデータにまとめる方法について

このQ&Aのポイント
  • CSVファイルが4000個ほどあり、VBAを用い、そのファイルの行列変換をして、1つのエクセルファイルにまとめたいのですが、うまくいきません。どなたか教えていただけないでしょうか?
  • 変換前のデータは2列のCSVファイルで、2列目のデータを取り出して1行にまとめたいです。
  • 取り込み変換後のデータは1行のエクセルファイルになります。
回答を見る
  • ベストアンサー

大量のCSVデータを行列の変換をしてエクセルデータにまとめる方法について

CSVファイルが4000個ほどあり、VBAを用い、そのファイルの行列変換をして、1つのエクセルファイルにまとめたいのですが、うまくいきません。どなたか教えていただけないでしょうか? CSVファイルは、以下の様な2列200行位あるものを、2列目のみ取り出し、エクセルファイルには1行(列ではなく)にして取り出したいのです。 変換前データー A列   B列 B013 毛 B014 54 B015 ポリエステル B016 36 B017 絹 B018 10 B020 0 B022 0 B023 ポリエステル B024 0 B025 キュプラ B026 0 B028 0 B030 0 B032 0  ・  ・  ・  ・  ・  ・ 取り込み変換後データ 1行: 毛 54 ポリエステル 36 絹 10 0 0 ポリエステル 0 キュプラ 0 0 0 0 のようにしたいのです。 どなたかお教えいただけないでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
  • merlionXX
  • ベストアンサー率48% (1930/4007)
回答No.2

4000個もあるんじゃマクロじゃなきゃできませんよね。 次の手順を試してみてください。 その4000個程度のCSVファイルが入っているフォルダーに、以下のマクロを書いたエクセルBOOKを保存してください。(パス取得のため必ず「保存」してください。) そのフォルダー内の全てのCSVファイルから、B1:B256の範囲のデータを読み込み、エクセルの.Sheets("Sheet1")の1行目から順に転記していきます。 読み込むのをB1:B256としたのは、わたしのエクセルが2007ではないので、行列を入れ替えたとき列が256列までしかないからです。でも200件程度のデータなら大丈夫ですね? Sub test01() Dim myFile As String, MyPath As String '変数宣言 Dim i As Long Dim wb As Workbook MyPath = ThisWorkbook.Path & "\" '自分のパスを取得 myFile = Dir(MyPath & "*.csv", vbNormal) 'パス内のcsvファイル Application.ScreenUpdating = False '画面更新停止 Application.Calculation = xlCalculationManual '自動計算停止 Do Until myFile = "" '対象ファイルがなくなるまで Set wb = Workbooks.Open(MyPath & "\" & myFile) '選択したファイルを開く ThisWorkbook.Sheets("Sheet1").Range("A1:IV1").Offset(i).Value = _ Application.Transpose(wb.Sheets(1).Range("B1:B256").Value) '行列を入れ替えて転記 i = i + 1 'カウント wb.Close (False) '開いたファイルを閉じる myFile = Dir '次のファイルを検索 Loop '繰り返し Application.Calculation = xlCalculationAutomatic '自動計算停止解除 Application.ScreenUpdating = True '画面更新停止解除 Set wb = Nothing MsgBox i & "件のCSVファイルから転記しました。", vbInformation, " " & Environ("UserName") & "さん (o^-')v " End Sub

yousuit
質問者

お礼

ありがとうございました。 助かりました。

その他の回答 (3)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

A列に半角スペースで区切って連結した値を代入すると解釈しました。 CSVファイルはブックと同じフォルダにあるとします。 クリップボードを操作する(1) http://www.officetanaka.net/excel/vba/tips/tips20.htm 【ダイレクトに格納/取得する】 ツール>参照設定をお忘れなく。 Sub try() Dim Clip_B As New DataObject Dim wb As Workbook Dim r As Range Dim Fname As String, Fdir As String Set r = ThisWorkbook.Worksheets("Sheet1").Range("A1") Fdir = ThisWorkbook.Path & "\" Fname = Dir(Fdir & "*.csv", vbNormal) Application.ScreenUpdating = False Do Until Fname = "" Set wb = Workbooks.Open(Fdir & Fname) wb.Worksheets(1).Range("B1:B200").Copy '200行固定 With Clip_B .GetFromClipboard r.Value = Replace(.GetText, vbCrLf, " ") End With Application.CutCopyMode = False wb.Close False Set r = r.Offset(1) Fname = Dir() Loop Application.ScreenUpdating = True Set wb = Nothing Set r = Nothing End Sub 勘違いでしたらスル~して下さい。

  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.3

>CSVファイルが4000個ほどあり とのことですので、[Open ステートメント] を使用して、[シーケンシャル入力モード] で開いた CSVファイル の「2列目のみ取り出し」て横方向に並べました。  1列目に CSVファイルのファイル名を配置しましたが、不要の場合は Cells(i, 1) = Replace(MyName, ".CSV", "") j = 1 の2行を j = 0 の1行に差し替えてください。  また、 MyPath = "D:\hoge\hoge\hoge\" の行は、CSVファイルの保存されたフォルダの「フルパス & "\"」を指定します。  merlionXX さんの [回答番号:No.2] のように、CSVファイルと同じフォルダに保存したブックで作業をされるときは、 MyPath = ThisWorkbook.Path & "\" で結構です。  「On Error Resume Next」・「On Error GoTo 0」の2行は、「2列目」にデータがなかった場合に配列の2番目の要素「Split(InputData, ",")(1)」がなく、インデックス エラーになりますので、エラー処理を施しています。  なお、コーディングは、[Dir 関数]・[EOF 関数] の使用例を参考にして書きました。  同一フォルダに「250行×3列」の CSVファイル を256個作成して試行してみましたが、私の低スペックパソコンで作業時間は18秒(1列目の見出しを省くと17秒)でした。 Sub ReadCSV()  Dim MyPath As String  Dim MyName As String  Dim i As Integer, j As Integer  Dim InputData As String  Application.ScreenUpdating = False  Application.Calculation = xlCalculationManual  MyPath = "D:\hoge\hoge\hoge\"  MyName = Dir(MyPath & "*.CSV", 3)  Do While MyName <> ""   i = i + 1   Cells(i, 1) = Replace(MyName, ".CSV", "")   j = 1   Open MyPath & MyName For Input As #1   Do While Not EOF(1)    j = j + 1    Line Input #1, InputData    On Error Resume Next    Cells(i, j) = Split(InputData, ",")(1)    On Error GoTo 0   Loop   Close #1   MyName = Dir  Loop  Application.Calculation = xlCalculationAutomatic  Application.ScreenUpdating = True End Sub

yousuit
質問者

お礼

ご教授ありがとうございました。 あの後データが15000件に膨らみましたが、 スムーズに取り込むことができました。 本当に助かりました。 ありがとうございました。

  • shintaro-2
  • ベストアンサー率36% (2266/6244)
回答No.1

VBAでなければならない理由が良くわかりませんが、 要は、B列を切り出して、改行をカンマに置換すれば済むのではないですか? MS-Wordやテキストエディタで容易にできることですが

関連するQ&A

  • 大量のCSVデータを1つのエクセルデータにまとめる方法について

    今仕事で、CSVファイルが400ファイル程あり、これを一つの エクセルファイルにまとめなくて加工しなければならないのですが うまいことVBAを活用して効率的にできないか思案中なのですが うまい具合に行きません。 データの持ち方として ○CSVファイル1 1.AAA 2.BBB ○CSVファイル2 3.CCC 4.DDD となっており、これを1つのエクセルファイル上で 1.AAA 2.BBB 3.CCC 4.DDD としたいのですがなにかいい方法はないでしょうか? 1つのブックで外部データの取り込みでCSVを次々に選択して いくVBAなんてあれば教えていただけないでしょうか? よろしくお願いします。

  • EXCELデータのCSV変換の限界

    エクセルは確か何万という行、列があると思いますが たくさんデータを入れていても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 ------------------------------------------

  • 行列転置データのファイル変換方法

    200行4000列の数値データの情報処理を行うのですが、 このデータをEXCELファイルとして、4000行200列のデータの形として保管しています。EXCELは255列までしか扱えないので、これを転置することはできません。そこで、例えば、SASやSPSS、SYSTATなどの統計ソフトで処理できるよう、行列を転置して、これらのソフトに読込めるように、ファイル変換をする方法を探しています。  どなたか、教えて!

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

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

  • エクセルファイルの1レコード(1行)を1csvファイルへ変換マクロ

    エクセルファイルの1レコード(1行)を1csvファイルへ変換し、エクセルファイルにあるレコード数分だけあるフォルダに自動作成するマクロを教えて下さい。 因みに、csvファイル名は、エクセルデータの『a列.csv』となるようにしたいです。 【例】 本日2007/11/13 ○○.xls A列 B列 C列 111 1 356 13 1 2 ・ ・ ・ ・ ・ ・ 111.CSV "2007/11/13(火)","1","356,"","","" 13.CSV "2007/11/13(火)","1","2,"","","" 変換後のcsvの中身は 1列目に、本日の日付 2列目に、1 3列目に、変換元のエクセルファイルの3列目 4、5、6列目に空白 という形式です。 どなたかお分かりになるかた、ご教授願います。

  • EXCELでCSVファイルの読込み

    VBA超初心者でとても困っています。 仕事でEXCELのVBAを使って 現在開いているシートの中に 1つのCSVファイルからデータを読み込むのですが CSVデータの2行目をEXCELのC2へ。 4~10行目までを、EXCELのB5~B14へ マクロを使い、ボタン一つで自動入力させたいのです・・・。 Line Input も、やり方が悪いのかうまくいきません。 ヒントとなるやり方があればぜひ教えてください。

  • エクセルをCSVに変換時に不具合が出てしまう。

    エクセル2007を使用している者です。 エクセルファイルをCSV変換時に出る 不具合がどうしても改善できず困っております。 操作内容は以下の通りです。 エクセルにて列ごとに違う項目で A~Oまでの列にそれぞれ5行異なるデータを入れ、 これをCSVに変換した後のファイルを保存して 内容を確認してみますと、 何と、驚くことに入れたはずのない行が増えており また入れたはずのないデータが入っており、 さらに列の順番も少し変化し、 また元データと異なる列も作成され、そこには 全く入力していないデータが反映しています。 データ内容を見ますと、 以前、異なる階層のフィルに作成した CSVデータの内容からも読み込んでいるような感じです。 つまり、エクセルの元ファイルデータに加え 以前作成した全く関係ないCSVフィルからもデータを取り込み これを複合されたようなCSVデータができています。 PCを何度も再起動しても改善されないため office2007をまるごと入れ直してみますが、 やはり結果は変わらないです。 また、読み込んでしまう関係ないCSVファイルを 別の場所に移動してみても結果は同じです。 エクセルを開いて左上にあるボタンから表示される 【最近使用したドキュメント】の履歴も すべて削除しています。 尚、エクセルファイルに数式等は一切いれていません。 また、CSVに変換後のファイルの拡張子もCSVとなっています。 原因を特定することができなくて困っています。 原因や改善方法をご存知の方がいらっしゃいましたら どうかお知恵をお借りできますよう アドバイスを宜しくお願いいたします。

  • csvファイルのデータ変換について

    OS:windows2000pro VB:VB6.0sp5 c:\data.csv(カンマ区切) のデータ(全6列)で 1列目,2列目,3列目,4列目,5列目,6列目 [変換前(全6列)] abc,a1,aあ b2,3c,4d5e (1行目) ccc,c3,aあ い,3c,4d5e (2行目) bbc,b2,あ b2a,c3,d5e4 (3行目) [変換後(全6列)] abc,a1,"aあ b2",3c,"4d5e" (1行目) ccc,c3,"aあ い",3c,"4d5e" (2行目) bbc,b2,"あ b2a",c3,"d5e4" (3行目) 上記の様に 3列,6列目を「"・・・"」ダブルコーテイションで 囲い(変換し)、c:\data_after.csvというファイル名で 保存する為のプログラムをご教示ください よろしくお願いいたします

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

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

専門家に質問してみよう