以下は、他ブックのセルのデータを300個 配列HAiretuに入れて、Match関数を使ってHairetuの中に指定された文字(変数targetの中身)があるかどうか調べています。
あればTrueを、無ければFalseを返します。これを多くて170回繰り返すのですが、処理が重たいのか途中でフリーズ?してしまいます。
ファイルを開かないExecuteExcel4Macroを使えば、処理速度は早くなるという認識で使ったのですが、どこが原因で途中で止まってしまうのでしょうか。
####現在のコード
Function tes(target, Filename) As Boolean path = Sheet_path(c) Dim Hairetu(1 To 300) As Variant For i = 1 To 300 Hairetu(i) = ExecuteExcel4Macro("'" & path & "[" & Filename & "]シート'!R" & i & "C81") Next i On Error Resume Next num = Application.WorksheetFunction.Match(target, Hairetu, 0) On Error GoTo 0 If num = 0 Then tes = False Else tes = True End If End Function
######試したこと
Matchは配列の検索に向かないと仮説をたて、セルに書き出してから検索させましたが、変わりませんでした。
For i = 1 to 300 Cells(i,21) = ExecuteExcel4Macro("'" & path & "[" & Filename & "]シート'!R" & i & "C81") Next i On Error Resume Next num = Application.WorksheetFunction.Match(target, Range("U1:U300"), 0) On Error GoTo 0
> 処理が重たいのか途中でフリーズ?してしまいます。
Excelマクロは少し時間がかかるものを実行するとフリーズしたように見えることがあります。待てばだいたいは実行完了すると思います。
> ファイルを開かないExecuteExcel4Macroを使えば、処理速度は早くなる
普通にファイルを開くのとどちらが速いかはファイルサイズや処理内容によるかと思います。両方試して速い方を採用してはどうでしょうか?
重い一番の理由はセルをループで一つ一つ配列に入れてるからだと思いますよ。
ExecuteExcel4Macroでできるのかはやったことないですが、
少なくとも開いたブックならRangeで300セル分範囲選択して一回の動作で配列に格納することが可能です。
そもそもMatchは配列に対して行うと遅いです。
ブック開いてRangeを対象とした方が高速なのですがそれだとまずいのでしょうか。
回答2件
あなたの回答
tips
プレビュー