
フォルダ内の複数ある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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・【お題】甲子園での思い出の残し方
- ・【お題】動物のキャッチフレーズ
- ・人生で一番思い出に残ってる靴
- ・これ何て呼びますか Part2
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・あなたが好きな本屋さんを教えてください
- ・かっこよく答えてください!!
- ・一回も披露したことのない豆知識
- ・ショボ短歌会
- ・いちばん失敗した人決定戦
- ・性格悪い人が優勝
- ・最速怪談選手権
- ・限定しりとり
- ・性格いい人が優勝
- ・これ何て呼びますか
- ・チョコミントアイス
- ・単二電池
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・泣きながら食べたご飯の思い出
- ・一番好きなみそ汁の具材は?
- ・人生で一番お金がなかったとき
- ・カラオケの鉄板ソング
- ・自分用のお土産
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C# DataGridView のヘッダーセ...
-
2次元配列を複数項目でソートし...
-
VB.NETでファイル名順にファイ...
-
SQL-SELECT文でのソート
-
FFFTPでフォルダをABC順になら...
-
あるディレクトリ内のファイル...
-
excel VBA の条件をつけての列...
-
ジャグ配列のソートについて(C#)
-
構造体型二次元ベクタのソート
-
アルゴリズムについて教えてく...
-
datagridviewの並べ替え
-
C言語・要素除去
-
C言語について
-
DataGridViewの複数列を連動し...
-
コレクションの数値をSortで並...
-
構造体のソートの記述について
-
C# DataTableの行をソートしてD...
-
System.IO.Directory.GetFiles...
-
DataGridViewのソートを止めたい
-
C++ 入力した3つのint型の整数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
VBA基本構文の作り方 2列の...
-
C# DataTableの行をソートしてD...
-
ファイル名「1.jpg ~10.jpg~...
-
あるディレクトリ内のファイル...
-
C言語・要素除去
-
2次元配列を複数項目でソートし...
-
DataGridViewの昇順降順。
-
DataGridViewでのソート制御
-
vbでDataTableの抽出コピー
-
datagridviewの並べ替え
-
n番目に大きい数を求めるアル...
-
C++ 入力した3つのint型の整数...
-
配列の問題
-
listboxの並び替え
-
DataGridViewの複数列を連動し...
-
excel VBA の条件をつけての列...
-
GridViewで列のソートを無効に...
おすすめ情報