質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

0回答

10529閲覧

VB.Net2015 32bitアプリから Excel2016 32bitを使用するとHRESULT からの例外:0x800A03EC」がでます。

kymao

総合スコア7

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/12/21 07:32

####前提・実現したいこと
開発環境

OS:windows10(64bit)
言語:VisualStudio2015 vb.net(.Net Framework 4.6)
DB:OfficePro2016(32bit: ClickToRun) のExcel

前に作成したしたものを上記の環境に変更しています。
元の環境
OS:windows10(32bit)
言語:VisualStudio2010 vb.net(.Net Framework 2.0)
DB:Office2007(32bit) のExcel

32bitアプリから、excel2016(32bit)を使用したときにエラーをなくしたい。

####発生している問題・エラーメッセージ
開発したソリューションをVisualStudio2015に読み込ませて、プロジェクトのコンパイル[プラットフォーム]x64、対象のCPUを「x86」にしてリビルドしました。

警告「C:\Program Files (x86)\MSBuild\14.0\bin\Microsoft.Common.CurrentVersion.targets(2399,5): warning MSB3304: COM 参照 "Microsoft.Office.Interop.Excel" の依存関係を決定できませんでした。要素が見つかりません。 (HRESULT からの例外:0x8002802B (TYPE_E_ELEMENTNOTFOUND))」がでましたが、正常終了しました。

実行すると、「HRESULT からの例外:0x800A03EC」がでます。
エラーが出たり、出なかったりします。
環境を同じにしたPC上でEXEを実行した場合は、エクセルが「修復しています」になる場合があります。
また、「HRESULT からの例外:0x80028018 (TYPE_E_INVDATAREAD)」がでたこともありました。

####該当のソースコード
Private Sub UseExcel(ByVal p_xlsMotoSheet As Excel.Worksheet)
’変数宣言省略
g_xlsAtcApp = CType(CreateObject("Excel.Application"), Excel.Application)

Try l_xlsBookWrite = CType(g_xlsAtcApp.Workbooks.Open("D:\temp\dummy.xlsm", Excel.Workbook) l_xlsSheetWrite = CType(l_xlsBookWrite.Worksheets(1), Excel.Worksheet) l_xlsSheetIniWrite = CType(l_xlsBookWrite.Worksheets(3), Excel.Worksheet) l_xlsRangeRead = CType(l_xlsSheetIniWrite.Range("J10"), Excel.Range) l_xlsRangeRead.Value = "123" l_xlsRangeRead = CType(p_xlsMotoSheet.Range("A1:P1"), Excel.Range) l_xlsRangeRead.Copy() l_xlsRangeWrite = CType(l_xlsSheetWrite.Range("A2"), Excel.Range) l_xlsSheetWrite.Paste(l_xlsRangeWrite)    g_xlsAtcApp.DisplayAlerts = False g_xlsAtcApp.Run("dummy.xlsm" & "!Macro1") l_xlsSheetWrite.SaveAs(l_strFileName) g_xlsAtcApp.DisplayAlerts = True Catch oExcept As Exception MessageBox.Show(oExcept.Message, "エラー4") Finally l_xlsBookWrite.Close(False) l_xlsBookWrite.Close(False) If l_xlsRangeRead IsNot Nothing Then Marshal.ReleaseComObject(l_xlsRangeRead) End If If l_xlsRangeWrite IsNot Nothing Then Marshal.ReleaseComObject(l_xlsRangeWrite) End If If l_xlsSheetWrite IsNot Nothing Then Marshal.ReleaseComObject(l_xlsSheetWrite) End If If l_xlsBookWrite IsNot Nothing Then Marshal.ReleaseComObject(l_xlsBookWrite) End If If Not IsNothing(g_xlsAtcApp) Then g_xlsAtcApp.Quit() Marshal.ReleaseComObject(g_xlsAtcApp) End If Clipboard.SetDataObject(New Object) If Not IsNothing(g_xlsAtcApp) Then g_xlsAtcApp.Quit() System.Runtime.InteropServices.Marshal.ReleaseComObject(g_xlsAtcApp) End If Clipboard.SetDataObject(New Object) End Try

####試したこと
(1)
ExcelのCOM参照が、VS2010のままで変更していませんでした。
◆VS2010の時の設定
参照名[Microsoft Excel 16.0 Object Library] 種類[COM] バージョン[1.6.0.0] ローカルにコピー[False]
パス[C:\WINDOWS\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll]

[Microsoft Excel 16.0 Object Library]を削除。
「追加」ボタンー>「COM:タイプライブラリ」から[Microsoft Excel 16.0 Object Library]を選択。

◆新しい参照設定
参照名[Microsoft Excel 16.0 Object Library] 種類[COM] バージョン[1.6.0.0] ローカルにコピー[False]
パス[C:\WINDOWS\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll]
再設定してもパスは同じです。

■リビルドしても、警告も同じです。実行しても同じ現象がでます。
(2)
エクセルのCOMを解放するコードがはいっていなかったので、System.Runtime.InteropServices.Marshal.ReleaseComObject で解放するコードを追加しました。

(3)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問