tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルVB2010でのエクセルの起動と終了
記事No10774
投稿日: 2012/04/09(Mon) 14:44
投稿者かっちゃん
いつも大変お世話になっております。
今回も苦労しておりますよろしくお願いいたします

Win-7でVB2010を使っております
フォームアプリケーションからクラスライブラリを通り
エクセルシートを読んで処理するプログラムです。

質問1
 エクセルの起動を一度にしたいので CASE 0 の エクセル起動の中にエクセルワークエリアDIM5行を入れたいのですがエラーになります。
 Public Sub SetInXls の 下に エクセルワークエリア5行を入れてありますが、SetInXls を通るたびに エクセルが起動してしまいます。
 一番先頭のPublic Class KaClass の 下にエクセルワークエリアDIM5行入れましたら、プログラムが終了するまでエクセルは停止しなくなりました。
 エクセルを使用するフォームでエクセルを立ち上げ、フォームがCLOSEになったらエクセルを終了するようにしたいのですがどのように作成すればよろしいでしょうか

質問2
 CASE 6 の 保存と終了もエラーとなります

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

**ブック名:ABC・シート名:エクセルシート
         (1列目) (2列目)
(1行目)     100      1111
(2行目)     200      2222

** フォームアプリケーション **
Private Sub cmdJiko_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdJiko.Click
' Excelを起動(入力)
  Call KaOBJ.SetInXls(0, 0, "", "", "", 0, 0, 0, "", "")
' 既存のワークブックを開く
  Call KaOBJ.SetInXls(1, 0,”C”, "ABC", "エクセルシート", 1, 0, 0, "", "")
‘ エクセルの最終行確保
  wklngLastSu = KaOBJ.NI
‘ 1行目から 100, 1111, 200, 2222 の順に表示する
  wklngRow = 1
  Do Until wklngRow > wklngLastSu
     Call KaOBJ.SetInXls(3, 1, "", "", "", 0, 0, 0, Str(wklngRow), "1")
     MSGBOX (KaOBJ.NI)    
     Call KaOBJ.SetInXls(3, 1, "", "", "", 0, 0, 0, Str(wklngRow), "2")
     MSGBOX (KaOBJ.NI)  
     wklngRow = wklngRow + 1
   Loop
' Excelを終了
   Call KaOBJ.SetInXls(6, 1, "", "", "", 0, 0, 0, "", "")
   Call KaOBJ.SetInXls(7, 0, "", "", "", 0, 0, 0, "", "")
End Sub

** クラスライブラリ・オブジェクト名:KaOBJ **
Imports XL = Microsoft.Office.Interop.Excel  
Public Class KaClass

  Public ReadOnly Property NI() As String
        Get
            NI = CStr(wklngItem)
        End Get
  End Property

  Public Sub SetInXls(ByRef Flag As Byte, ByRef SubFl As Byte, ByRef FrmItem As String, ByRef strItem As String, ByRef SubstrIm As String, ByRef bytItem As Byte, ByRef intItem As Short, ByRef lngItem As Integer, ByRef TblX As String, ByRef TblY As String)
   ' エクセルワークエリア
    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
  
    Select Case Flag
      Case 0
      ' Excel起動
     '  xlsInApp = CreateObject("Excel.Application")  不要?
      Case 1
        Select Case SubFl
          Case 0
          ' 既存のエクセルシート使用
            xlsInBooks = xlsInApp.Workbooks
            xlsInbook = xlsInBooks.Open(Trim(FrmItem) & Trim(strItem) & ".xls")
            xlsInSheets = xlsInbook.Worksheets
            xlsInSheet = xlsInbook.Sheets(Trim(SubstrIm))
           'シートの最終セルを選択します
        xlsInSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Select()
           '最終行を表示しています
            wklngItem = xlsInApp.ActiveCell.Row
        End Select
      Case 3
        Select Case SubFl
          Case 0
          ' エクセルへ内容を移送
            xlsInSheet.Cells(Val(TblX), Val(TblY)) = strItem
          Case 1
          ' エクセルの内容をワークへ移送
            wklngItem = xlsInSheet.Range(xlsInSheet.Cells(Val(TblX), Val(TblY)), xlsInSheet.Cells(Val(TblX), Val(TblY))).Value.ToString
        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

