• 締切済み

ブック.csvを開かずに他のブック.xlsに貼付け

フォルダ内の複数あるcsvデータを (1)ブック.csvを開く (2)ブック内のデータをソートする (3)データをコピーする (4)貼り付け用ブック.xlsに貼り付け をloopさせ実行させています 処理を少しでも早くするために ブック.csvを開かずに(2)~(4)を実行できれば早くなるのかな?と考えています ブック.csvを開かずに(2)~(4)を実行させることは可能でしょうか? それとも、あまり意味がないでしょうか? ちなみに画面更新を停止するための Application.ScreenUpdating = False はプログラム内に入れています 以上、よろしくお願いいたします。

みんなの回答

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.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 = ""

kyy0108
質問者

補足

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

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.4

まだ不明な点が。 >データ件数:2万~3万件 これはどのファイルの件数なんでしょうか? 複数あるcsvファイルの合計件数が2万~3万件ということ? >同じ項目が1行目にある >しかし2行目から50行目までが >ファイルで順序が違う(必ず50行まである) 1つのcsvファイルの件数が必ず50件という意味でしょうか? ということは、csvファイルが500個くらいあるということ? ソートは全行に対して? それとも1行目は除く? csvファイルごとにソートして、それを貼り付け用ブック.xlsの最後の行の下にどんどん追加していくということでいいんですよね。

kyy0108
質問者

補足

ファイル件数は、複数ある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のコードを教えていただきたく よろしくお願いいたします。

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.3

>テキストファイルとして読み込んで >処理時間は早くなるでしょうか? 通常は、エクセルのシートを使わずにVBAの変数だけで処理し、シートへの書き込みも配列でまとめてドカッと書き込めば早くなります。 ただ、問題となるのはソートのアルゴリズムです。 ヘタなアルゴリズムにすればブックを開いて処理するより時間が掛かるかもしれません。 シート上でのソートは最適なアルゴリズムを使っているはずなので、VBAによるソートはそれよりも早くすることはできないと思いますが、近づけることはできます。 データ件数はどのくらいか? 1件の項目数は? どの項目でソートする? ソート項目の型は? ソート項目に何か特性はあるのか? など、これらの違いによって、どんなアルゴリズムにすれば効率よくソートできるかが変わってきます。

kyy0108
質問者

補足

すみません、アドバイスください データ件数: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のコードを教えていただきたく よろしくお願いいたします。

回答No.2

No1さんの回答が気になるようなら、試してみればすむ話です。 もし、体感速度であまりかわらないのであれば、以下の理由が考えられます。 ・膨大なデータを扱う環境ではない(1万件とか5万件とかでなく100件程度) ・ロジックに無駄が多い ・スペックが水準を満たしていない あとはWorkbooks.OpenでなくOpenTextを使ってみるとか

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

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

kyy0108
質問者

補足

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

関連するQ&A