none
Visual Basicで数値をエクセルに書き込む方法 RRS feed

  • 質問

  • プログラミング初心者です。

    いくつかのサイトを参考に次のようなプログラムを書いたのですが、
    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

    2012年8月30日 2:26

回答

  • > そのPIAというのは入れた方がよいものなのでしょうか?どこから入手すればよいのでしょうか?

    今入っていない環境なら、入っていなくても出来る方法考えたほうがいいんじゃないかと思います。
    # Office2007ってPIA入らなかったっけ… Personalだとダメなのかな

    で、思い立ってやってみたのですが、もしかして
    「Microsoft Excel 5.0 Object Library」というのを参照していませんか?
    (過去に参照しませんでしたか?)
    こちらが参照されていると、コンパイルはできるけど実行時におっしゃっている場所で同じエラーが起きます。

    • 回答としてマーク firstlilac 2012年9月3日 10:33
    2012年8月31日 1:31

すべての返信

  • > 参照設定はMicrosoft Excel 12.0 Object libraryを追加してやっています。

    参照の追加のところで.NETのところで出てくる「Microsoft.Office.Interop.Excel」が必要じゃないかと思うのですが。
    VS2010 VB.NETでこれを参照したときは投稿されたコードで出来ました。

    • 編集済み mars12 2012年8月30日 3:03 編集
    2012年8月30日 3:03
  • 早速の回答感謝します。私もVB2010を使っています。

    参照の追加のところの.NETを探してみたのですが、Microsoft.Office.Interop.Excelが見当たりません。

    私が追加したMicrosoft Excel 12.0 Object libraryはCOMのタグから参照しました。

    どうすれば.NETのところにMicrosoft.Office.Interop.Excelの選択肢が出てくるのでしょうか?


    2012年8月30日 7:19
  • >参照の追加のところの.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のところで引数渡しています。
    もっともそれならコンパイルエラーになりそうな気もします。

    2012年8月30日 8:23
  • そのPIAというのは入れた方がよいものなのでしょうか?どこから入手すればよいのでしょうか?

    私の環境はVS2010, Office2007です。Win7というのはOSがWindows7ということでしょうか?私はOSはXPです。

    mars12さんのところではCOMのところでやってもうまくいくのですね…どうすればよいのやら…

    教えて下さったサイトを参考に

    Dim misValue As Object = System.Reflection.Missing.Value

    を加え、

    book = app.Workbooks.Add(misValue)

    としてみましたが、これまでと全く同じエラーが表示されます。

    2012年8月30日 9:09
  • > そのPIAというのは入れた方がよいものなのでしょうか?どこから入手すればよいのでしょうか?

    今入っていない環境なら、入っていなくても出来る方法考えたほうがいいんじゃないかと思います。
    # Office2007ってPIA入らなかったっけ… Personalだとダメなのかな

    で、思い立ってやってみたのですが、もしかして
    「Microsoft Excel 5.0 Object Library」というのを参照していませんか?
    (過去に参照しませんでしたか?)
    こちらが参照されていると、コンパイルはできるけど実行時におっしゃっている場所で同じエラーが起きます。

    • 回答としてマーク firstlilac 2012年9月3日 10:33
    2012年8月31日 1:31
  • はい。

    どちらを先に参照したかは記憶が定かではないですが

    「Microsoft Excel 5.0 ?????¬?????」(←私の方ではこうなっています。)と「Microsoft Excel 12.0 Object Library」というものがあって、

    どちらかを先に参照して、うまくいかなかったのでもう一方を参照する、という順序で行い、どちらにしろうまくいきませんでした。

    「Microsoft Excel 5.0 ?????¬?????」を先に参照してしまったためにエラーが起きているということなのでしょうか?

    だとすれば、参照をリセットするにはどうすればよいのでしょうか?

    2012年8月31日 2:09
  • 参照を確認してから、プロジェクトのリビルド(またはクリーン→リビルド)でダメでしょうか。
    2012年8月31日 2:49
  • プロジェクトの中に「リビルド」というものがあるのでしょうか?

    私のVBにはないのですが、クリーン、またはリビルドするためにはどうすればよいのでしょうか?

    初歩的な質問ですみません。

    2012年8月31日 5:04
  • メニューバーの「ビルド」をクリックすると出て来ませんか?
    もしリビルドが出てこないなら、プロジェクトのフォルダのbinフォルダとobjフォルダの中身を
    削除してからビルドすれば同じかと思います。

    2012年8月31日 5:17
  • 遅延バインドCreateObjectじゃなくて、普通にExcel.ApplicationをNewしてあげたらどうなりますか?

    http://msdn.microsoft.com/ja-jp/library/vstudio/ee317478.aspx#Y2000

    2012年8月31日 5:18
  • mars12さん

    メニューバーに「ビルド」というのがないです…

    メニューバーというのは、左から順に「ファイル」「編集」「表示」「プロジェクト」「デバッグ」「データ」「ツール」「ウィンドウ」「ヘルプ」と並んでいるバーのことですよね…?

    2012年8月31日 5:55
  • もしかしてVB.NET2010 Expressでしょうか。
    使ったことないのですが、上級者モードみたいなのにすると出せるようです。
    「VB.NET 2010 express 上級者設定」などでぐぐってみると、それらしい説明されてる
    ブログなんかが見つかります。

    また、先ほど紹介したbinフォルダとobjフォルダの中身を消してからデバッグでも
    もう一回ビルドされると思います。多分それだけで大丈夫な気がしますが。

    2012年8月31日 6:08
  • かるあさん

    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))。

    というエラーになります。

    2012年9月2日 7:53
  • Mars12さん

    しばらくパソコンの前に座れなくて遅くなりましてすみません。

    はい、VB.NET2010 Expressです。

    上級者モードにしてみたところ、ビルドというメニューはありました。

    しかし、「ビルド」の中には「エクセルのビルド」と「エクセルの発行」しかなく、「リビルド」というものはありませんでした。

    「エクセルのビルド」を一回押してみても、「リビルド」は出てきません。

    また、binフォルダとobjフォルダの中身を消してからデバッグしても、同じ場所でエラーが起きます。

    まだ「Microsoft Excel 5.0 ?????¬?????」を参照にしていたのが消えていないのでしょうか?


    2012年9月2日 7:58
  • 全く別の新しいファイルを作成し、最初から参照を設定したところ、うまくいきました!

    なぜ全く新しいファイルを作成すればよいことに気づかなかったのか…

    ともあれ、Mars12さんのおっしゃっていたことが原因だったと分かりました。

    つまり、

    参照の追加のCOMのタグには、「Microsoft Excel 5.0 ?????¬?????」と「Microsoft Excel 12.0 Object Library」というものがあって、前者を参照してしまうとその後全くうまくいかなくなります。

    そして…いったん参照してしまうと、VB.NET2010 Expressだと参照から外すことは無理なのかもしれません…色々やってみましたが結局無理だったので…

    ともあれ、うまくいったので本当にありがとうございました。

    2012年9月3日 9:06