• 締切済み

【.NET】PowerPointのSlideオブジェクトの解放について

   こんにちは,.NETでOfficeを扱う際の解放について勉強をしております. 質問させていただきます.どうぞよろしくお願いいたします.  PPT2007の文字を操作しておりますが,     Dim myAPP As PowerPoint.Application     myAPP = CreateObject("PowerPoint.Application")     Dim myAPPpre As PowerPoint.Presentation      ・・・     myAPPpre = myAPPpres.Open(Mypath & FName, WithWindow:=Microsoft.Office.Core.MsoTriState.msoFalse) のあと,     Dim myS As PowerPoint.Slide     Dim mySlides As PowerPoint.Slides       ・・・・・       mySlides = myAPPpre.Slides       MRComObject(mySlides) : mySlides = Nothing だとPOWERPNT.EXEがすぐに解放されますが,     Dim myS As PowerPoint.Slide     Dim mySlides As PowerPoint.Slides       ・・・・・       mySlides = myAPPpre.Slides       For Each myS In mySlides       '追加行         MRComObject(myS) : myS = Nothing '追加行       Next                 '追加行       MRComObject(mySlides) : mySlides = Nothing と,Slideオブジェクトを入れると解放されなくなってしまいます. 文字列の操作は正常に動作いたしますが.  「Dim myS As PowerPoint.」まで打ったところで一覧で出される候補名を確認しましたところ Slideだけ,Slides等他のオブジェクトとロゴマークが異なるのですが,これは関係あるのでしょうか?? またこの一覧の下の方に「_Slides」なるものも見つけ試してみましたが,うまくいきません.  OKWaveでアドバイスいただく前にネット検索につきましてもしっかり行ってみたつもりなのですが, よくわかりませんでした.(もし検索が下手でしたらどうもすみません...)  もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたくお願いいたします. どうぞよろしくお願いします.

みんなの回答

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.2

#1です。 レスを見ましたが、ちゃんと理解してから使うようにしてください、、 このMRComObjectに渡しているなら、 MRComObject(myS)もNextの後にしないとだめでしょう。 だってmyS = Nothingと同じようなことしてるんですから。 「ReleaseComObject」で検索かけてみてください。 どういう処理なのかおぼろげながら分かるかなと思います。 ※OfficeにあるオブジェクトはすべてCOM化してると考えればOK

camputer
質問者

お礼

 phoenix343様 ご回答どうもありがとうございます!  色々と調べております. 以前エラーで「Reintrancyが検出されました~」というのが多発して困った際に, 毎回Nextの前で解放するとうまくいき始めたのがきっかけでこのようにしております.  どうもすみません.OSの環境を明記しておりませんでした. 今うまく解放したい動作環境がVista+PPT2007になりますが, 今日別のPC(Win2000+Office2000)で試してみたところ,何故か解放されました. OSの影響かOfficeのバージョンなのか分かりませんでしたが...  もし何か些細なことでもご指摘・アドバイスいただけることがございましたら, 是非ともよろしくお願いいたします.

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

PowerPointは持ってないので憶測ですけど。 追加行のNextの前にあるmyS = Nothingは要りません。 要るとしたらNextの後でしょう。 あと追加行で指定してるMRComObjectの引数とNextの後で指定してる引数が気になります。同じオブジェクトの型では無いのはお分かりですよね?

camputer
質問者

補足

 phoenix343 様  どうもありがとうございます. アドバイスいただいた通りmyS = Nothing はNext直後に修正いたしました.  「オブジェクトの型」につきましてはmySがSlideで,mySlidesがSlides ということでしょうか??  MRComObjectの引数??・・でございますか.すみません, きちんと理解していないです.どのオブジェクトについても同じ 以下のコードを使用しております.   Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False)     If objCom Is Nothing Then       Return     End If     Try     If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then       If force Then         System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)       Else         Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)         Debug.WriteLine(count)         End If     End If     Finally     objCom = Nothing   End Try   End Sub  ネットでコピペしていただいてきたものです. Wordで同じことを試みると,上のコードで共通使用して解放できたので, 今回もこれを前オブジェクト共通で使用しております.意味分からず使用しておりますが..  もし何かお気づきになること等ございましたら, 是非ともアドバイスをよろしくお願いいたします.  

