トップ回答者
Visual Basicで数値をエクセルに書き込む方法

質問
-
プログラミング初心者です。
いくつかのサイトを参考に次のようなプログラムを書いたのですが、
book = app.Workbooks.Add の部分で、
「COMExceptionはハンドルされませんでした。メンバが見つかりません。 (HRESULT からの例外: 0x80020003 (DISP_E_MEMBERNOTFOUND))」
というエラーが出てしまいます。参照設定はMicrosoft Excel 12.0 Object libraryを追加してやっています。
どうすればよいのか教えていただけると嬉しいです。
Imports System.Net
Imports Microsoft.Office.Interop
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim app As Excel.Application
Dim book As Excel.Workbook
Dim sheet As Excel.Worksheet
app = CreateObject("Excel.Application")
app.Visible = False 'アプリケーションの非表示
book = app.Workbooks.Add '新規作成
sheet = book.Worksheets(1) 'シート1を選択
Debug.WriteLine(sheet.Cells(1, 1).Value) '値を読み出す
sheet.Cells(1, 1).Formula = "1"
book.SaveAs("C:\Documents and Settings\Administrator\My Documents\VB\Exe.xlsx") '名前をつけて保存
app.Quit() '終了
' オブジェクトを解放します。
sheet = Nothing
book = Nothing
app = Nothing
End Sub
End Class
回答
-
> そのPIAというのは入れた方がよいものなのでしょうか?どこから入手すればよいのでしょうか?
今入っていない環境なら、入っていなくても出来る方法考えたほうがいいんじゃないかと思います。
# Office2007ってPIA入らなかったっけ… Personalだとダメなのかな
で、思い立ってやってみたのですが、もしかして
「Microsoft Excel 5.0 Object Library」というのを参照していませんか?
(過去に参照しませんでしたか?)
こちらが参照されていると、コンパイルはできるけど実行時におっしゃっている場所で同じエラーが起きます。- 回答としてマーク firstlilac 2012年9月3日 10:33
すべての返信
-
早速の回答感謝します。私もVB2010を使っています。
参照の追加のところの.NETを探してみたのですが、Microsoft.Office.Interop.Excelが見当たりません。
私が追加したMicrosoft Excel 12.0 Object libraryはCOMのタグから参照しました。
どうすれば.NETのところにMicrosoft.Office.Interop.Excelの選択肢が出てくるのでしょうか?
- 編集済み firstlilac 2012年8月30日 7:21
-
>参照の追加のところの.NETを探してみたのですが、Microsoft.Office.Interop.Excelが見当たりません。
PIAが入っていないんですかね。
私の環境ではVS2010, Win7, Office XPなので、
さっきとは変えてCOMのところで「Microsoft Excel 10.0 Object Libraly」を
参照してやってみましたが、それでも動いています。
Office2007で何か変わったんでしょうか。
http://vb.net-informations.com/excel-2007/vb.net_excel_2007_create_file.htm
を見ると、book = app.Workbooks.Addのところで引数渡しています。
もっともそれならコンパイルエラーになりそうな気もします。
-
そのPIAというのは入れた方がよいものなのでしょうか?どこから入手すればよいのでしょうか?
私の環境はVS2010, Office2007です。Win7というのはOSがWindows7ということでしょうか?私はOSはXPです。
mars12さんのところではCOMのところでやってもうまくいくのですね…どうすればよいのやら…
教えて下さったサイトを参考に
Dim misValue As Object = System.Reflection.Missing.Value
を加え、
book = app.Workbooks.Add(misValue)
としてみましたが、これまでと全く同じエラーが表示されます。
- 編集済み firstlilac 2012年8月30日 12:33
-
> そのPIAというのは入れた方がよいものなのでしょうか?どこから入手すればよいのでしょうか?
今入っていない環境なら、入っていなくても出来る方法考えたほうがいいんじゃないかと思います。
# Office2007ってPIA入らなかったっけ… Personalだとダメなのかな
で、思い立ってやってみたのですが、もしかして
「Microsoft Excel 5.0 Object Library」というのを参照していませんか?
(過去に参照しませんでしたか?)
こちらが参照されていると、コンパイルはできるけど実行時におっしゃっている場所で同じエラーが起きます。- 回答としてマーク firstlilac 2012年9月3日 10:33
-
はい。
どちらを先に参照したかは記憶が定かではないですが
「Microsoft Excel 5.0 ?????¬?????」(←私の方ではこうなっています。)と「Microsoft Excel 12.0 Object Library」というものがあって、
どちらかを先に参照して、うまくいかなかったのでもう一方を参照する、という順序で行い、どちらにしろうまくいきませんでした。
「Microsoft Excel 5.0 ?????¬?????」を先に参照してしまったためにエラーが起きているということなのでしょうか?
だとすれば、参照をリセットするにはどうすればよいのでしょうか?
-
遅延バインドCreateObjectじゃなくて、普通にExcel.ApplicationをNewしてあげたらどうなりますか?
http://msdn.microsoft.com/ja-jp/library/vstudio/ee317478.aspx#Y2000
-
かるあさん
app = CreateObject("Excel.Application")
の代わりに
app = New Excel.Application
を書いてみたところ、この部分で「Newをインターフェースで使用することはできません」という波線が出ます。
また、
app = New Excel._ExcelApplication
としたところ、波線は消えますが実行してもこの部分で
型 'Microsoft.Office.Interop.Excel.GlobalClass' の COM オブジェクトをインターフェイス型 'Excel.Application' にキャストできません。IID '{00020841-0000-0000-C000-000000000046}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。
というエラーになります。
-
Mars12さん
しばらくパソコンの前に座れなくて遅くなりましてすみません。
はい、VB.NET2010 Expressです。
上級者モードにしてみたところ、ビルドというメニューはありました。
しかし、「ビルド」の中には「エクセルのビルド」と「エクセルの発行」しかなく、「リビルド」というものはありませんでした。
「エクセルのビルド」を一回押してみても、「リビルド」は出てきません。
また、binフォルダとobjフォルダの中身を消してからデバッグしても、同じ場所でエラーが起きます。
まだ「Microsoft Excel 5.0 ?????¬?????」を参照にしていたのが消えていないのでしょうか?
- 編集済み firstlilac 2012年9月2日 8:19
-
全く別の新しいファイルを作成し、最初から参照を設定したところ、うまくいきました!
なぜ全く新しいファイルを作成すればよいことに気づかなかったのか…
ともあれ、Mars12さんのおっしゃっていたことが原因だったと分かりました。
つまり、
参照の追加のCOMのタグには、「Microsoft Excel 5.0 ?????¬?????」と「Microsoft Excel 12.0 Object Library」というものがあって、前者を参照してしまうとその後全くうまくいかなくなります。
そして…いったん参照してしまうと、VB.NET2010 Expressだと参照から外すことは無理なのかもしれません…色々やってみましたが結局無理だったので…
ともあれ、うまくいったので本当にありがとうございました。
- 編集済み firstlilac 2012年9月3日 10:33