エクセルを勝手に終了するとエラーが出てしまうのはどうしてですか?

解決


  2006-06-13 19:17:52  No: 131831

こんにちは。良です。たびたび質問すみません。

    Private Sub btnExcel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExcel.Click

        ''プロジェクト→参照の追加→COM→Microsoft Excel *.* ObjectLibrary を参照して下さい
        '(1)==================  起動時の処理  ===================  
        Dim xlApp As New Excel.Application
        Dim xlBooks As Excel.Workbooks = xlApp.Workbooks
        '新規のファイルを開く場合
        Dim xlBook As Excel.Workbook = xlBooks.Add
        Dim xlSheets As Excel.Sheets = xlBook.Worksheets
        Dim xlSheet As Excel.Worksheet = xlSheets.Item(1)
   

        xlApp.Visible = True    'Excelを表示(必ずとも表示しなくてもよい)
        '======================  起動処理ここまで  ===============

        '==================  データの入力処理  ==================  
        Dim xlRange As Excel.Range
        Dim strDat(2, 0) As Object
        xlRange = xlSheet.Range("A5:A7")    'データの入力セル範囲
        strDat(0, 0) = "10"                 'データの作成
        strDat(1, 0) = "20"
        strDat(2, 0) = "=Sum(A5:A6)"             '計算式
        xlRange.Value = strDat              'セルへデータの入力

        '又は、
        Dim xlCells As Excel.Range
        Dim xlRange1 As Excel.Range
        xlCells = xlSheet.Cells
        xlRange1 = xlCells(5, 3)
        xlRange1.Value = "12"
        MRComObject(xlRange1)               'xlRange1 の解放(都度解放しないとだめ)
        xlRange1 = xlCells(6, 3)
        xlRange1.Value = "34"
        MRComObject(xlRange1)               'xlRange1 の解放(都度解放しないとだめ)
        xlRange1 = xlCells(7, 3)
        xlRange1.Value = "=C5+C6"
        MRComObject(xlCells)                'xlCells の解放(こちらは1回でOK)
        MRComObject(xlRange1)               'xlRange1 の解放
        MRComObject(xlRange)              'xlRange の解放
        '==================  データの入力処理ここまで  ==================  
        'エクセルの表示時間(10000は10秒表示)10秒表示後にエクセルを閉じる
        System.Threading.Thread.Sleep(10000)

Dim xlFilePath As String = "c:\Test1.xls"   '保存ファイル名
        xlApp.DisplayAlerts = False        '保存時の問合せのダイアログを非表示に設定
     →   xlSheet.SaveAs(xlFilePath)      'ファイルに保存

        xlApp.DisplayAlerts = True      '元に戻す

        '(3)==================  終了処理  =====================  
        MRComObject(xlSheet)            'xlSheet の解放
        MRComObject(xlSheets)           'xlSheets の解放
        xlBook.Close(False)             'xlBook を閉じる
        MRComObject(xlBook)             'xlBook の解放
        MRComObject(xlBooks)            'xlBooks の解放
        xlApp.Quit()                    'Excelを閉じる 
        MRComObject(xlApp)              'xlApp を解放
      
これでエクセルを動かしているんですが、自分で×ボタンで勝手に
終了すると矢印のところで
「追加情報 : HRESULT からの例外です : 0x800401A8。」
というエラーが生じました。
これはどうしてでしょうか?

あと
 System.Threading.Thread.Sleep(10000)
でエクセルを10秒間表示(VBで終了処理を操作)
ですがこれをVB側ではなくてエクセル側で
エクセル終了処理を投げることは
できるのでしょうか?


花ちゃん  2006-06-14 02:06:14  No: 131832

>良 2006/06/09(金) 18:26:10 <220.150.116.9>

>花ちゃんさん>
>すみませんでしたm(__)m今度からは人のソースを使用する場合は
>リンクをはらせていただきます。もっと掲示板の使い方を
>考えていきたいと思います。

つい最近の事だったのでは。


特攻隊長まるるう  2006-06-14 02:11:57  No: 131833

>つい最近の事だったのでは。
違いを説明するにはコピペもある程度必要だとは思いますが、
変更前のコードとの違いも分かりますし、参照元のリンクは
必ず貼りましょう。
http://www.bcap.co.jp/hanafusa/dotnet/Excel01.htm

>エクセルを勝手に終了するとエラーが出てしまうのはどうしてですか?
簡単に言えば。。。終了したからです。

ヘルプにも書いてあることではあるんですが、以下のサイトで
『インスタンス』について学んでください。
[VB.NET]でプログラムするなら、ついでに『オブジェクト指向』
という概念も知っておきましょう。
[クラスモジュール講座]
http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html

プログラムでオブジェクトを操作する場合、インスタンス(実体)を
メモリ上に作成して、それに命令します。

これは、手作業でアプリケーションを実行する場合も同じです。
スタートメニューからプログラムを起動し、画面上の操作で、内部
のプログラムが動き、必要なオブジェクトを作っています。

そして、使われなくなったオブジェクトは破棄され、メモリ上から
居なくなります。
>自分で×ボタンで勝手に終了すると
ユーザの操作によって、内部のプログラムが、使用しなくなった
(終了した)オブジェクトを破棄してしまいます。

破棄されたオブジェクトを操作しようとすればエラーとなります。

どう回避するか?
『WithEvents』をキーワードに調べればエクセル側のイベントを
VB側で捕らえる手段が見つかると思います。
それだけで解決…とまで単純では無いでしょうが、とりあえず。


  2006-06-14 03:31:30  No: 131834

花ちゃんさん>
すみません。どこでエラーが起きたのか詳細を
書こうとしたらソースをコピーしてしまいました。
今度からは参照したところのリンクを貼り付けします。
申し訳ございませんでしたm(__)m

特攻隊長さん>
ご回答ありがとうございます。
確かに前提知識が少ないのでこの操作をする前にもっと
知識をつけたほうがいいですね。特攻隊長さんの
教えてくださったキーワードと参照してくださった
アドレスを見て勉強いたします。本当にありがとうございましたm(__)m


※返信する前に利用規約をご確認ください。




  


  このエントリーをはてなブックマークに追加