
フォルダ内の複数あるcsvデータを
(1)ブック.csvを開く
(2)ブック内のデータをソートする
(3)データをコピーする
(4)貼り付け用ブック.xlsに貼り付け
をloopさせ実行させています
処理を少しでも早くするために
ブック.csvを開かずに(2)~(4)を実行できれば早くなるのかな?と考えています
ブック.csvを開かずに(2)~(4)を実行させることは可能でしょうか?
それとも、あまり意味がないでしょうか?
ちなみに画面更新を停止するための
Application.ScreenUpdating = False
はプログラム内に入れています
以上、よろしくお願いいたします。
A 回答 (5件)
- 最新から表示
- 回答順に表示
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 = ""
この回答への補足
結果の回答が遅くなりましてすみません
自分が作成したプログラム内に入れ込むと
Open FileName For Input As #1
でデバックしてしまい
この原因がわからず悩んでいます
初歩的なことかもしれませんが・・・
教えていただいた結果が
良かったのか?悪かったのか?
また回答させてください
No.4
- 回答日時:
まだ不明な点が。
>データ件数: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のコードを教えていただきたく
よろしくお願いいたします。
No.3
- 回答日時:
>テキストファイルとして読み込んで
>処理時間は早くなるでしょうか?
通常は、エクセルのシートを使わずに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のコードを教えていただきたく
よろしくお願いいたします。
No.2
- 回答日時:
No1さんの回答が気になるようなら、試してみればすむ話です。
もし、体感速度であまりかわらないのであれば、以下の理由が考えられます。
・膨大なデータを扱う環境ではない(1万件とか5万件とかでなく100件程度)
・ロジックに無駄が多い
・スペックが水準を満たしていない
あとはWorkbooks.OpenでなくOpenTextを使ってみるとか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 【困っています】VBA 追加処理の記述を教えてください。 1 2022/08/25 22:54
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) 【マクロ】同じフォルダ内にある複数ブックから1つのブック内の1シートにデータを集めたい 6 2022/09/28 18:16
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Excel(エクセル) VBAで同フォルダ内の別ブックを開かず参照して条件の一致する行の指定セルを抽出するには? 1 2022/07/21 19:29
- Excel(エクセル) エクセルシートのデータを1列飛ばしで別ブックのシートに貼り付けるマクロが知りたい 2 2023/06/05 22:37
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
C言語・要素除去
-
C# DataTableの行をソートしてD...
-
VB.NETでファイル名順にファイ...
-
GridViewで列のソートを無効に...
-
データ数が多い場合のソート
-
ソートについて(その他質問あ...
-
DirectoryInfo型配列ソート(C#)
-
excel VBA の条件をつけての列...
-
(VBA) Dir 関数で取得するファ...
-
Double型ソート方法
-
int num[10]という配列に、適当...
-
VB6 任意の順番でのソート
-
VBA基本構文の作り方 2列の...
-
Excel VBA テキストボックス内...
-
リスト構造のソートで悩んでま...
-
VB6でデータを昇順に並べ替える
-
C言語でのソート方法
-
構造体配列の並べ替え
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
C# DataTableの行をソートしてD...
-
VBA基本構文の作り方 2列の...
-
ファイル名「1.jpg ~10.jpg~...
-
あるディレクトリ内のファイル...
-
GridViewで列のソートを無効に...
-
C言語・要素除去
-
excel VBA の条件をつけての列...
-
Excelですべての組合せ(重複組...
-
VBScriptで配列のソートをする...
-
配列の問題
-
ブック.csvを開かずに他のブッ...
-
2次元配列を複数項目でソートし...
-
構造体配列のソート
-
listboxの並び替え
-
構造体のリストをソートしたい。
-
リスト構造のソートで悩んでま...
-
文字列をソートする方法
おすすめ情報