VBAでAファイルと配列に入っている170個のファイルを全て比較するのですが、
ループで配列を更新してファイルを1つづつ取り出しています。
ファイル1つの処理は2秒程度なのですが、170個あるので最低でも340秒かかります。
340秒はかかりすぎなので、何か短縮する方法はないかと思考中です。
思いついたのは一括で処理をすることなのですが、
Aファイルと170個のファイルを一括で比較することは、機能的に無理なのでしょうか?
Aファイルに[キーワード]という記述があれば、他ファイルにも[キーワード]という記述が存在するか確認するコードです
Sub hikaku() Set this = ThisWorkbook.Worksheets("イベント") Dim arry As Variant this_line = this.Cells(Rows.Count, 7).End(xlUp).Row - 1'これは気にしないでください Label: C = 1 d = 1 a = a + 1 e = e + 1 target = this.Cells(e, 7).Value Do While this_line >= a 'ここは気にしないでください Do While UBound(Sheet) >= C 'Sheetは170個のファイルが入っている配列です Filename = Sheet(C) 1つのファイルを変数に格納 Application.ScreenUpdating = False If target Like "キーワード" Then If Call IsContained(target, Filename) True Then this.Cells(e, 8).Value = "一致" GoTo Label Else this.Cells(e, 8).Value = "不一致" End If Else End If C = C + 1 If UBound(Sheet) <= C Then '全てのファイルを読み込めば GoTo Label End If Exit Do Loop Loop Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub Function IsContained(target, Filename) As Boolean path = Sheet_path(C) Set open_file = Workbooks.Open(Filename:=path & "\" & Filename, UpdateLinks:=False) On Error Resume Next num = WorksheetFunction.Match(target, Workbooks(Filename).Worksheets("シート2").Range("CC10:CC900"), 0) On Error GoTo 0 If num = 0 Then IsContained= False Else IsContained = True End If Workbooks(Filename).Close End Function
毎回、あなたの質問は的を得ない質問ばかりですね。
コードを示してください。
170個のファイルの内容(30セルなんですよね?)を一つのシートに貯めておくのも一つの方法かも知れません。データを読み込んだ時のファイルの更新日時もシートに記録しておいて、検索時には、更新日時を記録と比較し、異なっているファイルだけ読み込むとか。
運用状況がよく分からないのですが、170個のファイルの内容の更新頻度にもよると思います。
>kitasueさん
ご返信ありがとうございます。
このVBAを実行する前に、別シートに貯めておくということでしょうか?
そもそも、ひとつのファイルにまとめておいて、
見せたいときに見せたいように加工編集して表示してはいかがでしょうか?
それから、
一番最初にアドバイスがあった、数式での参照はやってみてないのでしょうか?
> このVBAを実行する前に、別シートに貯めておくということでしょうか?
170個のファイルの更新頻度が高くなく、検索頻度が高いのであれば、一度読み込んだデータを別シートに貯めておくのも一つの手だと思います。
> mattuwanさん
ご返信ありがとうございます!
数式での参照はエラーが多々あり、帰宅後に別マクロにて勉強中です
回答1件
あなたの回答
tips
プレビュー