tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板)
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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 本体が終了してくれない。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。