tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルEXCELが止まらない
記事No11303
投稿日: 2014/08/15(Fri) 07:52
投稿者かっちゃん
いつも助かっております。
また、よろしくお願いいたします。

WINDOWS7でVB2010よりEXCEL2010を使っております

** VB2010の構文 **

Imports XL = Microsoft.Office.Interop.Excel

エクセルワークエリア
    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

Excel起動
   xlsInApp = New XL.Application
エクセルシート設定
   xlsInBooks = xlsInApp.Workbooks
   xlsInbook = xlsInBooks.Open(“ABC.xls”)
   xlsInSheets = xlsInbook.Worksheets
   xlsInSheet = xlsInSheets("sheet1")

エクセルを終了する
   xlsInbook.Close(False)
   xlsInApp.Quit()

上記ですとEXCELが終了します。

下記のようにシートの最終行を確認する構文を入れますとEXCELが終了しなくなります
エクセルシート設定
   xlsInBooks = xlsInApp.Workbooks
   xlsInbook = xlsInBooks.Open(“ABC.xls”)
   xlsInSheets = xlsInbook.Worksheets
   xlsInSheet = xlsInSheets("sheet1")
** Dim A = xlsInSheet.Cells
** DimB=A.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)
**' B.Row から最終行を確認しています

エクセルを終了する
   xlsInbook.Close(False)
   xlsInApp.Quit()

どのような構文にしたらよいでしょうか
よろしくお願いいたします

[ツリー表示へ]
タイトルRe: EXCELが止まらない
記事No11304
投稿日: 2014/08/15(Fri) 09:24
投稿者魔界の仮面弁士
>    xlsInbook = xlsInBooks.Open(“ABC.xls”)
「"」ですよね実際は。
「”」では無く。


> ** DimB=A.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)
「Dim B」ですよね実際は。

> **' B.Row から最終行を確認しています
その部分のコードも見せてください。

> エクセルを終了する
解放処理(Marshal.ReleaseComObject メソッド)の呼び出しは何処に?
http://hanatyan.sakura.ne.jp/vb2005/vb2005excel01.htm

[ツリー表示へ]
タイトルRe^2: EXCELが止まらない
記事No11305
投稿日: 2014/08/15(Fri) 23:06
投稿者かっちゃん
> >    xlsInbook = xlsInBooks.Open(“ABC.xls”)
> 「"」ですよね実際は。
> 「”」では無く。
>
>
> > ** DimB=A.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)
> 「Dim B」ですよね実際は。
>
> > **' B.Row から最終行を確認しています
> その部分のコードも見せてください。
>
> > エクセルを終了する
> 解放処理(Marshal.ReleaseComObject メソッド)の呼び出しは何処に?
> http://hanatyan.sakura.ne.jp/vb2005/vb2005excel01.htm

すみません
ロジックを分かりやすいように簡略したつもりでしたが、
実際のロジックに直してみます

WINDOWS7でVB2010よりEXCEL2010を使っております

** VB2010の構文 **

エクセルシートはDの直下にABC.xlsで保存されています

  Dim wkintLastSu As Integer ' エクセル件数
  Call WinkOBJ.SetInXls(0, 0, "D:\", "ABC", "sheet1", 0, 0, 0, 0, "", "")
  wkintLastSu = WinkOBJ.NI


  Imports XL = Microsoft.Office.Interop.Excel

エクセルワークエリア
    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 shoItem As Short,
     ByVal intItem As Integer, ByVal lngItem As Long, ByVal TblX As String, ByVal TblY As String)
      ' Excel起動
        xlsInApp = New XL.Application
    
      ' 既存のエクセルシート使用
        xlsInBooks = xlsInApp.Workbooks
        xlsInbook = xlsInBooks.Open(Trim(FrmItem) & Trim(strItem) & ".xls")
        xlsInSheets = xlsInbook.Worksheets
        xlsInSheet = xlsInSheets(Trim(SubstrIm))
  
     ' シート解放
        MRComObject(xlsInSheet)            'xlsSheet の解放
        MRComObject(xlsInSheets)           'xlsSheets の解放
      ' エクセルを保存せず終了する
        xlsInbook.Close(False)
      ' ブック解放
        MRComObject(xlsInbook)             'xlsBook の解放
        MRComObject(xlsInBooks)            'xlsBooks の解放

        xlsInApp.Quit()                    'Excelを閉じる
        MRComObject(xlsInApp)              'xlsApp を解放
    End Sub


    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


  上記ですとEXCELが終了します。

  下記のようにシートの最終行を確認する構文を入れますとEXCELが終了しなくなります
      ' 既存のエクセルシート使用
        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)
      '最終行を表示しています
        wkintItem = B.Row
      '******************************************

     ' シート解放
        MRComObject(xlsInSheet)            'xlsSheet の解放
        MRComObject(xlsInSheets)           'xlsSheets の解放
      ' エクセルを保存せず終了する
        xlsInbook.Close(False)
      ' ブック解放
        MRComObject(xlsInbook)             'xlsBook の解放
        MRComObject(xlsInBooks)            'xlsBooks の解放

        xlsInApp.Quit()                    'Excelを閉じる
        MRComObject(xlsInApp)              'xlsApp を解放

すみません
よろしくお願いいたします

[ツリー表示へ]
タイトルRe^3: EXCELが止まらない
記事No11306
投稿日: 2014/08/16(Sat) 21:11
投稿者VBレスキュー(花ちゃん)
>       '*******シートの最終セルを選択します*******
>         Dim A = xlsInSheet.Cells
>         Dim B = A.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)

これらの COM オブジェクトの解放処理はどこでしていますか?
使用した COM オブジェクトは解放処理等(変数に受けてデクリメントする等)が必要です。
  http://www.hanatyan.sakura.ne.jp/dotnet/excel10.htm

先に魔界の仮面弁士さんが紹介されたリンク先の[Excel のプロセスが正常に終了しない理由]の項をよく読んで
見て下さい。
よく読んで理解されないと、又同じ事で質問する事になります。
xlsInSheet.Cells の使用方法も書いてありますよ。

こちらには、SpecialCells の使用例もあります。
  9.使用されたセル範囲内の最後のセルを取得
  http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=319&no=34

[ツリー表示へ]
タイトルRe^4: EXCELが止まらない
記事No11307
投稿日: 2014/08/18(Mon) 22:11
投稿者かっちゃん
> >       '*******シートの最終セルを選択します*******
> >         Dim A = xlsInSheet.Cells
> >         Dim B = A.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)
>
> これらの COM オブジェクトの解放処理はどこでしていますか?
> 使用した COM オブジェクトは解放処理等(変数に受けてデクリメントする等)が必要です。
>   http://www.hanatyan.sakura.ne.jp/dotnet/excel10.htm
>
> 先に魔界の仮面弁士さんが紹介されたリンク先の[Excel のプロセスが正常に終了しない理由]の項をよく読んで
> 見て下さい。
> よく読んで理解されないと、又同じ事で質問する事になります。
> xlsInSheet.Cells の使用方法も書いてありますよ。
>
> こちらには、SpecialCells の使用例もあります。
>   9.使用されたセル範囲内の最後のセルを取得
>   http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=319&no=34

 色々な場所で使っていたので、一つづつ確認しながら
 修正して、オバケEXCELが残るのを防ぐことができました。
 苦労していたので、非常に助かりました。
 本当にありがとうございました。
 また、よろしくお願いいたします

           かっちゃん

[ツリー表示へ]