関連するQ&A

  • .NETでエクセル解放時のコーディング・現象についてアドバイスください

     こんばんは,いつも勉強させていただいております. どうぞよろしくお願いいたします.  毎夜寝ずに.NETプログラミングでエクセルが動くのを楽しんでおりますが, 手元の参考書とネット検索だけではすっきりしない疑問点が数点あります. どれか一つでもアドバイスいただけると非常に嬉しいです. もしお詳しい方がいらっしゃいましたら,どうぞお願いいたします.  「.」が沢山あるような深いプロパティ等を使いたい際(たとえばエクセルの シート上にグラフが数個あり,これらの軸ラベルを変更するとき) xlSheet.ChartObject.Chart.Axes(1).Axistitle.text = "test" といきなり書くと解放できなくなると思うのですが, (1)この一行を書くためだけに,すべての階層のObjectを作成・解放するものなのでしょうか???   一応動作はするのですが,あまりこんな書き方を見かけないのですが.....    Dim ChartObject As Object    Dim ChartObjects = xlSheet.ChartObjects    For Each ChartObject In ChartObjects      ChartObject.Activate()      Dim myChart As Object = ChartObject.Chart      Dim myAxes As Object = myChart.Axes      Dim myAxis1title As Object = myAxes(1).Axistitle      Dim myAxis2title As Object = myAxes(2).Axistitle        myAxis1title.text = "test"        myAxis2title.text = "test"      MRComObject(myAxis2title) : myAxis2title = Nothing      MRComObject(myAxis1title) : myAxis1title = Nothing      MRComObject(myChart) : myChart = Nothing      MRComObject(myAxes) : myAxes = Nothing      MRComObject(ChartObject) : ChartObject = Nothing    Next    MRComObject(ChartObjects) : ChartObjects = Nothing (2)解放の順序については,下の階層からすべき? みたいなルールは特に無いのでしょうか.      'たとえば↓みたいに下の階層から解放するか,      MRComObject(myAxis1title) : myAxis1title = Nothing      MRComObject(myAxes) : myAxes = Nothing      MRComObject(myChart) : myChart = Nothing      'もしくは↓みたいに上の階層から解放するか      MRComObject(myAxis1title) : myAxis1title = Nothing      MRComObject(myAxes) : myAxes = Nothing      MRComObject(myChart) : myChart = Nothing (3)下のコードだとぜんぜん問題ないんですが,      Dim ChartObject As Object      Dim ChartObjects = xlSheet.ChartObjects      MRComObject(ChartObject) : ChartObject = Nothing      MRComObject(ChartObjects) : ChartObjects = Nothing    次のようにFor,Nextを入れるだけでExcelが解放されなくなります.      Dim ChartObject As Object      Dim ChartObjects = xlSheet.ChartObjects      For Each ChartObject In ChartObjects        MRComObject(ChartObject) : ChartObject = Nothing      Next      MRComObject(ChartObjects) : ChartObjects = Nothing    この現象に一番困っております.もし何かお気づきになることがございましたら,    是非ともアドバイスしてやってください. (4)Excel解放のタイミングが,同じプログラム実行時でも弱冠異なるのですが,    これはよくある現象なのでしょうか?それともコーディングに問題が???     たとえば,        Excel操作 →解放 →msgbox("終わり")    としたときに,メッセージボックスのOKをわざと押さずに待機していると    OKを押すまでExcel.Exeが解放されない時もあれば,押す前に一瞬で消える時もあります.   どれか一つでもアドバイスいただけるようでしたら,是非よろしくお願いします.  また上記コードの書き方に何か些細な突っ込みでもございましたら,いただければ嬉しいです.  なにとぞお願いいたします.

  • .NETでエクセル解放がうまくいきません.

     ネット上で散々ある良回答を拝見させていただいても, 自分で解決しきれませんでした.どうぞよろしくお願いいたします.  下の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 = ~ という記述法にしたいのですが...  お詳しい方がいらっしゃれば,どうぞよろしくお願いいたします.

  • (再質問) .NETでエクセル解放に悩んでおります.

     数個前のスレッドで勘違いして,締め切らせていただきました. 申し訳ございません.未解決で同じ質問をさせてください.  コードの流れといたしましては,  エクセル操作  ↓  エクセル解放  ↓  ←下記2行のコードが無ければ,この時点でExcel.exeは消えています.  MsgBox("終了")   ↓  アプリケーションを右上の×マークから終了(下記2行のコードを入れると,Excel.exeがギリギリまで残っております.)       Dim xlApp As New Excel.Application Dim xlBooks As Excel.Workbooks = xlApp.Workbooks Dim WB As Excel.Workbook Dim xlSheets As Excel.Worksheets 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   Next  ' ↑の2行がなくなれば無事解放できます   WB.Save() : WB.Close()   MRComObject(WB)   FName = Dir() Loop Me.Activate() MRComObject(xlSheet) : xlSheet = Nothing MRComObject(xlSheets) : xlSheets = Nothing WB = Nothing MRComObject(xlBooks) : xlBooks = Nothing xlApp.Quit() : MRComObject(xlApp) : xlApp = Nothing MsgBox("終了")  先ほどのスレッドでアドバイス・指摘していただいた部分とあわせて 色々試してみましたが,自分では怪しそうな個所を見つけることすらできません... 暗黙宣言やNothing,Quit等ネットで見かけるものは一通り試したつもりなのですが...  もしお詳しい方がいらっしゃれば,些細なことでも結構ですので なんでもアドバイスいただければ非常にうれしいです.  どうぞよろしくお願いいたします.

  • Excelオブジェクトの解放

    VBでExcelを編集しています。 下記コードを実行するとExcelがタスクに残ったままになります。 どうしたら解放されるでしょうか。 (処理は少し省略しています) Dim objExcel as Object Dim objExcelBook as Object Dim objExcelSheet as Object Set objExcel = CreateObject("excel.application") Set objExcelBook = objExcel.Workbooks.Open(パス, 0) Set objExcelSheet = objExcelBook .Sheets(シート名) With objExcelSheet.Range(Cells(1,2),Cells(3,2)).Borders(xlEgeBottom) .LineStyle = xlContinuous End With Set objExcelSheet = Nothing Set objExcelBook = Nothing Set objExcel = Nothing

  • 「オブジェクトの破棄」と「メモリの解放」は同じ意味

    「オブジェクトの破棄」と「メモリの解放」は同じ意味ですか? ********************************* Sub Sample1() Dim objIE As Object Dim buf As String Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.navigate "http://oshiete.goo.ne.jp/" Do While objIE.busy DoEvents Loop Do While objIE.Document.readyState <> "complete" DoEvents Loop Set objIE = Nothing End Sub ********************************* の場合の「Set objIE = Nothing」は、 「オブジェクトの破棄」でしょうか? 「メモリの解放」でしょうか? どちらでもありますか? ご回答よろしくお願いします。

  • VB2008でのExcelオブジェクトの宣言と解放

    下記のようなコードを書きました。 Public Sub XXXXXXXXXXX Dim xlApp As New Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As New Excel.Worksheet try xlApp = CreateObject("Excel.Application") xlApp.Workbooks.Open(Filename:=excelTempPath, UpdateLinks:=0) xlBook = DirectCast((xlApp.Workbooks.Open(excelTempPath)), Excel.Workbook) シートのコピー、削除など操作 xlBook.Close(SaveChanges:=True, Filename:=strExcelPath) xlApp.Quit() Finally MRComObject(xlSheet) MRComObject(xlBook) System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) xlApp = Nothing End Try End Sub Public Sub MRComObject(Of T As Class)(ByRef objCom As T, Optional ByVal force As Boolean = False) If objCom Is Nothing Then Return End If Try If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then If force Then System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom) Else Dim count As Integer = System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom) End If End If Finally objCom = Nothing End Try End Sub MRComObject(xlBook)でコンパイルの警告が出力されるのですが 回避する方法はないのでしょうか。

  • VB.NET Excelの解放

    Excel出力の解放について質問です。 下記URLを参考に作成しましたが、出力をし終えたときにプロセスを見るとExcelの解放がされません。 http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm 助言をもらえないでしょうか? With SaveFileDialog1 .FileName = savefilename If .ShowDialog() = Windows.Forms.DialogResult.OK Then wstrPath = .FileName() If Func_Excelチェック(wstrPath) = False Then Exit Function End If End If End With Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook = xlbooks.Add Dim xlsheets As Excel.Sheets = xlbook.Worksheets Dim xlsheet As Excel.Worksheet = xlsheets.Item(1) Dim xlCells As Excel.Range Dim xlRange1 As Excel.Range xlCells = xlsheet.Cells Dim i As Integer = 1 作成データテーブルに接続 xlRange1 = xlCells(1, 1) xlRange1.Value = "工場番号" MRComObject(xlRange1, True) While sqlReader.Read xlRange1 = xlCells(i + 1, 1) xlRange1(xlCells(i + 1, 1)).Select() xlRange1.Value = sqlReader("入力_工場番号") MRComObject(xlRange1, True) i += 1 End While excel.DisplayAlerts = False xlsheet.SaveAs(wstrPath) 'Select Case Val(excel.Version) 'Case 9 'xlbook.SaveAs(Filename:=wstrPath) 'Case 12 'xlbook.SaveAs(Filename:=wstrPath, FileFormat:=56) 'End Select 'MRComObject(xlsheet, True) excel.DisplayAlerts = True MRComObject(xlsheet)'xlSheet の解放 MRComObject(xlsheets)'xlSheets の解放 xlbook.Close()'xlBook を閉じる MRComObject(xlbook)'xlBook の解放 MRComObject(xlbooks)'xlBooks の解放 excel.Quit()'Excelを閉じる MRComObject(excel)'excel を解放 Private Function Func_Excelチェック(ByVal arg As String) As Boolean Dim excel As New Excel.Application Dim xlbooks As Excel.Workbooks = excel.Workbooks Dim xlbook As Excel.Workbook excel.Visible = False excel.Application.DisplayAlerts = False Try If System.IO.File.Exists(arg) = True Then xlbook = xlbooks.Open(arg) xlbook.SaveAs(arg, FileFormat:=42, CreateBackup:=False) MRComObject(xlbook, True) Return True Else Return True End If Catch ex As Exception MessageBox.Show("") Return False Finally xlbooks.Close() MRComObject(xlbooks, True) excel.Quit() MRComObject(excel, True) End Try End Function

  • スライド内のオブジェクトを消すマクロ

    PowerPointのVBAマクロで、スライド中にspaceという文字列のみのテキストボックス以外のオブジェクトを消すマクロを以下のように作成したのですが、このマクロを実行しても、いくつかのオブジェクトが残ってしまいます。 Sub foo()  Dim f As Boolean  Dim sl As Slide  Dim sh As Shape   For Each sl In ActivePresentation.Slides    For Each sh In sl.Shapes     If sh.HasTextFrame Then         If sh.TextFrame.TextRange.Text <> "space" Then             sh.Delete         End If     End If    Next   Next End Sub コレクションをFor eachで回しているので、漏れはないはずなのですが、どなたか原因・対策をご教示いただけないでしょうか?

  • Worksheetsオブジェクト解放について・・

    VB2005からエクセルを操作するプログラムを書いてます。 設計条件として遅延バインディングの制約があります。 以下のコードではプロセスが残ってしまい原因が分かりません。 有識者のご教授をお願いします。 Public Function OpenBook () As Boolean 'エクセルブックを開く関数 Dim exlAppli As Object = Nothing Dim exlBooks As Object = Nothing Dim exlBook As Object = Nothing Dim exlSheets As Object = Nothing Dim exlSheet As Object = Nothing Try exlAppli = CreateObject("Excel.Application") exlAppli.Visible = False exlAppli.DisplayAlerts = False exlBooks = exlAppli.Workbooks exlBook = exlBooks.Add '(新規作成) exlSheets = exlBook.Worksheets For Each exlSheet In exlSheets '処理 ' ・・中略・・ ' 'シート1個づつをオブジェクト解放 Call Me.sub_ReleaseComObject(DirectCast(sht, Object)) Next Catch ex As Exception '例外処理 MessageBox.Show(ex.Message, "サンプル", MessageBoxButtons.OK, MessageBoxIcon.Error) Return False Finally Call Me.sub_ReleaseComObject(DirectCast(exlSheet, Object)) Call Me.sub_ReleaseComObject(DirectCast(exlSheets, Object)) exlBook.Close(False) Call Me.sub_ReleaseComObject(DirectCast(exlBook, Object)) Call Me.sub_ReleaseComObject(DirectCast(exlBooks, Object)) exlAppli.Quit() Call Me.sub_ReleaseComObject(DirectCast(exlAppli, Object)) End Try Return True End Function 事前バインディングなら上記のコードでプロセスは終了します。 ちなみに、勝手な想像ですが、For Each~に何か原因があるのでしょうか。

  • 【VB.NET】事後バインディングにおける引数の宣言方法

    【VB.NET】事後バインディングにおける引数の宣言方法  今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  開発環境:VB2008+XP になります。  Excel操作コードの部分を事後バインディングにすべく 勉強いたしております。  たとえば   「事前バインディング」     Dim myApp As New Excel.Application     Dim myBook As Excel.Workbook     Dim myBooks As Excel.Workbooks = myApp.Workbooks     Dim xlSheet As Excel.Worksheet     Dim xlSheets As Excel.Sheets       ↓   「事後バインディング」     Dim myApp As Object     Dim myBook As Object     Dim myBooks As Object     Dim xlSheet As Object     Dim xlSheets As Object     myApp = CreateObject("Excel.Application")     myBook = myApp.WorkBook     myBooks = myApp.WorkBooks     xlSheet = myApp.Worksheet     xlSheets = myApp.Sheets のようにするのだと思うのでございますが、  Sub Excel2(ByRef myRng As Excel.Range, ・・・・)                  ↑ここはどうやって宣言すべき                    なのでございましょうか???  「Sub Excel2」内ではmyAppが宣言されておりませんゆえ myApp.Rangeなどといたしますと「宣言されていません」とエラーが 出てしまうと思うのでございますが。。。。       もしお詳しい方がいらっしゃいましたら、是非ともアドバイスいただきたく お願い申し上げます。

専門家に質問してみよう