タイトル : Re^3: VB2010でのエクセルの起動と終了 投稿日 : 2012/04/10(Tue) 19:53 投稿者 : 魔界の仮面弁士
> Select Case Flag > Case 0 > ' Excel起動 > Dim xlsInApp As New XL.Application > Dim xlsInBooks As XL.Workbooks > Dim xlsInbook As XL.Workbook > Dim xlsInSheets As XL.Sheets > Dim xlsInSheet As XL.Worksheet > Case 1 この場合、それらの変数のスコープ(適用範囲)は Case 0 のブロックだけになり、 Case 1 のブロックや、Select Case〜End Select の外側では使えなくなります。 http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard8.htm > 「Sub SetInXls の外側」に出すと 外側では「Dim」ではなく、Private(あるいはFriend/Publicなど)を使いましょう。 > 処理は無事終了するのですが 外側に出した後は、最後に終了処理(Flag = 7 でしたっけ?)を呼び出す必要が生じます。 もし、終了処理を呼び出しているのに Excel が残ってしまっているのであれば、 呼び出しコードに問題があることになりますので、前回の回答で紹介した "Excelのプロセスが正常に終了しない理由" の URL の内容にしたがって、 もう一度コードを見直してみてください。 > ' エクセルワークエリア > Dim xlsInApp As New XL.Application その場合、xlsInApp 変数を用意すると共に、Excel も一緒に起動されることになります。 もしもそのアプリが、必ず Excel を起動するという仕様なのであれば構いませんが、 Excel を起動しないという「何もしないパターン」がありえるのであれば、 「変数宣言」と「(New による)インスタンス生成」は分けて記述することをお奨めします。 (変数宣言の New は使わずに、Case 0 にて「xlsInApp = New XL.Application」するなど) > クラスの最上部に設定してある > Imports XL = Microsoft.Office.Interop.Excel > が原因でしょうか? 無関係です。 そのコードは、フルネームで書くと Dim xlsInBooks As Global.Microsoft.Office.Interop.Excel.Workbooks などと記述せねばならないコードを、 Dim xlsInBooks As XL.Workbooks のように省略記述できるようにするための構文に過ぎません。 同様に、SpecialCells の時に使っていた Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell という定数も、その Imports によって XL.XlCellType.xlCellTypeLastCell と省略表記できるようになっているかと思います。 > エラーがでなかったのでいいのかと思っていましたが、 > ありがとうございます。修正いたしました。 ReleaseComObject メソッドの呼び出し時に困りますので、常に それぞれの COM オブジェクトを変数に受け取っておく事をお奨めします。 ReleaseComObject の呼び出し漏れにより、Excel が正常に終了しなかった場合、 その時にはエラーが出なかったとしても、以下のような問題が生じることがあります。 ・xlsInApp.Quit() した後、再度 Excel を New して別の処理を行わせる場合、 二回目以降の処理が誤動作してしまう。 ・終了処理を行った後も Excel.exe が(時には非表示のまま)残り続けてしまい、 即座に Excel 本体が終了してくれない。 |