Class

[ツリー表示へ]
タイトルRe: VB2010でのエクセルの起動と終了
記事No10775
投稿日: 2012/04/09(Mon) 17:04
投稿者魔界の仮面弁士
> Public Sub SetInXls(ByRef Flag As Byte, ByRef SubFl As Byte, ByRef FrmItem As String, ByRef strItem As String, ByRef SubstrIm As String, ByRef bytItem As Byte, ByRef intItem As Short, ByRef lngItem As Integer, ByRef TblX As String, ByRef TblY As String)

何故、各引数が ByRef 宣言されているのでしょうか?
いずれも 出力引数であるようには思えませんし、ByVal のままで良いと思いますけれども。


>  エクセルの起動を一度にしたいので CASE 0 の エクセル起動の中に
Select Case Flag に渡す値は、それぞれどのような意味があるのでしょうか?
マジックナンバーだと、第三者や後からコードを見た人が意味を掴みにくいので、
列挙型を使うか、あるいはせめてコメントを入れるなどしておきましょう。


>  エクセルワークエリアDIM5行を入れたいのですがエラーになります。
これは、Sub SetInXls の先頭にある変数宣言の事でしょうか。
具体的には、どの行で何というエラーになるのでしょうか? (想像はつきますが…)


> SetInXls を通るたびに エクセルが起動してしまいます。

SetInXls を複数回通過する際に起動回数を減らしたいなら、
 Excel 起動 → SetInXls → SetInXls → SetInXls → Excel 終了
のような動きになると思いますが、その場合、Excel がいつ起動して
いつ終了するのかという有効期間を定めるために、Excel.Application 等の変数を、
「Sub SetInXls の外側」で管理するようにしてください。

現在のように、「Sub SetInXls の内側」で変数を Dim 宣言していた場合、
それらの変数の有効期間は、そのメソッド内だけに留まってしまいます。

メソッド内のローカル変数は、End Sub 等でメソッドを抜けると使えなくなくなります。
もう一度 SetInXls が呼び直されたとしても、その時は新たな変数が使われるだけであり、
たとえ Case 7 が呼び出されても、xlsInApp 変数の中身は空っぽ(Nothing)のままです。

外側で変数を用意してやることで、この状況(質問2の問題)を解決できます。


> xlsInSheets = xlsInbook.Worksheets
> xlsInSheet = xlsInbook.Sheets(Trim(SubstrIm))
上記では、xlsInbook.Worksheets を変数に取得していますが、
xlsInbook.Sheets の方は変数に取得し忘れているように見えます。
強いて言うならば、
 xlsInWorksheets = xlsInbook.Worksheets
 xlsInSheets = xlsInbook.Sheets
 xlsInSheet = xlsInSheets(Trim(SubstrIm))
が正しいコードでは無いでしょうか。
あるいはシートの種類によっては、
 xlsInSheet = xlsInSheets(Trim(SubstrIm))
でも良いかもしれません。
(バージョンによっては、Worksheet への DirectCast が必要かも)


変数に受ける理由については、下記の記事をご覧ください。
これは、オブジェクトの早期解放処理のために必要な手順の一部であり、
この点を見直せば、質問1の問題を解決できるはずです。
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm



> xlsInSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Select()
> wklngItem = xlsInApp.ActiveCell.Row
これも同様の理由から、
 a = xlsInSheet.Cells
 b = a.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)
 'b.Select()
 wklngItem = b.Row
のように、個々の Range オブジェクトを変数に受けておくべきかと思います。


また、元のコードでは Select メソッドと ActiveCell プロパティを利用していますが、
Active〜系プロパティや Selection プロパティ等は多用しないよう心掛けてください。

これは、VB でコードを書くときに、
  strItem = Me.TextBox1.Text
と書くべきところで、わざわざ
  Me.TextBox1.Focus()
  TextBox2.Text = Me.ActiveControl.Text
のように書かないのと同じ理屈です。

