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

タイトル Re^4: VB2010でのエクセルの起動と終了
投稿日: 2012/04/11(Wed) 23:14
投稿者かっちゃん
色々ありがとうございます
どうしてもエクセルが止まりません。
下記のロジックのどこを修正すればよろしいでしょうか
よろしくお願いいたします

読み出しロジック
   Call KaOBJ.SetInXls(0, 0, "", "", "", 0, 0, 0, "", "")
   Call KaOBJ.SetInXls(1, 0,”C”, "ABC", "エクセルシート", 1, 0, 0, "", "")
   データ件数
   wklngLastSu = KaOBJ.NI
   Excelを終了
   Call KaOBJ.SetInXls(6, 1, "", "", "", 0, 0, 0, "", "")
   Call KaOBJ.SetInXls(7, 0, "", "", "", 0, 0, 0, "", "")

** KaOBJ クラス **

' エクセルワークエリア
   Private xlsInApp As XL.Application
   Private xlsInBooks As XL.Workbooks
   Private xlsInbook As XL.Workbook
   Private xlsInSheets As XL.Sheets
   Private xlsInSheet As XL.Worksheet

   Public Sub SetInXls(ByVal Flag As Byte, ByVal SubFl As Byte, ByVal FrmItem As String, ByVal strItem As String, ByVal SubstrIm As String, ByVal bytItem As Byte, ByVal intItem As Short, ByVal lngItem As Integer, ByVal TblX As String, ByVal TblY As String)
     Select Case Flag
       Case 0
       ' Excel起動
         xlsInApp = New XL.Application
       Case 1
         Select Case SubFl
           Case 0
           ' 既存のエクセルシート使用
             xlsInBooks = xlsInApp.Workbooks
             xlsInbook = xlsInBooks.Open(Trim(FrmItem) & Trim(strItem) & ".xls")
             xlsInSheets = xlsInbook.Worksheets
             xlsInSheet = xlsInSheets(Trim(SubstrIm))
            'シートの最終セルを選択します
             Dim A = xlsInSheet.Cells
             Dim B = A.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)
            '最終行を表示しています
             wklngItem = B.Row
         End Select
       Case 6
         xlsInSheet = Nothing
         Select Case SubFl
           Case 0
           ' エクセルを保存して終了する
             xlsInbook.Close(True)
             xlsInbook = Nothing
           Case 1
           ' エクセルを保存せず終了する
             xlsInbook.Close(False)
             xlsInbook = Nothing
        Case 2
           ' Excelをテキストで保存する
             xlsInApp.DisplayAlerts = False
             xlsInSheet.SaveAs(Filename:=Trim(FrmItem) & Trim(strItem) & ".txt", FileFormat:=Excel.XlWindowState.xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False)
             xlsInApp.DisplayAlerts = True
         End Select
       Case 7
       ' エクセル終了
         xlsInApp.Quit()
         xlsInApp = Nothing
    End Select
  End Sub


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

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

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