こんにちは。良です。たびたび質問すみません。
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/09(金) 18:26:10 <220.150.116.9>
>花ちゃんさん>
>すみませんでしたm(__)m今度からは人のソースを使用する場合は
>リンクをはらせていただきます。もっと掲示板の使い方を
>考えていきたいと思います。
つい最近の事だったのでは。
>つい最近の事だったのでは。
違いを説明するにはコピペもある程度必要だとは思いますが、
変更前のコードとの違いも分かりますし、参照元のリンクは
必ず貼りましょう。
http://www.bcap.co.jp/hanafusa/dotnet/Excel01.htm
>エクセルを勝手に終了するとエラーが出てしまうのはどうしてですか?
簡単に言えば。。。終了したからです。
ヘルプにも書いてあることではあるんですが、以下のサイトで
『インスタンス』について学んでください。
[VB.NET]でプログラムするなら、ついでに『オブジェクト指向』
という概念も知っておきましょう。
[クラスモジュール講座]
http://homepage1.nifty.com/CavalierLab/lab/vb/clsmdl/index.html
プログラムでオブジェクトを操作する場合、インスタンス(実体)を
メモリ上に作成して、それに命令します。
これは、手作業でアプリケーションを実行する場合も同じです。
スタートメニューからプログラムを起動し、画面上の操作で、内部
のプログラムが動き、必要なオブジェクトを作っています。
そして、使われなくなったオブジェクトは破棄され、メモリ上から
居なくなります。
>自分で×ボタンで勝手に終了すると
ユーザの操作によって、内部のプログラムが、使用しなくなった
(終了した)オブジェクトを破棄してしまいます。
破棄されたオブジェクトを操作しようとすればエラーとなります。
どう回避するか?
『WithEvents』をキーワードに調べればエクセル側のイベントを
VB側で捕らえる手段が見つかると思います。
それだけで解決…とまで単純では無いでしょうが、とりあえず。
花ちゃんさん>
すみません。どこでエラーが起きたのか詳細を
書こうとしたらソースをコピーしてしまいました。
今度からは参照したところのリンクを貼り付けします。
申し訳ございませんでしたm(__)m
特攻隊長さん>
ご回答ありがとうございます。
確かに前提知識が少ないのでこの操作をする前にもっと
知識をつけたほうがいいですね。特攻隊長さんの
教えてくださったキーワードと参照してくださった
アドレスを見て勉強いたします。本当にありがとうございましたm(__)m
ツイート | ![]() |