[ツリー表示へ]
タイトルRe^2: VB2010でのエクセルの起動と終了
記事No10780
投稿日: 2012/04/10(Tue) 13:32
投稿者かっちゃん
> > Public Sub SetInXls(ByRef Flag As Byte, ByRef SubFl As Byte, ByRef FrmItem As String, ByRef strItem As String, ByRef SubstrIm As String, ByRef bytItem As Byte, ByRef intItem As Short, ByRef lngItem As Integer, ByRef TblX As String, ByRef TblY As String)
>
> 何故、各引数が ByRef 宣言されているのでしょうか?
> いずれも 出力引数であるようには思えませんし、ByVal のままで良いと思いますけれども。
>
はい、ありがとうございます。 ByRefでなくByVal です

> >  エクセルの起動を一度にしたいので CASE 0 の エクセル起動の中に
> Select Case Flag に渡す値は、それぞれどのような意味があるのでしょうか?
> マジックナンバーだと、第三者や後からコードを見た人が意味を掴みにくいので、
> 列挙型を使うか、あるいはせめてコメントを入れるなどしておきましょう。
>
 コメントを入れてわかりやすくしました
>
> >  エクセルワークエリアDIM5行を入れたいのですがエラーになります。
> これは、Sub SetInXls の先頭にある変数宣言の事でしょうか。
> 具体的には、どの行で何というエラーになるのでしょうか? (想像はつきますが…)

       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
              Select Case SubFl
                Case 0
                ' 既存のエクセルシート使用
                  xlsInBooks = xlsInApp.Workbooks
         CASE 1 以降で”宣言されていません” のエラーが当然でてしまいました

>
> > SetInXls を通るたびに エクセルが起動してしまいます。
>
> SetInXls を複数回通過する際に起動回数を減らしたいなら、
>  Excel 起動 → SetInXls → SetInXls → SetInXls → Excel 終了
> のような動きになると思いますが、その場合、Excel がいつ起動して
> いつ終了するのかという有効期間を定めるために、Excel.Application 等の変数を、
> 「Sub SetInXls の外側」で管理するようにしてください。
>
> 現在のように、「Sub SetInXls の内側」で変数を Dim 宣言していた場合、
> それらの変数の有効期間は、そのメソッド内だけに留まってしまいます。

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

    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起動

「Sub SetInXls の外側」に出すと処理は無事終了するのですが

 メニューフォームで設定しているクラスを接続する箇所
  ' クラス接続(クラスオブジェクト)
    Public KaOBJ As New ClassLibrary1.KaClass

 「外側」に出した
' エクセルワークエリア
  Dim xlsInApp As New XL.Application

 を実行してしまい、プログラムが終了するまでエクセルが起動している状態です。
 クラスの最上部に設定してある
  Imports XL = Microsoft.Office.Interop.Excel
 が原因でしょうか?
 エクセルを起動するフォームで起動させ、フォームを抜けた時、エクセルも
 終了させたいです。
         
>
> メソッド内のローカル変数は、End Sub 等でメソッドを抜けると使えなくなくなります。
> もう一度 SetInXls が呼び直されたとしても、その時は新たな変数が使われるだけであり、
> たとえ Case 7 が呼び出されても、xlsInApp 変数の中身は空っぽ(Nothing)のままです。
>
> 外側で変数を用意してやることで、この状況(質問2の問題)を解決できます。
 外側に出しましたら解決しました
>
>
> > xlsInSheets = xlsInbook.Worksheets
> > xlsInSheet = xlsInbook.Sheets(Trim(SubstrIm))
> 上記では、xlsInbook.Worksheets を変数に取得していますが、
> xlsInbook.Sheets の方は変数に取得し忘れているように見えます。
> 強いて言うならば、
>  xlsInWorksheets = xlsInbook.Worksheets
>  xlsInSheets = xlsInbook.Sheets
>  xlsInSheet = xlsInSheets(Trim(SubstrIm))
> が正しいコードでは無いでしょうか。
> あるいはシートの種類によっては、
>  xlsInSheet = xlsInSheets(Trim(SubstrIm))
> でも良いかもしれません。
> (バージョンによっては、Worksheet への DirectCast が必要かも)

