プロが教えるわが家の防犯対策術!

 ネット上で散々ある良回答を拝見させていただいても,
自分で解決しきれませんでした.どうぞよろしくお願いいたします.

 下の2行を追加するとエクセルが解放できなくなってしまいます.
Private Sub Excel一括置換(ByRef N As Integer)
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
Dim WB As Excel.Workbook
Dim xlSheet As Excel.Worksheet
Dim Mypath As String = TextBoxパス.Text
Dim FName As String

FName = Dir(Mypath & "*.xls", vbNormal)
Do While FName <> ""
WB = xlBooks.Open(Mypath & FName)
For Each xlSheet In WB.Worksheets 'For N_s = 1 To WB.Worksheets.Count

Next 'Next N_s
' ↑の2行がなくなれば無事解放できます
MRComObject(xlSheet) : xlSheet = Nothing
WB.Save() : WB.Close()
MRComObject(WB)
FName = Dir()
Loop

Me.Activate()
xlSheet = Nothing
WB = Nothing
MRComObject(xlBooks) : xlBooks = Nothing
xlApp.Quit() : MRComObject(xlApp) : xlApp = Nothing
End Sub

 最初の「For N_s = 1 To WB.Worksheets.Count」という書き方だと,
ネット上で見かけるWorksheet「暗黙のオブジェクト」になるのかな??と思い,
xlSheetを宣言してみましたが,うまくいきません.
できればFor N_s = ~ という記述法にしたいのですが...
 お詳しい方がいらっしゃれば,どうぞよろしくお願いいたします.

A 回答 (1件)

こんにちは、



私も、エクセルのオブジェクトの解放の問題になったときに
紹介されたページ

http://hanatyan.sakura.ne.jp/dotnet/index.html

花ちゃん、コード見ると、このページにもたどり着いた様に
見受けられますが。

このページと、camputerさんのコードを見て
気づいた点として、

Dim xlSheets As Excel.Sheets = xlBook.Worksheets

(注意)Sheetも宣言しますが、Sheetsも宣言しています。

がないですね。

そのせいか、

xlSheetsの表現が、WB.Worksheets に変わっています。

花ちゃんでは、

花ちゃんから、転載****************

1.基本的に、下記のように、[.]が2つ連続で使用されたら解放できません。

誤り 
    xlRange = xlCells(1,1)
    xlRange.Interior.Color = RGB(0, 255, 0)

    '使った変数の解放処理(.NETからExcelの基本的な操作方法 参照の事)
    MRComObject(xlCells)
    MRComObject(xlRange)

    xlRange = xlCells(1, 1)
    Dim xlInterior As Excel.Interior
    xlInterior = xlRange.Interior
    xlInterior.Color = RGB(0, 255, 0)

    MRComObject(xlInterior)
    MRComObject(xlCells)
    MRComObject(xlRange)    
 必ず、上記のように分解して変数に受けて、解放処理をして下さい。

***************************************転載終了

WB.Worksheets.Countの表現を使っていますが。

花ちゃんからの転載に書いてある。[.]が2つ連続で使用されています。

ここは、WB.WorksheetsをxlSheetsで受けて、
xlSheets.Countに変えたほうが、良い様な気がします。

とうぜん、xlSheetsを、使っているので、他にもこれ用にコードを
変更しないと、いけないかも知れませんが。

後は、気がついた点は、ないです。

外していたら、ごめん。
    • good
    • 0
この回答へのお礼

 どうもありがとうございます.
 分かりにくくてもうしわけございませ.
'For N_s = 1 To WB.Worksheets.Count
のほうはコメントアウトしております.

For Each xlSheet In WB.Worksheets が実行文になります.

 しかしtom11様のご指摘で
Dim xlSheet As Excel.Worksheetではなく
Dim xlSheet As Excel.Worksheetsにしたところ
正常に解放されるようになりました.ご指摘どうもありがとうございました.
今からExcel.WorksheetとExcel.Worksheetsについて勉強してみます.
 ほんとうにどうもありがとうございました.

お礼日時:2009/05/24 16:41

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