- ベストアンサー
CSVファイルの串刺し集計
同書式で文字と数値が混在するCSVファイルで10年分(約3600本)のファイルがあります。 ファイル名は20070101とか20080925の様になっています。 そのファイルの数値の部分を任意の期間で集計するために1ファイルづつ EXCELのマクロで読み込んでは加算させているのですが、期間が長いと非常に時間がかかります。 すばやく集計できる方法はありませんか?(EXCELのVBAとVB6は中の下ぐらいは理解できます。)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
状況の補足を。 データ内容の日付をファイル名にしたファイルが3600本あるということですね。フォルダは1つですか、年ごと別とかですか 1ファイルエクセルに読み込んだとき、行に当たるデータは? 1ファイル1行ではないのでしょうね。 >任意の期間で ファイルの指定は人手でやっている? 当期間内のファイル名の自動割り出しは、プログラムで出来ないですか。現在指定増すか? ファイルの存在する日のカレンダーを持ち、順次OPENしていけば。 ーー 以下提案 CSVファイルを読み、Split関数で項目を分離し、必要なら2次元配列にし、合計用2次元配列にした項目別集計の配列に、足し込んでいけば。 機関指定は365日以上もあるのかな。365ファイルX平均1日レコード数が質問に書いてないが、これのOPENとリードにかかる時間以上は短くならないと思うがどれくらいかかるかな。 同一フォルダ内にデータがあると、For Each で扱いやすい。 WEBで「フォルダ内 ファイル VBA」で照会のこと。 http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub05_110_080.html など多数。
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。 > レコード数はカウントしたことがありませんが項目数は7800程 よくわからないですけど、Excel に読み込んだ場合 7800 列(横方向)ある という意味ですか? Excel 2003までで言えば、 ・レコード数とは、行方向(縦 1~65536 行) ・項目(フィールド)数とは列方向(横 A~IV 列) に該当します。列方向に 7800 列あるのであれば、最初からワークシートに 展開できないですけども...7800行ある CSV という意味? 具体的にサンプルデータを数行程度、示せませんか? 現状で回答するとすれば、ADO 等で CSV にデータベース接続し、SQL の集計 関数を使うのが速いかな.....と思いました。例えば、3列目を集計するなら、 SELECT SUM(F3) AS [小計] FROM [Sample.csv]; のような感じです。 ※ F3 とは ADO で見出し行のない CSV を読み込んだときに便宜上 自動的に付与されるフィールド名。 Excel に CSV を展開するよりは速いはずですが、実際に実験したわけでは ありません。 ADO VBA CSV などをキーワードに検索すると、CSV へ接続する具体的なソース も見つかると思いますよ。
お礼
EXCELにファイルを開くと加算すべき数値のセルの位置がかなり不規則な位置に在り(全ファイル同書式ですが)何列目を集計するとか、何行目を集計するとかではありません。ADOはまだ良く理解してませんので敷居が高く感じますが勉強してみます。ありがとうございました。
- usui_touge
- ベストアンサー率0% (0/1)
1回のマクロの実行で1ファイルを処理しているのでしょうか。 それでしたら、ファイル名を文字列変数に入れて、自動的にopenとcloseを繰り返せば、1回のマクロの実行で必要な期間のファイルを一度に処理できるので、スピードアップになると思います。 10年分で約3600ファイルということは、1日1ファイルだと思いますが、任意の期間というのが月単位とかでしたら、あらかじめ、月単位にファイルをまとめてしまえば、open とcloseに要する時間が節約できるかもしれません。 1ファイルあたりのレコード数や項目数(カラム数)、今どのように計算されているのか、もう少し情報があればお願いします。
補足
早々のご回答ありがとうございます。 おっしゃられる通りopenとcloseを繰り返して、加算用のシートへ形式を選択して貼り付けで加算する自動記録したマクロに手を加え、加算開始日=加算開始日+1を繰り返し、存在しないファイルはon error resume nextで逃げながら(ここにちょっと無駄がありますが)加算終了日までを加算しています。 レコード数はカウントしたことがありませんが項目数は7800程あります。ファイルサイズは20KBです。
お礼
Split関数は知りませんでした。 これなら2次元配列変数に取り込むことが出来そうですね。 EXCELに展開しなくても加算できれば早くなるかもしれませんね! 早速やってみます、ありがとうございました。