0

特定の場所にあるすべてのブックを開き、それらのブックからデータを引き出して検証し、アクティブなブックにコピーするExcelスプレッドシートにVBAマクロを記述しました。次に、ディレクトリ内の次のブックを開き、ディレクトリ内のすべてのファイルが読み込まれるまでこのプロセスを繰り返します。

一度開いたターゲットワークブックを閉じることができないように見えることを除いて、すべてが機能します。これには、Excelを閉じることも含まれます。ワークブックをシステムメモリから解放するには、タスクマネージャーまたはPowerShellでプロセスを強制終了する必要があります。

Set fs = CreateObject("Scripting.FileSystemObject")
strExcelFileName = Dir(ThisWorkbook.Path & "\Certs\*.xls", vbNormal)
Set xlApp = CreateObject("Excel.Application")
Do While (strExcelFileName <> "")
      xlApp.Workbooks.Open (ThisWorkbook.Path & "\Certs\" + strExcelFileName)
      'code to run for each workbook opened
      ***xlApp.Workbooks.Close*** 'when present, Excel freezes
      strExcelFileName = Dir 'next file in directory
Loop

xlApp.Workbooks.Close行が存在し、プログラムで呼び出されると、Excelは毎回フリーズします。それがなければ、システムが圧倒されてフリーズする前に、3〜5冊のワークブックを実行できます。次に、これらのプロセスを強制終了し、それらのファイルを移動し、さらに3つ移動して、すべてのファイルがこのように処理されるまで繰り返す必要があります。50を通過するのに約1時間半かかります。

私がやろうとしているのは、次のデータを開く前に、データを閉じてから取得するブックを作成することです。

ActiveWorkbook.Close

これは、読み取り用に開かれたブックではなく、マクロが実行されているブックを閉じようとします。

4

2 に答える 2

4

すでにExcelを開いているので、別のコピーを開く必要はありません。試す:

Set WBookOther = Workbooks.Open(PathCrnt & FileNameCrnt)
  :
  :
WBookOther.Close SaveChanges:=False

現在のフォルダ内のすべてのブックがさらに役立つ可能性がありますが、この以前の回答は循環しています。

于 2012-04-04T13:51:30.527 に答える
3

私は何の問題もなくあなたのコードを実行しました、しかしここにもっときれいな代替案があります:

Dim strExcelFileName As String
Dim xlApp As Object
Dim wbk As Workbook

strExcelFileName = Dir(ThisWorkbook.Path & "\Certs\*.xls", vbNormal)
Set xlApp = CreateObject("Excel.Application")
Do While (strExcelFileName <> "")
      Set wbk = xlApp.Workbooks.Open(ThisWorkbook.Path & "\Certs\" _
          + strExcelFileName) ' set a reference to the workbook you're opening

      'code to run for each workbook opened
      'Your code should use the "wbk" reference to make sure
      ' you're accessing the correct workbook.

      wbk.Close ' close the workbook using the reference you set earlier

      strExcelFileName = Dir 'next file in directory
Loop
于 2012-04-04T17:24:23.277 に答える