追記依頼:: Function IsContained(target, filename) As Booleanに配列にセルの値を格納するコードを書いています。以下でエラーがでます。
myarray2(1, i) = Workbooks(filename).Worksheets("説明").vbDate(1, i)
参考資料 https://excel-ubara.com/excelvba1/EXCELVBA414.html
http://yumem.cocolog-nifty.com/excelvba/2010/11/post-de50.html
https://officevba.info/cellstoarray/
https://www.moug.net/tech/exvba/0100049.html
170近くの数のファイルを配列Sheetに格納して、配列に入っているファイルを一つづつ取り出します。
取り出したファイルのCC列のセルのデータを取得し、現在開いているAファイルと、取り出したデータを照合し、Aファイルと同じデータがあれば[一致]を、なければ、どんどんファイルを取り出していき、全てのファイルに同じデータがなければ、[不一致]を入力するプログラムを書いています。
現在のコードですと、配列に入っているファイルを全て開くのに、20分ほどかかってしまいます。
過去にも似たような、質問をさせていただきましたが上手く実装できませんでした。
今回はコード全体を載せて質問させていただきます。
あまりコードの形を崩さずに、ファイルを早く開いて処理をする方法はありませんでしょうか?
以下がコードとなります。VBA歴1ヶ月のコードで、お見苦しいかもしれませんが、よろしくお願いいたします。
function関数の2行目にファイルを開く処理を記述しています
グローバル変数 仮で200 Dim Sheet(200) As String 'ファイルのパスとシート名(book.xlsxなど)が合わさったものを格納の配列 Dim Sheet_path(200) 'ファイルのパスだけ配列に格納 Dim b As Long Dim a As Long Sub hikaku() Set this = ThisWorkbook.Worksheets("イベント") a = 1 e = 2 c = 1 d = 1 this_line = this.Cells(Rows.Count, 7).End(xlUp).Row 'G列のデータの最終行を取得 Do While this_line > a 'AファイルのG列のデータ分だけループ target = this.Cells(e, 7).Value '(AファイルG列のデータを取得) Do While UBound(Sheet) > d '配列の要素数分だけ繰り返し filename = Sheet(c) '配列に入っているデータ(比較ファイルのパス)を変数に格納 '関数呼び出し Call IsContained(target, filename) If IsContained(target, filename) = True Then '戻り値がTrueだった場合 this.Cells(e, 8).Value = "一致" Exit Do Else this.Cells(e, 8).Value = "不一致" End If d = d + 1 c = c + 1 Loop d = 1 c = 2 b = b + 1 a = a + 1 Loop End Sub '関数 Function IsContained(target, filename) As Boolean '関数 path = Sheet_path(b) 'パスだけ変数に代入 '######ここで開く処理 Set open_file = Workbooks.Open(filename:=path & "\" & filename, UpdateLinks:=False) this_line = Workbooks(filename).Worksheets("説明").Cells(Rows.Count, 81).End(xlUp).Row `比較ファイルのデータの最終行を取得 i = 1 j = 10 Application.ScreenUpdating = False Dim s As String '配列にセルの値を入れる処理 s = ("CC10:" & "CC" & CStr(this_line)) Dim vbDate As Variant Dim myarray2 vbDate = Range(s) ReDim myarray2(1, 1 To 200) For i = LBound(vbDate, 1) To UBound(vbDate, 1) 'ここでエラー myarray2(1, i) = Workbooks(filename).Worksheets("説明").vbDate(1, i) Next i Do While this_line / 2 > i 'データ数分だけ繰り返し セルが結合してあるので2で割る ThisWorkbook.Activate If Workbooks(filename).Worksheets("説明").Cells(j, 81).Value Like target Then 'AファイルG列のデータが、比較ファイルにあれば IsContained = True Exit Do Else i = i + 1 j = j + 2 End If IsContained = False Loop Workbooks(filename).Close Application.ScreenUpdating = True End Function
回答3件
あなたの回答
tips
プレビュー