アプリ版:「スタンプのみでお礼する」機能のリリースについて

Access VBAでエクセルシートをテーブルに読み込むプログラムを作成中で、目的の動作は
実現できたのですが処理完了してもコピー元エクセルシートにロックがかかったままで、
タスクマネージャを見るとエクセルプロセスが残っている事が分かり、プロセスキルの方法
をWebで色々検索してみたのですが解決方法が分からずどなたかアドバイス頂けないでしょうか?
宜しくお願いします。

<試した事>
WorkbookをClose、ExcelアプリオブジェクトをQuitしても駄目でした。
ReleaseComObjectをCreateObjectした順と逆に使用するとプロセスキルできると
あったのですがこちらは投稿者環境のメソッド一覧に存在せずエラーとなりました。

<投稿者環境>
Visual Basic for Applications 7.1 Version1119
Microsoft 365 Apps for enterprise 16.0.13801.21214
ドットネットフレームワークのインストールはアプリ一覧になし


当該ソースコード本文に記載したところNTTレゾナントの検閲でひっかかってしまった
のでスクリーンショットを添付します。
エディタコピーでなく手打ちコピーしたので誤字あったらごめんなさい。

「Access VBAから使用したExce」の質問画像

A 回答 (4件)

こんにちは。



ご質問のようなオートメーションを使った処理の場合、オブジェクト変数をちゃんと破棄した方が良い気がします。

bk.Close: Set bk = Nothing
exap.Quit: Set exap = Nothing

でどうなりますか?

余談ですが、ブックを開かずにADODBを使って直接データをテーブルにインポートする方法もあります。
こちらの方がゴーストプロセスに悩まされなくて良いかもしれません。
    • good
    • 1
この回答へのお礼

教えていただいた通りに破棄処理を加えたところ処理完了後にエクセルのバックグラウンドプロセスが消えている事を確認できました、助かりました、ありがとうございます。


ADODBというのがあるんですね、調べてみます。
Excelオブジェクトだとオブジェクト作成時に時間もかかりますし、こういった後処理の手間の不確実性があることが分かったので次からは検討したいとおもいます。

お礼日時:2022/06/09 10:34

Access VBA のサンプルソースです。



Sub testProc()
  
  '↓ここで表示するダイアログのオブジェクト変数は Access 管理下
  ' Nothing し忘れても Access が自動破棄してくれます
  Dim fd  As FileDialog
  Set fd = Application.FileDialog(msoFileDialogFilePicker)
  With fd
    .AllowMultiSelect = False
    .InitialView = msoFileDialogViewDetails
    .Filters.Clear
    .Filters.Add "Excelファイル", "*.xls; *.xlsx; *.xlsm", 1
  End With
  If fd.Show <> -1 Then '<-- [x][Cancel]ボタンは0
    Exit Sub
  End If

  '↓これより下のオブジェクト変数は Excel 管理下なので Access
  ' が自動破棄してくれません。
  ' 漏れなく破棄しないとプロセスが残ります。エラー処理含めて。
  
  Dim xlApp As Object ' 破棄必須 Excel Application
  Dim wb  As Object ' 破棄必須 Excel Workbook
  Dim sh  As Object ' 破棄必須 Excel Worksheet

  On Error GoTo Err_

  '↓ここでプロセスが起動します
  Set xlApp = CreateObject("Excel.Application")
  '非表示で起動するので、表示したいときは
  xlApp.Visible = True

  'ここに処理
  Set wb = xlApp.Workbooks.Open(fd.SelectedItems(1))
  Set sh = wb.Worksheets("Sheet1")

  '(略)

Bye_:
  On Error Resume Next
  ' 破棄する順は下流から上流へを守らないと
  ' オートメーションエラーが発生する
  Set sh = Nothing
  wb.Close:  Set wb = Nothing
  xlApp.Quit: Set xlApp = Nothing
  Exit Sub

Err_:
  MsgBox Err.Description, vbCritical
  Resume Bye_
End Sub
    • good
    • 2

エクセルのメソッドを実行するときは必ずエクセルアプリケーション由来のオブジェクト変数を使用しなければならないのに、それが1カ所でももれているとプロセスが残ります。



省略されている部分にそのような場所がないか丹念に探すしかありません。
    • good
    • 2

こんにちは


bk.close
exap.quit
の順番を逆にしてみてください
exap.quit
bk.close
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A