トップ回答者
Excelがうまく起動できない

質問
-
いつもお世話になっております。
2台のPCで、違う結果が出て困っています。
以下のプログラムで、
PC1ではエクセルファイル開く→セル内容変更→終了の全てが成功し、
PC2では「xlBooks = xlApp.Workbooks」の所でエラーが出ます。
*******************************************************************
Imports Microsoft.Office.Interop
Sub エクセル処理()
'================== 起動時の処理 ===================
Dim xlApp As New Excel.Application
Dim xlBooks As Excel.Workbooks
xlBooks = xlApp.Workbooks
Dim xlFilePath As String = "C:\FAX送信用紙.xls" '既存のファイルを開く
Dim xlBook As Excel.Workbook = xlBooks.Open(xlFilePath)
Dim xlSheets As Excel.Sheets = xlBook.Worksheets
Dim xlSheet As Excel.Worksheet = CType(xlSheets.Item(1), Excel.Worksheet)
xlApp.Visible = True'Excelを表示(必ずしも表示しなくてもよい)
'====================== 起動処理ここまで ===============
'================== データの入力処理 ==================
xlBook.Worksheets("Sheet1").Activate()
xlBook.Worksheets("Sheet1").Range("A1").Value = "123456"
'================== データの入力処理ここまで ==================
以下、終了処理等
End Sub
*******************************************************************
エラー内容は、
型 'System.InvalidCastException' のハンドルされていない例外が
TCI電話帳.exe で発生しました
追加情報:型 'Microsoft.Office.Interop.Excel.ApplicationClass' の
COM オブジェクトをインターフェイス型
'Microsoft.Office.Interop.Excel._Application' にキャストできません。
IID{000208D5-0000-0000-C000-000000000046}' が指定されたインターフェイスの
COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生
したため、この操作に失敗しました: ライブラリは登録されていません。
(HRESULT からの例外:0x8002801D(TYPE_E_LIBNOTREGISTERED))
*******************************************************************
環境は、
PC1→富士通 FMVD04001
Windows7 Professional SP1 32bit、
Office2013 - Excel2013 32bit
Visual Studio Express 2013
VS2013の参照設定:Interop.Microsoft.Office.Interop.Excel バージョン 1.7.0.0
対象のエクセルファイル「FAX送信用紙.xls」は、このPCで生成したものです。
PC2→Surface Pro 3
Windows8.1 Pro 64bit、
Office2013 - Excel2013 32bit
Visual Studio Express 2013
VS2013の参照設定:(一覧に無かったのでPC1から
「Interop.Microsoft.Office.Interop.Excel.dll(1.7.0.0)」を
コピーして追加で参照設定済み)
*******************************************************************
regedit.exeを起動して検索しても、両方のPCで
000208D5-0000-0000-C000-000000000046配下TypeLibのVersion1.8となっている
ものしか存在していません。
どちらもPCも、Office2013が初めから組み込まれた状態で購入し、
次にMicrosoft Access 2000をインストールしています。
PC1では更にMicrosoft Visio2003をインストールしています。
TCI電話帳.exeが32bitと64bitモード、
どちらで動作しているかについてですが、
TextBox1.Text = Environment.Is64BitProcess
で調べるとFalseと出たので32bitで動作していると思います。
参照設定にMSO.DLLを指定して
「Microsoft Office 15.0 Object Library」を追加して
実行してみましたが、同じアラームがでました。
なぜ、PC2だけエラーが出るのでしょうか。
どうか、よろしくお願いいたします。
回答
-
細かい内容まで見てませんが・・・。
エラー内容からして COM オブジェクトのインターフェース取得不良ですから、Office バージョンの不一致が疑わしいです。
後で Access 2000 を入れているらしいので、セットアップによる COM 登録不良も要因として考えられますね。
コード不良も無くはないかもですが、環境不良の線が強いので解決は難しいでしょうね。
環境不良なら Office 2013 の再セットアップで治る可能性がわずかにありますが・・・。
すべての返信
-
こんにちは。
私はPowerShellはあまり触ったことないですが、
カテゴリの「PowerShell」は正しいですか?一見するとTCI電話帳.exe というVB.NETアプリケーションのように見えますが、
PowerShellなのかな…それぞれのPCのOfficeが32bitなのか64bitなのか
OSが32bitであればWindows8.1Proでも正常終了するのか
OSが64bitであればWindows7でも異常終了するのか切り分けできますか?
あと、以下はVB.NETだという仮定で質問しますが、PC2上でTCI電話帳.exeが32bit、64bitモードどちらで動作していますか?
VisualStudio2013(.NET4.5)以上の場合であればデフォルトは32bit優先になりますね。それに対してOfficeが64bitだと悪さをする、とかないでしょうか?
それが原因かどうかまでは、私の知識では断言できないのですが、情報の整理ということも兼ねて確認してみてください。
最後に。そもそも、PowerShellなので私が言っていることは検討違いだとしたら申し訳ないです。- 編集済み Tak1waMVP, Moderator 2015年5月30日 7:04
-
Mah-kun さま よろしく。
コードの記述が VB 系になっている点と、エラーに .exe とある事から、VB 系として以下を書きます。
Tak1wa さまもお書きになっていますが、ターゲットが AnyCPU か x86 かによって異なりますね。
dll を単純にコピーされた様に読み取れますし、そもそも、レジストリに登録が必要みたいですね。
x86 の dll を単純に x64 上にコピーすればいいと言うものではありませんね。
システムに応じた dll を組み込み、環境を整える上では、 インストールプログラムを作って、
インストローラーに登録を任せる手もありますね。
尚、手動で、修復を行う場合は以下(エラーの修復方法 の章)が参考になるかも知れません。但し、これは、適合する dll が選ばれている場合ですね。
-
揚げ足取りになるようで申し訳ないですが、Microsoft.Office.Interop.Excel.dll は regsvr32 が使える DLL ではありません。
(たぶん、そのページは適当に自動生成されているとか、使い回されているとか、信頼の置けないコンテンツだと思います)
- 編集済み AzuleanMVP, Moderator 2015年5月30日 23:03
-
参照設定から、PC1から移植した
Interop.Microsoft.Office.Interop.Excel.dll(1.7.0.0)を削除して、
Microsoft Office 15.0 Object Library
(C:\WINDOWS\assembly\GAC_MSIL\Office\15.0.0.0__71e9bce111e9429c\Office.dll)
だけにしたらImports Microsoft.Office.Interopや
Dim xlApp As New Excel.Applicationに波線がついて
ビルドエラーで起動すらしませんでした。
Microsoft Office 15.0 Object Library
(C:\WINDOWS\assembly\GAC_MSIL\Office\15.0.0.0__71e9bce111e9429c\Office.dll)
を削除して、Interop.Microsoft.Office.Interop.Excel.dll(1.7.0.0)
だけに戻しましたが、当然、元のエラーで止まります。
今度は参照設定から、
Interop.Microsoft.Office.Interop.Excel.dll(1.7.0.0)を削除して、
Microsoft.Office.Interop.Excel(15.0.0.0)(C:\Windows\assembly\GAC_MSIL\Microsoft.Office.
Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll)
だけにしたら元のまったく同じエラーで止まります。
いずれも同じく「xlBooks = xlApp.Workbooks」の所でエラーが出ます。 -
細かい内容まで見てませんが・・・。
エラー内容からして COM オブジェクトのインターフェース取得不良ですから、Office バージョンの不一致が疑わしいです。
後で Access 2000 を入れているらしいので、セットアップによる COM 登録不良も要因として考えられますね。
コード不良も無くはないかもですが、環境不良の線が強いので解決は難しいでしょうね。
環境不良なら Office 2013 の再セットアップで治る可能性がわずかにありますが・・・。