none
エクセル2007 では問題無く エクセル2003 ではエラーとなってしまいます RRS feed

  • 質問

  • Visual Basic 2008 で開発しています。
    開発環境PCには エクセル2007が導入されています。

    参照の追加で Microsoft Excel 12.0 Object Library を追加し、
    ソース内で Imports Microsoft.Office.Interop を記載し
    そのソースは問題なくビルドでき、2007のエクセルが導入されているPCでは問題なく、
    エクセル起動し、データもエクセルに書かれます。
    但し、そのビルドしたexeを2003のエクセルが導入されているPCで起動すると、
    エラーが来ます。
    エクセルのバージョン違いが原因とは思いますが、どの様な対応方法をすればよいか分からず、
    ご伝授願いたく宜しくお願い致します。
    エラー内容は下記の通りです。

    System.IO.FileNotFoundException: ファイルまたはアセンブリ 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。
    ファイル名 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' です。
       場所 WindowsApplication1.Form3.cmdList_Click(Object sender, EventArgs e)
       場所 System.Windows.Forms.Control.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnClick(EventArgs e)
       場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       場所 System.Windows.Forms.Control.WndProc(Message& m)
       場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
       場所 System.Windows.Forms.Button.WndProc(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    警告: アセンブリ バインドのログ記録がオフにされています。
    アセンブリ バインドのエラー ログを有効にするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) を 1 に設定してください。
    注意: アセンブリ バインドのエラー ログに関連するパフォーマンス ペナルティがあります。
    この機能をオフにするには、レジストリ値 [HKLM\Software\Microsoft\Fusion!EnableLog] を削除します。

     

    2009年7月31日 8:37

回答

  • 'Office' は 'Microsoft' のメンバではありません。 とソースエラーとなってしまいます。
    私なりに、色々試しましたが、どうすれば中央揃えになるのか 解らず、
    ご伝授願いたく宜しくお願い致します。
    xlCenter に対応する数値に置き換えてあげることになります。
    MSDN によると、xlCenter は -4108 だそうです。

    http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.constants(office.11).aspx

    動作までは確認していません。


    あと、気になる点として、Object 型で取得したインスタンスについて、ReleaseComObject をしてあげる必要がある点でしょうか。
    一度、調べてみて下さい。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク fuji-tochigi 2009年8月7日 8:57
    2009年8月3日 14:40
    モデレータ
  • Office 2007 の PIA に依存したアプリケーションになっていますね。
    (ファイルまたはアセンブリ 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。)

    Office 2003 の PIA はバージョンが異なるので、アプリケーションが求めている 12.0.0.0 がないということで例外が発生します。
    PIA はバージョン依存があるため、今のやり方では、Office 2007 専用になるかと思います。


    特定のバージョンの PIA に依存しないように作るか、レイトバインディングを使うかしないと Office の複数バージョンのサポートはできないかと思っています。


    試しに開発環境のPCにエクセル2003を導入して(エクセル2007と共存)
    参照の追加で Microsoft Excel 11.0 Object Library を追加してみましたが、結果はエラーとなり同じでした。
    恐らくですが、「追加」なので、Office 2003 と Office 2007 の両方が必要になってしまったのでは?
    このため、Office 2003 しか入っていない PC では当初とエラーが変わらないのではないかと。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク fuji-tochigi 2009年8月3日 9:46
    2009年8月1日 13:15
    モデレータ

