事象
ExcelVBAにて以下のようなソースコードで、複数のExcelファイルの開閉をしながら処理をしていると、少しづつ遅延が発生する場合があります。
開閉を行うファイルサイズにもよりますが、1000ファイル単位になると、段々と遅くなります。
Sub openFile()
Dim wb As Workbook
Dim fileList As Variant
Dim f As Variant
'開くファイルのディレクトリを取得
fileList = Range("A1").CurrentRegion
'一つ一つ、ファイルを開閉する。
For Each f In fileList
Set wb = Workbooks.Open(f)
wb.Close
Next
End Sub
原因
Excelファイルを閉じる際に、メモリ解放が出来ておらず、タスクに少しづつサイズ容量が蓄積されていくのが原因のようでした。
※発生する場合としない場合があります。
単純な処理であれば発生しないですが、複雑な処理を加えるほど、発生するような気がします。(体感です。)
解決方法
Close後にDoEventsを入れることで、閉じるまで待ってくれるようです。
Sub openFile()
Dim wb As Workbook
Dim fileList As Variant
Dim f As Variant
'開くファイルのディレクトリを取得
fileList = Range("A1").CurrentRegion
'一つ一つ、ファイルを開閉する。
For Each f In fileList
Set wb = Workbooks.Open(f)
wb.Close
'Close待機
DoEvents
Next
End Sub
DoEventsとは?
制御をオペレーティング システムに渡します。 オペレーティング システムがキューのイベントの処理を終了し、SendKeys キュー内のすべてのキーが送信された後、制御は戻されます。
参考サイト