2017年11月22日 星期三

程式產生Excel時可能發生的錯誤訊息

今天要談的是程式產生Excel檔時可能發生的錯誤訊息。

先把所有可能出現的問題及訊息整理如下:
1. 程式原本都沒有問題,但在升級至Windows Server 2008後,排程代理程式便出現了錯誤(據說Windows Server 2012也有相同的問題)。
2. 錯誤程式是停在 Set exlSht = exlWbk.Worksheets("Sheet1")
3. 在本端執行沒有問題,但若排程或Run on Server或在Web執行時便出現Automation object error錯誤訊息。
4. 錯誤程式是停在Set exlApp = Createobject("Excel.Application") 錯誤代碼201。
5. 有時候是Microsoft Excel: Class Workbook的SaveAs方法失敗 錯誤代碼213。
6. 最奇怪的是,如果Server是在log out時才會有Automation Ojbect error的訊息,只要有人登入或用遠端連入時便一切正常。

完全解決攻略

1. 首先是程式部份,也是最容易解決的問題,若錯誤訊息為Automation object error且錯誤行數停留在 Set exlSht = exlWbk.Worksheets("Sheet1")
最有可能的原因就是安裝Excel時中英文版本的差異,若Server安裝的Office版本為中文則把此行改為Set exlSht = exlWbk.Worksheets("工作表1") 就行了!



2. R5升級R6之後的版本,代理程式新增了安全性的屬性,若程式中有CreateOjbect則執行時期安全層次設定需為2.允許受限作業 或 3.允許以完整管理權執行受限作業,如下圖:


3. 順帶一提,雖然機會不大,但如果是要以程式將代理程式塞入系統設定值,則修改代理程式的系統欄位$Restricted,值為數字型態,如下圖。但要特別一提的是,三個選項的value依序是,非常詭異,所以value需為02

4. 若在調整了代理程式的安全性仍無法解決,則應由OS找尋問題,首先先至系統管理工具>元件服務>電腦>我的電腦(按右鍵)>COM安全性>編輯預設值


然後確認系統使用者允許本機啟用,在這先得確認代理程式執行時是以何身份,然後在此清單中的本機啟用是允許的。


5. 如果以上設定後仍有相同錯誤,請試著若Server為Log in狀態時是否就可執行,若Server為Log out時則有錯誤。對,這種情況非常詭異,若是如此,則請調整,元件服務>電腦>我的電腦>DCOM設定>Microsoft Excel應用程式>內容>識別身分,若設定為「互動式使用者」,則更改為「執行啟動的使用者」,確定即可。設定在「互動式使用者」時,是指權限比照登入時的帳號,若沒登入則自然沒有權限。

6. 若以上設定後仍有相同問題,則步入最後放大絕,保證藥到病除。首先確認本Server為Server 2008 x64(64位元)或Server 2008 x86(32位元)。



系統類型若為64位元,則在C:\Windows\SysWOW64\config\systemprofile路徑下新增Desktop的資料夾。
系統類型若為32位元,則在C:\Windows\System32\config\systemprofile路徑下新增Desktop的資料夾。或乾脆二邊都加也可以。


在以上設定完成後,相信問題一定可以排除(至少不會再是這個錯誤訊息),原因不是很確定,而我也很好奇錯誤的原因,為什麼在新增資料夾後就不再有錯誤。我找到這篇文章,https://blogs.msdn.microsoft.com/dataaccesstechnologies/2012/12/19/error-microsoft-office-excel-cannot-access-the-file-while-accessing-microsoft-office-11-0-object-library-from-ssis/

以Service執行的確有此問題,而Application沒有試過,不能確定。似乎是在CreateObject時會在Desktop的folder下新增暫存檔案,卻因找不到路徑而錯誤。奇怪的是,這問題似乎被列為Server 2008的issue,只是我不能理解如果在網路上已找出這樣的解決方法,為什麼還會在R2之後還會被列為issue?!