すべての返信

  • 次の URL の記事が参考になると思います。

     Visual Basic を使用して Microsoft Excel を自動化する方法
     http://support.microsoft.com/default.aspx/kb/219151/ja

     Excelファイルにアクセスするには?[C#、VB] - @IT
     http://www.atmarkit.co.jp/fdotnet/dotnettips/717excelfile/excelfile.html
    2009年8月1日 4:04
  • totojo様
    返信有難う御座いました。
    参考のURLはエクセルに書き出す方法だと思いますが、エクセル2007のPCだと問題無くデータを書き出せます。
    同じexeをエクセル2003のPCで処理するとエラーになってしまいます。

    試しに開発環境のPCにエクセル2003を導入して(エクセル2007と共存)
    参照の追加で Microsoft Excel 11.0 Object Library を追加してみましたが、結果はエラーとなり同じでした。

    2009年8月1日 7:58
  • 参照先の内容は、Excel をオートメーションで利用する方法だと思うのですけれども。
    Office 2003 のインストールで PIA をインストールしていないのでしょうか?

    次の URL のスレッドは参考になりますか?

     アセンブリファイル(Microsoft.Office.Interop.Excel)の読み込みについて
     http://social.msdn.microsoft.com/forums/ja-JP/aspnetja/thread/4985698e-a50d-4ebf-9001-42a0e675b55e/
    2009年8月1日 8:09
  • Office 2007 の PIA に依存したアプリケーションになっていますね。
    (ファイルまたはアセンブリ 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。)

    Office 2003 の PIA はバージョンが異なるので、アプリケーションが求めている 12.0.0.0 がないということで例外が発生します。
    PIA はバージョン依存があるため、今のやり方では、Office 2007 専用になるかと思います。


    特定のバージョンの PIA に依存しないように作るか、レイトバインディングを使うかしないと Office の複数バージョンのサポートはできないかと思っています。


    試しに開発環境のPCにエクセル2003を導入して(エクセル2007と共存)
    参照の追加で Microsoft Excel 11.0 Object Library を追加してみましたが、結果はエラーとなり同じでした。
    恐らくですが、「追加」なので、Office 2003 と Office 2007 の両方が必要になってしまったのでは?
    このため、Office 2003 しか入っていない PC では当初とエラーが変わらないのではないかと。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク fuji-tochigi 2009年8月3日 9:46
    2009年8月1日 13:15
    モデレータ
  • Azulean様
    返答有難う御座いました。
    ご指摘を受け
    Dim objApp As Object
    Dim objBook As Object
    Dim objBooks As Object
    Dim objSheets As Object
    Dim objSheet As Object 
    objApp = CreateObject("Excel.Application")
    objBooks = objApp.Workbooks
    objBook = objBooks.Add
    objSheets = objBook.Worksheets
    objSheet = objSheets.Item(1)
    objApp.Visible = True
    にてObject型?で作成し直した所、同じEXEでエクセル2003のPCでもエクセルが開きセルにデータを書き込む事が可能となりました。

    但し、1つ解決しない所があります。
    PIAに依存した時の場合、エクセルのセル制御で中央揃えの場合、
    objsheet.Range("C").HorizontalAlignment = Microsoft.Office.Interop.Excel.Constants.xlCenter
    によりC列は中央揃えになりましたが、
    変更した所、そのままだと
    'Office' は 'Microsoft' のメンバではありません。 とソースエラーとなってしまいます。
    私なりに、色々試しましたが、どうすれば中央揃えになるのか 解らず、
    ご伝授願いたく宜しくお願い致します。

    2009年8月3日 2:21
  • 'Office' は 'Microsoft' のメンバではありません。 とソースエラーとなってしまいます。
    私なりに、色々試しましたが、どうすれば中央揃えになるのか 解らず、
    ご伝授願いたく宜しくお願い致します。
    xlCenter に対応する数値に置き換えてあげることになります。
    MSDN によると、xlCenter は -4108 だそうです。

    http://msdn.microsoft.com/ja-jp/library/microsoft.office.interop.excel.constants(office.11).aspx

    動作までは確認していません。


    あと、気になる点として、Object 型で取得したインスタンスについて、ReleaseComObject をしてあげる必要がある点でしょうか。
    一度、調べてみて下さい。


    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    • 回答としてマーク fuji-tochigi 2009年8月7日 8:57
    2009年8月3日 14:40
    モデレータ
  • 返答が遅くなりまして申し訳ありません。
    ご指示の通り行った結果問題なく処理できました。
    有難う御座いました
    2009年8月7日 8:57