• ベストアンサー

大量の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なんてあれば教えていただけないでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • pauNed
  • ベストアンサー率74% (129/173)
回答No.1

こんにちは。 昔書いた事があるサンプルです。 同一フォルダにあるcsvファイルをまとめて処理します。 Sub CSVまとめsample()   Dim MyObj As Object   Dim MyFol As String   Dim MyFnm As String   Dim MyStr As String   Dim i   As Long   Dim n   As Long   Dim n1  As Long      'フォルダを選択する   Set MyObj = CreateObject("Shell.Application") _     .BrowseForFolder(0, "SelectFolder", 0)   '選択なければ処理を抜ける   If MyObj Is Nothing Then Exit Sub   MyFol = MyObj.self.Path & "\"   MsgBox MyFol & "を処理します。"   Set MyObj = Nothing   Application.ScreenUpdating = False   'ThisWorkbookにシートを追加して処理   With Sheets.Add     'Dir関数を使って指定フォルダ内csvファイルを順次処理     MyFnm = Dir(MyFol & "*.csv")     Do Until Len(MyFnm) = 0&       i = i + 1       'データエリアを取得してセット先を変更       n = IIf(n = 0, 1, n + n1)       '外部データ取り込みを利用       With .QueryTables.Add(Connection:="TEXT;" & MyFol & MyFnm, _                  Destination:=.Range("B" & n))         .AdjustColumnWidth = False         .TextFilePlatform = xlWindows         .TextFileStartRow = 1         .TextFileCommaDelimiter = True         .Refresh False         n1 = .ResultRange.Rows.Count         .Parent.Names(.Name).Delete         .Delete       End With       'ファイル名をA列にセット       .Range("A" & n).Resize(n1).Value = MyFnm       '次のファイルへ       MyFnm = Dir()     Loop   End With   If i > 0 Then     MyStr = i & "個のファイルを処理しました。"   Else     '検索結果が0なら     MyStr = "検索条件を満たすファイルはありません。"   End If   Application.ScreenUpdating = True   MsgBox MyStr End Sub #シート行数をオーバーした時のエラー処理などはしてないので #うまくいかなかったらごめんね^ ^;

masanogu1020
質問者

お礼

教えていただきましたサンプルを使わせていただいた結果うまく すべてのファイルを処理することができ、お蔭様でひたすら作業 をしなくて済みました。 どうもありがとうございました。

その他の回答 (2)

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.3

#1の蛇足の補足ですが、Excelでのcsvファイル読み込みは結構重い処理です。 http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200703/07030115.txt [外部データ取り込み]は比較的速いですが、 複数ファイル処理時は、Table定義や名前定義の削除などに気をつけなければなりません。 コーディングの手間を考えると、cmd.exeを使うのも一つの方法です。 windowsメニューから[ファイル名を指定して実行] コマンドプロンプトに copy /b d:\test\*.csv d:\ketugou.csv と入力して[Enter] Dドライブのtestフォルダの拡張子csvファイルを、 Dドライブ直下のketugou.csvとしてまとめて バイナリモードでコピー...というコマンドです。 これで1つにまとめたファイルをExcelに読み込めば良いかと。 VBAで実行するなら Sub CSV結合()   Const CRFILE As String = "D:\ketugou.csv"   Dim obj As Object   Dim arg As String   Set obj = CreateObject("Shell.Application") _     .BrowseForFolder(0, "SelectFolder", 0)   If obj Is Nothing Then Exit Sub   arg = obj.self.Path & "\*.csv "   Set obj = Nothing   Call Shell(Environ("ComSpec") & " /c copy /b " & arg & CRFILE) End Sub (Excelに読み込む前のまとめるところまでです) 参考まで。

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

