8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VBAでExcelファイル開閉を繰り返すと、徐々に遅延が発生する不具合を解消(メモリ解放)

Posted at

事象

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 キュー内のすべてのキーが送信された後、制御は戻されます。

参考サイト

8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?