プロが教えるわが家の防犯対策術!

フォルダ内の複数あるcsvデータを
(1)ブック.csvを開く
(2)ブック内のデータをソートする
(3)データをコピーする
(4)貼り付け用ブック.xlsに貼り付け
をloopさせ実行させています
処理を少しでも早くするために
ブック.csvを開かずに(2)~(4)を実行できれば早くなるのかな?と考えています
ブック.csvを開かずに(2)~(4)を実行させることは可能でしょうか?
それとも、あまり意味がないでしょうか?

ちなみに画面更新を停止するための
Application.ScreenUpdating = False
はプログラム内に入れています

以上、よろしくお願いいたします。

A 回答 (5件)

1つのcsvファイル内データは50件だけということでいいんですよね。


50件くらいなら、ソートのロジックはそんなに凝る必要はないでしょう。

とりあえず、1つのcsvファイルを読み込み、ソートしてシートに書き込むまでのコードを書いておきます。
あとは、これをcsvファイルの数だけ繰り返してください。


Dim FileName As String
Dim i As Integer
Dim n As Integer
Dim Size As Integer
Dim CsvStrW As String
Dim SortStrW As String
Dim CsvStr(100) As String
Dim SortStr(100) As String
Dim CsvAry() As String
Dim RecAry() As String
Dim MaxRow As Long

FileName = "D:\AAA.csv"

Application.StatusBar = "処理中....(" & FileName & ")"
Open FileName For Input As #1
Size = 0
Do Until EOF(1)
Line Input #1, CsvStrW
CsvAry = Split(CsvStrW, ",")
SortStrW = CsvAry(0) & Chr(0) & CsvAry(1) & Chr(0) & CsvAry(2)
n = Size - 1
Do Until n < 0
If SortStr(n) <= SortStrW Then Exit Do
CsvStr(n + 1) = CsvStr(n)
SortStr(n + 1) = SortStr(n)
n = n - 1
Loop
CsvStr(n + 1) = CsvStrW
SortStr(n + 1) = SortStrW
Size = Size + 1
Loop
Close #1

ReDim RecAry(Size, 8)
For n = 0 To Size - 1
CsvAry = Split(CsvStr(n), ",")
For i = 0 To 7
RecAry(n, i) = CsvAry(i)
Next
Next

Application.ScreenUpdating = False
MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
Cells(MaxRow + 1, 1).Resize(Size, 8).Value = RecAry
Application.StatusBar = ""

この回答への補足

結果の回答が遅くなりましてすみません
自分が作成したプログラム内に入れ込むと
Open FileName For Input As #1
でデバックしてしまい
この原因がわからず悩んでいます
初歩的なことかもしれませんが・・・

教えていただいた結果が
良かったのか?悪かったのか?
また回答させてください

補足日時:2012/10/30 05:19
    • good
    • 0

まだ不明な点が。



>データ件数:2万~3万件

これはどのファイルの件数なんでしょうか?
複数あるcsvファイルの合計件数が2万~3万件ということ?


>同じ項目が1行目にある
>しかし2行目から50行目までが
>ファイルで順序が違う(必ず50行まである)

1つのcsvファイルの件数が必ず50件という意味でしょうか?
ということは、csvファイルが500個くらいあるということ?
ソートは全行に対して? それとも1行目は除く?


csvファイルごとにソートして、それを貼り付け用ブック.xlsの最後の行の下にどんどん追加していくということでいいんですよね。

この回答への補足

ファイル件数は、複数あるcsvファイルの事で
このcsvデータが2万~3万件あります

1つのcsvファイル内データが
名称(1) 名称(2) 名称(3)  判定 計測結果 上限   下限  判定
AAA  BBB  CCC   1  10  15   10  OK
DDD  SSS  ZZZ   1  13  12  10  OK
BBB  CCC  DDD   2  9   12   10  NG
50行まである
こんな感じのデータが入っていて
ソートは名称(1)(2)(3)で行います

csvファイルごとにソートして、それを貼り付け用ブック.xlsの最後の行の下にどんどん追加していくということです。

以上、処理速度が速くなりそうであれば
VBAのコードを教えていただきたく
よろしくお願いいたします。

補足日時:2012/10/18 20:37
    • good
    • 1

>テキストファイルとして読み込んで


>処理時間は早くなるでしょうか?

通常は、エクセルのシートを使わずにVBAの変数だけで処理し、シートへの書き込みも配列でまとめてドカッと書き込めば早くなります。
ただ、問題となるのはソートのアルゴリズムです。
ヘタなアルゴリズムにすればブックを開いて処理するより時間が掛かるかもしれません。
シート上でのソートは最適なアルゴリズムを使っているはずなので、VBAによるソートはそれよりも早くすることはできないと思いますが、近づけることはできます。

データ件数はどのくらいか?
1件の項目数は?
どの項目でソートする?
ソート項目の型は?
ソート項目に何か特性はあるのか?

など、これらの違いによって、どんなアルゴリズムにすれば効率よくソートできるかが変わってきます。

この回答への補足

すみません、アドバイスください
データ件数:2万~3万件
1件の項目数:8項目
どの項目でソート:3項目について優先順位をつけソート
(名称(1)(2)(3))
ソート項目の型:名称で昇順
ソート項目に何か特性:すべてのファイルに共通して
           同じ項目が1行目にある
           しかし2行目から50行目までが
           ファイルで順序が違う(必ず50行まである)
           よって、いつも同じ順序でコピー・貼り付けをしたいため
           ソートしている
これで意味がわかりますかね?

1つのファイルのイメージ
名称(1) 名称(2) 名称(3)  判定 計測結果 上限   下限  判定
AAA  BBB  CCC   1  10  15 10  OK
DDD  SSS  ZZZ   1  13  12  10  OK
BBB  CCC  DDD   2   9  12  10  NG
50行まである

以上、処理速度が速くなりそうであれば
VBAのコードを教えていただきたく
よろしくお願いいたします。

補足日時:2012/10/17 21:42
    • good
    • 1

No1さんの回答が気になるようなら、試してみればすむ話です。



もし、体感速度であまりかわらないのであれば、以下の理由が考えられます。

・膨大なデータを扱う環境ではない(1万件とか5万件とかでなく100件程度)
・ロジックに無駄が多い
・スペックが水準を満たしていない

あとはWorkbooks.OpenでなくOpenTextを使ってみるとか
    • good
    • 0

テキストファイルとして配列に読み込んでソートすれば可能です。

この回答への補足

自分が気になっている事ですが
テキストファイルとして読み込んで
処理時間は早くなるでしょうか?

補足日時:2012/10/16 19:02
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!