下記のように修正しましたら、処理は無事終了しました
' 既存のエクセルシート使用
    xlsInBooks = xlsInApp.Workbooks
    xlsInbook = xlsInBooks.Open(Trim(FrmItem) & Trim(strItem) & ".xls")
    xlsInSheets = xlsInbook.Worksheets
    xlsInSheet = xlsInSheets(Trim(SubstrIm))
>
>
> 変数に受ける理由については、下記の記事をご覧ください。
> これは、オブジェクトの早期解放処理のために必要な手順の一部であり、
> この点を見直せば、質問1の問題を解決できるはずです。
> http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
>
>
>
> > xlsInSheet.Cells.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Select()
> > wklngItem = xlsInApp.ActiveCell.Row
> これも同様の理由から、
>  a = xlsInSheet.Cells
>  b = a.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell)
>  'b.Select()
>  wklngItem = b.Row
> のように、個々の Range オブジェクトを変数に受けておくべきかと思います。
>
 エラーがでなかったのでいいのかと思っていましたが、
 ありがとうございます。修正いたしました。
>
> また、元のコードでは Select メソッドと ActiveCell プロパティを利用していますが、
> Active〜系プロパティや Selection プロパティ等は多用しないよう心掛けてください。
>
> これは、VB でコードを書くときに、
>   strItem = Me.TextBox1.Text
> と書くべきところで、わざわざ
>   Me.TextBox1.Focus()
>   TextBox2.Text = Me.ActiveControl.Text
> のように書かないのと同じ理屈です。

 色々参考になりました。
 どうにか、エクセルを止めたいと思っております。
 よろしくお願いいたします

[ツリー表示へ]
タイトルRe^3: VB2010でのエクセルの起動と終了
記事No10781
投稿日: 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 本体が終了してくれない。

[ツリー表示へ]
タイトルRe^4: VB2010でのエクセルの起動と終了
記事No10782
投稿日: 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 本体が終了してくれない。

[ツリー表示へ]
タイトルRe^5: VB2010でのエクセルの起動と終了
記事No10783
投稿日: 2012/04/12(Thu) 12:52
投稿者魔界の仮面弁士
> 下記のロジックのどこを修正すればよろしいでしょうか
現在のコードは、そもそも ReleaseComObject を一切呼んでいないのですから、
たとえ xlsInApp.Quit() したとて、Excel がいつ終了するかは保証されません。


> どうしてもエクセルが止まりません。
最初に紹介した URL の内容を、もう一度確認してみてください。
そこに、Excel を終了させるための手順が解説されているはずです。
( ReleaseComObject の必要性についても記載されています)

もし、先の URL の内容で分からない点がある場合には、記事中の
どの部分が分からないのかを具体的に質問してみてください。
記事の内容を理解していないことには、その処理を
自身のプログラムに当てはめることもできないでしょうから。

[ツリー表示へ]
タイトルRe^6: VB2010でのエクセルの起動と終了
記事No10784
投稿日: 2012/04/13(Fri) 11:17
投稿者かっちゃん
(お礼)
色々とありがとうございました。

終了の仕方に工夫が必要でした。
やっと、思うように起動し終了することができました。

VB6からの変更は修正箇所がたくさんあり大変です。
DataCmboコントロール も見当たんないので、
別なコントロールに変える必要があるのでしょうね!

本当に助かりました。
感謝しております。

> 下記のロジックのどこを修正すればよろしいでしょうか
> 現在のコードは、そもそも ReleaseComObject を一切呼んでいないのですから、
> たとえ xlsInApp.Quit() したとて、Excel がいつ終了するかは保証されません。
>
>
> > どうしてもエクセルが止まりません。
> 最初に紹介した URL の内容を、もう一度確認してみてください。
> そこに、Excel を終了させるための手順が解説されているはずです。
> ( ReleaseComObject の必要性についても記載されています)
>
> もし、先の URL の内容で分からない点がある場合には、記事中の
> どの部分が分からないのかを具体的に質問してみてください。
> 記事の内容を理解していないことには、その処理を
> 自身のプログラムに当てはめることもできないでしょうから。

[ツリー表示へ]