####前提・実現したいこと
開発環境
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)
あなたの回答
tips
プレビュー