CSVファイルの数が多いだけで、問題自体平凡な内容で、WEBや本に類似例が載っています。 (1)拡張子だCSVファイルに統一だれているか でない場合、手作業で統一できるか。 (2)CSVファイルは1つのフォルダの中にまとまっているか。 2,3までなら同じことの繰り返しで対処できるでしょうが。 (3)CSVファイルは1つのフォルダの中にまとまっているとして、そのフォルダには他のファイル形式のファイルが混在するか (4)最悪の場合、CSVファイルの名前のリストがエクセルの例えばA列の400行に作れるか。 ーー (1)(2)(3)が都合よい状態として (A)VBのDir関数の利用(既回答) (B)VBscりpt的に処理 ーーー Sub test02() Set objFS = CreateObject("Scripting.FileSystemObject") ' フォルダーの名称を取り出す strFDIRNAME = CurDir ' GetFolderで、フォルダーオブジェクトを取得します Set objdir = objFS.GetFolder(strFDIRNAME) MsgBox objdir ' Filesコレクションにアクセスする For Each objFILE In objdir.Files strFname = objFILE.Name '取り出したobjFILEの.Nameを取得 If Right(strFname, 4) = ".csv" Then '.csvなら処理 MsgBox strFname '処理 Else End If Next End Sub 処理の方法として (X)Open Input方式 (Y)VBScript式のOpenてxtFile が缶上げられる(下記) ーーー Sub test02() Set objFS = CreateObject("Scripting.FileSystemObject") ' フォルダーの名称を取り出す strfdirname = CurDir ' GetFolderで、フォルダーオブジェクトを取得します Set objdir = objFS.GetFolder(strfdirname) MsgBox objdir ' Filesコレクションにアクセスする For Each objFILE In objdir.Files strfname = objFILE.Name '取り出したobjFILEの.Nameを取得 If Right(strfname, 4) = ".csv" Then '.csvなら処理 MsgBox strfname '処理 MsgBox strfdirname & "\" & strfname Set objTS = objFS.OpenTextFile(strfdirname & "\" & strfname) While objTS.AtEndOfStream = False mytext = objTS.readline MsgBox mytext '各行処理 'Split関数で、カンマで分離 'エクセルへの取り込み処理 Wend Else End If Next End Sub ーーー 'エクセルへの取り込み処理については、 http://ncdomino.notescons.gr.jp/ncDisc.nsf/1e288666e0dc26cb49256bfd000bf211/C0F99BEC9E1F72A749257272001AC038?OpenDocument 他多数あり参照。 検索キーワード Createobject excelapplication

masanogu1020
質問者

お礼

CSVファイルは全て統一されたファイルでしたので 手作業等は発生せず対応できました。 どうもありがとうございました!

