vbからexcelを操作について
投稿者 るしぇ  (社会人)
投稿日時
2008/10/22 01:17:10
参照設定してないからでは?
VBからExcelを扱うサイトでは、必ずといっていいほど解説されているはずですが?
http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm
>''プロジェクト→参照の追加→COM→Microsoft Excel *.* ObjectLibrary を参照して下さい
また、VB.NET では COM の解放処理を行わないと、プロセスが残ります。
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
Excel の場合、プロセスのサイズも大きいですし、既存のプロセスが存在すると
それを利用しようとするため、目に見える不具合がすぐに起こります。
> Book = ExcelApp.WorkBooks.Add '新しいワークブックを追加
> Book.Worksheets(1).Range("A1") = "こんにちは!" 'セルA1に「こんにちは!」を入力
この2行はプロセスが残るコードになります。
(1つのオブジェクトを指定するのにピリオドが2つ現れた時点で
アウトと思ってください)
VBからExcelを扱うサイトでは、必ずといっていいほど解説されているはずですが?
http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm
>''プロジェクト→参照の追加→COM→Microsoft Excel *.* ObjectLibrary を参照して下さい
また、VB.NET では COM の解放処理を行わないと、プロセスが残ります。
http://hanatyan.sakura.ne.jp/dotnet/Excel08.htm
Excel の場合、プロセスのサイズも大きいですし、既存のプロセスが存在すると
それを利用しようとするため、目に見える不具合がすぐに起こります。
> Book = ExcelApp.WorkBooks.Add '新しいワークブックを追加
> Book.Worksheets(1).Range("A1") = "こんにちは!" 'セルA1に「こんにちは!」を入力
この2行はプロセスが残るコードになります。
(1つのオブジェクトを指定するのにピリオドが2つ現れた時点で
アウトと思ってください)
投稿者 up  (社会人)
投稿日時
2008/10/22 02:10:28
参照設定はしているのですが、やはりエラーが出てしまいます。
投稿者 るしぇ  (社会人)
投稿日時
2008/10/22 02:30:44
じゃあ、名前空間の問題でしょう。
Office 2003 PIA の場合なら
http://www.microsoft.com/japan/msdn/office/office2003/OfficePrimaryInteropAssembliesFAQ.aspx
Microsoft.Office.Interop.Excel.Application
という指定になります。オブジェクトブラウザで『Excel』を検索して、
名前空間を省略せずに指定してみてください。
Office 2003 PIA の場合なら
http://www.microsoft.com/japan/msdn/office/office2003/OfficePrimaryInteropAssembliesFAQ.aspx
Microsoft.Office.Interop.Excel.Application
という指定になります。オブジェクトブラウザで『Excel』を検索して、
名前空間を省略せずに指定してみてください。
投稿者 n  (社会人)
投稿日時
2008/10/22 02:34:12
Dim ExcelApp As Excel.Application
Dim Book As Excel.WorkBook
ExcelApp = New Excel.Application()
Book = ExcelApp.WorkBooks.Add()
こうじゃない?
それと、ここも参考にしておいた方がいい。
http://jeanne.wankuma.com/tips/vb.net/programming/releasecom.html
投稿者 るしぇ  (社会人)
投稿日時
2008/10/22 02:41:59
>こうじゃない?
うん。だから COM の解放の観点では
> Book = ExcelApp.WorkBooks.Add()
はマズイよね。WorkBooks オブジェクトが呼び出されているのに解放する
手段が無いから。
じゃんぬさんのサイトのコードで言えば、
> Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
> Dim xlBook As Excel.Workbook = xlBooks.Add()
この2行に分解してやらないといけません。
結果、左辺にも右辺にもピリオドは1個になります。
うん。だから COM の解放の観点では
> Book = ExcelApp.WorkBooks.Add()
はマズイよね。WorkBooks オブジェクトが呼び出されているのに解放する
手段が無いから。
じゃんぬさんのサイトのコードで言えば、
> Dim xlBooks As Excel.Workbooks = xlApplication.Workbooks
> Dim xlBook As Excel.Workbook = xlBooks.Add()
この2行に分解してやらないといけません。
結果、左辺にも右辺にもピリオドは1個になります。
投稿者 n  (社会人)
投稿日時
2008/10/22 03:18:00
>るしぇさん
> COM の解放の観点では
これは分かってたんだけどね。
今回の質問の内容とは別々で説明した方がいいかなと思ったんだけど、
結局同じことだからちゃんと書いた方がよかったね
orz
> COM の解放の観点では
これは分かってたんだけどね。
今回の質問の内容とは別々で説明した方がいいかなと思ったんだけど、
結局同じことだからちゃんと書いた方がよかったね
orz
投稿者 るしぇ  (社会人)
投稿日時
2008/10/22 03:45:52
あ、そうそう。
> Dim ExcelApp As New Excel.Application 'エクセルを宣言する
この書き方、嫌いなんですが、ありはありですよね?
http://www.microsoft.com/japan/msdn/net/vbtransitionguide/chapter4/chapter4_9.aspx
なんか初心者の理解を妨げる、不必要な構文の気がします。。。orz
> Dim Book As WorkBook 'ワークブックの宣言
こっちは確かに最初から足りないけどね。
>型excel.applicationが定義させていません。
このエラーメッセージだと、Excel から見つかっていません。
だから Excel がどこにあるか?から指定してやらないと解決しないはず。。。
> Dim ExcelApp As New Excel.Application 'エクセルを宣言する
この書き方、嫌いなんですが、ありはありですよね?
http://www.microsoft.com/japan/msdn/net/vbtransitionguide/chapter4/chapter4_9.aspx
なんか初心者の理解を妨げる、不必要な構文の気がします。。。orz
> Dim Book As WorkBook 'ワークブックの宣言
こっちは確かに最初から足りないけどね。
>型excel.applicationが定義させていません。
このエラーメッセージだと、Excel から見つかっていません。
だから Excel がどこにあるか?から指定してやらないと解決しないはず。。。
投稿者 up  (社会人)
投稿日時
2008/10/22 03:50:51
初心者で申し訳ないです。
エクセルの場所をしていするにはどうすれば良いでしょうか?
エクセルの場所をしていするにはどうすれば良いでしょうか?
投稿者 るしぇ  (社会人)
投稿日時
2008/10/22 04:12:33
オブジェクトブラウザで『Excel』を検索して、
名前空間を省略せずに指定してみてください。
名前空間を省略せずに指定してみてください。
型excel.applicationが定義させていません。
型work bookが定義させていません。
のエラーがでます。どうすれば実行できるでしょうか?
コードは以下です。
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ExcelApp As New Excel.Application 'エクセルを宣言する
Dim Book As WorkBook 'ワークブックの宣言
Book = ExcelApp.WorkBooks.Add '新しいワークブックを追加
Book.Worksheets(1).Range("A1") = "こんにちは!" 'セルA1に「こんにちは!」を入力
ExcelApp.Visible = True 'エクセルの表示
End Sub
End Class