- 締切済み
【.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でアドバイスいただく前にネット検索につきましてもしっかり行ってみたつもりなのですが, よくわかりませんでした.(もし検索が下手でしたらどうもすみません...) もしお詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたくお願いいたします. どうぞよろしくお願いします.
- camputer
- お礼率96% (29/30)
- Visual Basic
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- phoenix343
- ベストアンサー率15% (296/1946)
#1です。 レスを見ましたが、ちゃんと理解してから使うようにしてください、、 このMRComObjectに渡しているなら、 MRComObject(myS)もNextの後にしないとだめでしょう。 だってmyS = Nothingと同じようなことしてるんですから。 「ReleaseComObject」で検索かけてみてください。 どういう処理なのかおぼろげながら分かるかなと思います。 ※OfficeにあるオブジェクトはすべてCOM化してると考えればOK
- phoenix343
- ベストアンサー率15% (296/1946)
PowerPointは持ってないので憶測ですけど。 追加行のNextの前にあるmyS = Nothingは要りません。 要るとしたらNextの後でしょう。 あと追加行で指定してるMRComObjectの引数とNextの後で指定してる引数が気になります。同じオブジェクトの型では無いのはお分かりですよね?
補足
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が解放されない時もあれば,押す前に一瞬で消える時もあります. どれか一つでもアドバイスいただけるようでしたら,是非よろしくお願いします. また上記コードの書き方に何か些細な突っ込みでもございましたら,いただければ嬉しいです. なにとぞお願いいたします.
- ベストアンサー
- Visual Basic
- .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 = ~ という記述法にしたいのですが... お詳しい方がいらっしゃれば,どうぞよろしくお願いいたします.
- ベストアンサー
- Visual Basic
- (再質問) .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等ネットで見かけるものは一通り試したつもりなのですが... もしお詳しい方がいらっしゃれば,些細なことでも結構ですので なんでもアドバイスいただければ非常にうれしいです. どうぞよろしくお願いいたします.
- ベストアンサー
- Visual Basic
- 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
- 締切済み
- Visual Basic
- 「オブジェクトの破棄」と「メモリの解放」は同じ意味
「オブジェクトの破棄」と「メモリの解放」は同じ意味ですか? ********************************* 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)でコンパイルの警告が出力されるのですが 回避する方法はないのでしょうか。
- ベストアンサー
- Visual Basic
- 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
- ベストアンサー
- Visual Basic
- スライド内のオブジェクトを消すマクロ
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で回しているので、漏れはないはずなのですが、どなたか原因・対策をご教示いただけないでしょうか?
- ベストアンサー
- Visual Basic
- 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~に何か原因があるのでしょうか。
- 締切済み
- SE・インフラ・Webエンジニア
- 【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などといたしますと「宣言されていません」とエラーが 出てしまうと思うのでございますが。。。。 もしお詳しい方がいらっしゃいましたら、是非ともアドバイスいただきたく お願い申し上げます。
- ベストアンサー
- Visual Basic
お礼
phoenix343様 ご回答どうもありがとうございます! 色々と調べております. 以前エラーで「Reintrancyが検出されました~」というのが多発して困った際に, 毎回Nextの前で解放するとうまくいき始めたのがきっかけでこのようにしております. どうもすみません.OSの環境を明記しておりませんでした. 今うまく解放したい動作環境がVista+PPT2007になりますが, 今日別のPC(Win2000+Office2000)で試してみたところ,何故か解放されました. OSの影響かOfficeのバージョンなのか分かりませんでしたが... もし何か些細なことでもご指摘・アドバイスいただけることがございましたら, 是非ともよろしくお願いいたします.