関連するQ&A

  • SpreadのデータをCSVに出力する際。。。

    いつもお世話になっております。 現在SpreadのデータをCSVに出力するプログラムを作成しています。 例えば、Spreadのデータに… ------------------- AAA BBB CCC DDD BBB DDD ------------------- というデータが入っている場合、 CSVには… ------------------- AAA BBB CCC DDD ------------------- という風に出力したい(重複した場合は一方だけ出力)のですが、 なかなかうまくいきません(汗) どのようなプログラムを組めばうまくいくか、 ご教授して頂ければ幸いです。 宜しくお願いします。 ※そのままCSVに出力するやり方はわかります。

  • CSVに外部テキストファイルを列として追加する方法

    こんにちは。 CSVファイル(base.csv)の先頭列に、別のテキストファイル(add.txt)の中身を新規の列として挿入したいと考えているのですが、よい方法がわかりません。。。 どうのような方法を使えば対応することができるでしょうか? どうぞよろしくお願いいたします。 ■CSVファイル(master.csv) title,developer_name,seller_name,primary_genre_name,application_url AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE AAA,BBB,CCC,DDD,EEE ■テキストファイル(add.txt) id 000 111 222 333 ↓ ■目標としたファイル(master.csv) id,title,developer_name,seller_name,primary_genre_name,application_url 000,AAA,BBB,CCC,DDD,EEE 111,AAA,BBB,CCC,DDD,EEE 222,AAA,BBB,CCC,DDD,EEE 333,AAA,BBB,CCC,DDD,EEE

  • 【Microsoft Excel】 .csv 以外のCSVファイルをExcelで開きたい!

    .csv 以外のCSVファイルをExcelで開きたいのですがどうしたらよいでしょうか? abcd.csvというExcelで問題なく開けるCSVファイルがあるとします。 これの拡張子を.xxx(又はその他、独自設定の拡張子)に変更して、Excelで開けるようにしようと思ったのです。 フォルダオプション>ファイルタイプ>新規(ボタン)」で「新しい拡張子の作成」ダイアログが開き、そこで ・ファイルの拡張子=.xxx ・関連付けられているファイル タイプ=Microsoft Excel CSV ファイル と設定して、abcd.xxxをダブルクリックでExcelが起動&ファイルオープンするまではいったのです。(アイコンも.csvファイルといっしょになりました。) しかし、 aaa,bbb ccc,ddd という内容のファイルが セルA1=aaa,bbb セルA2=ccc,ddd となり、csvファイルとして認識してくれていないみたいなのです。 ちなみに、元の.csvの場合にはちゃんと セルA1=aaa セルB1=bbb セルA2=ccc セルB2=ddd とExcelは表示してくれます。 どうにか上手い方法は無いものでしょうか! よろしくお願いいたします。

  • EXCELで行の先頭データが同じ行の削除方法について

    EXCELで次のようなことをしたいのですがどうしたら簡単にできるでしょうか?  AAA   AAA  AAA  AAA  AAA  BBB  BBB  BBB  CCC  DDD  DDD  DDD  DDD 上ようのなデータで重複している部分を削除し、  AAA  BBB  CCC  DDD としたいのですが。 今は一行々々で確認しながら削除してます。3000行程あり困ってます。 どうしたら簡単にできるでしょうか?  

  • CSVファイルをAccessに取りこみたい

    以下のような2つのCSVファイルがあるとします。 【hoge1.csv】 aaa,bbb,ccc,ddd 1,2,3,4 【hoge2.csv】 aaa,bbb,ddd,eee,fff 1,2,4,5,6 Accessをあまり使用したことがないので教えていただきたいのですが、 hoge1.csv、hoge2.csvを、以下のような形で Accessの1つのテーブルにインポートする事はできるのでしょうか? ---------------------------- | aaa | bbb | ccc | ddd | eee | fff | | 1 | 2 | 3 | 4 |  |  | | 1 | 2 |  | 4 | 5 | 6 | ---------------------------- ※「aaa」「bbb」…をフィールド名としたいです vb等でプログラムを自作するしかないのでしょうか? 何か良い方法がありましたら教えてください。お願いします。

  • CSVデータをツリー表示させたい

    業務で、WEBサイトにCSVデータを表示させたいと考えています。 CSVデータは、毎日更新されるもので、行数も日々変更されます。 項目の中に「レベル」という項目があり、この「レベル」の値を使って、 ツリー表示出来ないかと考えています。 希望としては、決められたフォルダに決められたファイル名で、 CSVデータを置けば、自動的にWEB上にツリー表示されるという ことです。 J-query等で、これを実現出来るプラグインが無いか探しているのですが、 なかなか希望に合うものが見つからず、困っています。 (CSVをWEB表示するものは見つかるのですが、ツリー表示出来る ものが見つかりません) 何か、良い方法があれば、ご教示頂けませんでしょうか? 例 コード  レベル 品名  規格 ・・・・    コード     レベル 品名  規格 ・・・・  1234    1   AAA   aaa       -1234       1    AAA   aaa 2345    2   BBB   bbb        ∟2345     2    BBB  bbb 3456    3   CCC   ccc          ∟3456   3    CCC  ccc 4567    3   DDD   ddd          ∟4567   3    DDD  ddd 5678    3   EEE   eee           ∟5678   3    EEE  eee 6789    4   FFF   fff             ∟6789  4    FFF   fff 7890    3   GGG  ggg           ∟7890   3    GGG  ggg

  • エクセルで列にあるユニークなデータの個数が知りたい

    おはようございます。 エクセルでA列に以下のようなデータがあるとします。 この中で何種類のデータがあるのかを知りたいのです。 この場合は、AAA,BBB,CCC,DDD,EEEの5種類なので5という答えが欲しいのです。 ただし、A列に入るデータは非常に多岐(800種類以上)に渡ります。 また、印刷を前提としてるためソートなどはできません。 さらに1枚のシートにこのようなデータがいくつかあるので、その決まった範囲内で個数を抽出する必要があります。 なにとぞ皆様のお知恵をお貸しくださいませ。 よろしくお願いします。 AAA AAA BBB CCC AAA DDD DDD BBB DDD DDD EEE EEE

  • セルの参照エラー

    VBA初心者です。 よろしくお願いします。 excelのVBAで複数のcsvファイルを読み込み1つのブックにまとめるツールを作成しています。 csvの1つは各csvからデータ参照する作りになっています。 例) aaa.csv =bbb!R1C1,=ccc!R1C1 bbb.csv 11 ccc.csv 12 上記3つのcsvファイルを1ブックにまとめた場合 aaaシートは11 12と表示されることを期待していますが 結果は参照エラーとなってしまいます。 よい対処方法ががあれば教えて下さい。 処理内容は以下の通りです。 ・csv.csvを読みこみ「まとめ.xls」として保存 ・bbb.csvを読みこみ「まとめシート」に移動 ・aaa.csvを読みこみ「まとめシート」に移動

  • CSVファイルの指定部分をエクセルに取り込みたい

    複数のCSVファイルをエクセルに、VBAを使用して取り込みます。 CSVファイルの形式は決まっているのですが、キーワード行から指定行分のみを取り込みたいです。 データ形式は、 A1 aaa bbb ccc B1 aaa bbb ccc C1 aaa bbb ccc A1 a1a b1b c1c  :  : という感じで、キーワードA1行以下から次のキーワードより上のデータをエクセルに取り込みたいです。 どうぞよろしくお願いいたします。

  • powershellでcsvの集計

    powershellでのcsvデータの集計をしたいのですが、 よくわからず困っています。 csvのデータは、 aaa1,10,10,20 bbb1,100,100,200 aaa1,5,5,6 ccc1,50,50,60 … となっており、キーとなる項目が同じものは、数値を集計して 再度csvにするというものです。(aaa1が同じなので集計) aaa1,15,15,26   bbb1,100,100,200 ccc1,50,50,60 … という感じです。 よろしくお願いします。

専門家に質問してみよう