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のプロセスが終了しない状態になってしまいます。(そのコードの
みコメントアウトすると解放されます)
コードの記述が間違っているのでしょうか。
> 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 回発行する必要があります。
魔界の仮面弁士さん、早速のご教授ありがとうございます。
ご指摘の通りMarshal.ReleaseComObject(xlRange)を追加したところ
プロセスの終了ができました。助かりましたm(__)m
てっきり、
xlSheetPro = xlSheet.Protection
のようにデータの代入時のみかと思っておりましたが参照時も増加
するんですね。
xlSheets = xlBook.Worksheets
xlSheet = xlSheets(1)
も勘違いしておりました。ありがとうございます。