2017-02-09 16 views
1

エクセルファイルを開き、その中の情報を更新した後、マクロを数回実行してからExcelファイルを閉じます。問題は、EXCEL.EXEインスタンスが実行されていてもコードが実行され、Accessが閉じられていても、EXCEL.EXEインスタンスがまだアクティブであることです。私はthis postからの推奨事項を、アクセス側とメインマクロが実行された後に呼び出されるExcelファイル内のマクロとして、プロセスの実行状態にかかわらず試してみました。私は二重チェックして、実行するコード内の他の場所にExcelへの参照を開く何もありませんし、ExcelマクロはExcelの新しいインスタンスを開くこともありません。EXCEL.EXEを閉じるとExcelが終了する

私はExcel 2016とAccess 2007を使用しています(会社ポリシーのため、新しいバージョンのAccessにアップグレードすることはできません)。次のように

私は、Excelファイルを開くマクロを実行すると、Excelアプリケーションを閉じるために使用している元のコードは次のとおりです。

Dim XL As Excel.Application 
Dim WB As Excel.Workbook 
Dim WS As Excel.Worksheet 

Set XL = New Excel.Application 
XL.Visible = False 
XL.DisplayAlerts = False 

Set WB = XL.Workbooks.Open(Exporter) 
Set WS = WB.Sheets(1) 

For i = 0 to 9 
    '-Generate data to place in excel sheet here- 
    WS.Range("A1") = SomeData 
    WS.Range("B1") = SomeOtherData 
    XL.Run "Excel Macro" 
Next i 

Set WS = Nothing 
WB.Close False 
Set WB = Nothing 
XL.Quit 
Set XL = Nothing 
+0

これはOKと思われるので、Excelマクロ内にあると仮定します。 '' Excelマクロ ''のコードを何かに変更してみてください。また、コードでは文字体裁の引用符を使用しないでください。 – Andre

+0

私は 'debug.print'でコメントを印刷して終了し、タスクマネージャを見て、EXCEL.EXEの新しいインスタンスが終了しないサブを作った。 – 110SidedHexagon

+2

クレイジーアイデア:あなたがアクセスしているすべての**オブジェクト( 'Sheets'コレクション、およびアクセスされたすべての' Range'オブジェクトを含む)への参照を保持し、それらをクリーンアップコードの 'Nothing'に' Set'します。これはVBAコードだから*必要ではないはずですが、COM interopコードでは、残っているゴーストプロセスを正しく終了させる方法です。 –

答えて

1

それは実際にコードの問題ではなかったように見えます。私の会社には、Excelが開かれたときに自動的に読み込まれ、コードによって作成されたExcelのインスタンスにCOMアドインが読み込まれているようなExcel用のウォーターマークCOMアドインがアドインが存在する限り実行を停止することはできませんthis SO questionのディスカッションごとにロードされます。 VBA経由でCOMアドインを手動で無効にする必要があったため、適切なアクセス許可が与えられていれば、問題のCOMアドインを無効にする必要があります。

For i = 1 To XL.COMAddIns.Count 
    XL.COMAddIns(j).Connect = False 
Next i 
関連する問題