Excelのプロセスを終了させるには?

解決


初心者  2009-01-30 05:22:45  No: 141391

VB2008にてExcel作成(レイトバインド)をしているのですが、シートの保護の編集を許可する処理を入れるとプロセスの終了ができなくなります。どうかご教授願いますでしょうか。
Dim xlApp as Object
Dim xlBooks as Object
Dim xlBook as Object
Dim xlsheets as Object
Dim xlsheet as Object
Dim xlRange as Object
Dim xlSheetPro as Object
Dim lSheetPAE as Object

xlApp = CreateObject("Excel.Application")
xlBooks = xlApp.Workbooks
xlBook = xlBooks.Add    'ブック作成
xlSheets = xlBook.Worksheets(1)
xlSheet = xlSheets

'編集可能セル範囲指定----------------
xlSheetPro = xlSheet.Protection
xlRange = xlSheet.Range("B3:F39,H3:H39,G1") '編集許可のセル範囲
xlSheetPAE = xlSheetPro.AllowEditRanges
xlSheetPAE.Add("範囲1", xlRange)
'------------------------------------
xlSheet.Protect(True, True, True) 'シートの保護設定

'解放--------------------------------
Marshal.ReleaseComObject(xlRange) 
Marshal.ReleaseComObject(xlSheetPAE)
Marshal.ReleaseComObject(xlSheetPro)
Marshal.ReleaseComObject(xlSheet) 
Marshal.ReleaseComObject(xlSheets) 
xlBook.close()
xlBooks.close()
xlApp.Quit()
Marshal.ReleaseComObject(xlBooks)
Marshal.ReleaseComObject(xlBook)
Marshal.ReleaseComObject(xlApp)
'-------------------------------------

上記の”xlSheetPAE.Add("範囲1", xlRange)”で編集範囲を追加すると
Excelのプロセスが終了しない状態になってしまいます。(そのコードの
みコメントアウトすると解放されます)
  コードの記述が間違っているのでしょうか。


魔界の仮面弁士  2009-01-30 05:34:41  No: 141392

> Dim lSheetPAE as Object
→Dim xlSheetPAE As Object

> xlSheets = xlBook.Worksheets(1)
> xlSheet = xlSheets
ではなく、
  xlSheets = xlBook.Worksheets
  xlSheet = xlSheets(1)
かと。

> 上記の”xlSheetPAE.Add("範囲1", xlRange)”で編集範囲を追加すると
この時点で、xlRange の参照カウントが増加したためです。
(アーリーバインドの場合は増加しません)

ですからこの場合は、
  Marshal.ReleaseComObject(xlRange) 
を計 2 回発行する必要があります。


初心者  2009-01-30 06:03:53  No: 141393

魔界の仮面弁士さん、早速のご教授ありがとうございます。
ご指摘の通りMarshal.ReleaseComObject(xlRange)を追加したところ
プロセスの終了ができました。助かりましたm(__)m
てっきり、
 xlSheetPro = xlSheet.Protection
のようにデータの代入時のみかと思っておりましたが参照時も増加
するんですね。

  xlSheets = xlBook.Worksheets
  xlSheet = xlSheets(1)
も勘違いしておりました。ありがとうございます。


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加