今天同事詢問一個錯誤訊息如下,
Excel.WorkbookClass.SaveAs <System.Runtime.InteropServices.COMException> 發生例外狀況於 HRESULT: 0x800A03EC [ COMException.ErrorCode : -2146827284 ]
於 Excel.WorkbookClass.SaveAs(Object Filename, Object FileFormat, Object Password, Object WriteResPassword, Object ReadOnlyRecommended, Object CreateBackup, XlSaveAsAccessMode AccessMode, Object ConflictResolution, Object AddToMru, Object TextCodepage, Object TextVisualLayout)
程式中的寫法類似如下,
1 | dim xlsApp As New Excel.Application |
程式是掛在 wb.SaveAs 那行,而且客戶端是裝 Excel 2016 才噴錯,同事是 Excel 2010 則沒問題。
程式中,有加入 interop.excel.dll 參考,使用 earlay binding 的方式,所以似乎是因為版本不同,SaveAs Method 的參數不同所造成的錯誤。
所以開啟 Excel 2016 ,按下 Alt + F11 後,再按下 F2 瀏覽物件,查看 Workbook 的 SaveAs Method 如下,
1 | Sub SaveAs([Filename], [FileFormat], [Password], [WriteResPassword], [ReadOnlyRecommended], [CreateBackup], [AccessMode As XlSaveAsAccessMode = xlNoChange] |
跟錯誤訊息比較一下,可以發現 Excel 2016 從參數 TextVisualLayout 後面,又多了 2 個參考 (Local 及 WorkIdentity)。所以程式自然就 GG 了。
那怎麼辦呢? 改用 Later Binding 的方式,將 interOP.Excel 移除參考,並將原本 Excel.Application 、Excel.Workbook 改成 Object ,重新建置專案,就可以了哦!