Posts Tagged With: Excel

[WU]安全性更新後 Excel 很慢、且無法開啟檔案

這個月的安全性更新中, Office 更新完後,公司部分電腦的 Excel 發生異常,直接點檔案兩次,會跳出:

傳送命令給程式時發生錯誤

Windows 找不到檔案路徑\檔案名稱,請確定您輸入正確的名稱,然後再試一次

所以依照 DDE 的標準方式處置,包含移除非微軟的增益集,其中發現了奇怪的現象,如圖,會出現:

excel_addon_01

符號表工具列 增益集

 

在 增益集設定中 ,出現硬碟找不到實體路徑的 Office 2007 (office12) 的增益集 [Chinese Translation Addin]

excel_addon_02

增益集 [Chinese Translation Addin]

試過修復 Office 也沒用,開新帳號測試,結果新帳號正常。

研判應該是註冊資訊檔異常。

1. 關閉 Excel ,由於 Excel 異常,可能無法正常關閉,請務必使用工作管理員確認 Excel 關閉。
2. 將下列機碼的 Excel 改成 Excel.old

Excel 2010
HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Excel
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\14.0\Excel

Excel 2013
HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Excel
HKEY_LOCAL_MACHINE\Software\Microsoft\Office\15.0\Excel

註:部分電腦 HKEY_LOCAL_MACHINE 下可能沒有 Excel ,若沒有可忽略

3. 從開始工具列捷徑 開啟 Excel ,頁籤應已無 標點符號增益集
4. Excel 選項 > 增益集 > COM增益集 > 把不存在的增益集刪除
5. 關閉 Excel ,對著一般 excel 檔案點兩下,看是否正常開啟。
6. 正常開啟後,可把機碼 Excel.old 刪除,收工。

目前發現會出問題無法正常開啟的是 Office 2010/2013 x86 。
Office 2007 有碰上加入這個工具列,但可能本來就是 Office 2007 的增益集,因此不會發生衝突,不用可停用。

我懷疑是微軟封裝更新時,忘了把機碼移除,導致大家死得很難看。

參考:https://support.microsoft.com/zh-tw/help/280504/how-to-troubleshoot-startup-problems-in-excel

註:這周小紅傘更新後,預設排程每 168 小時全機掃描一次,好像變成每 168 分鐘掃描一次,也造成 Excel 很慢,暫時先停用排程,建議大家也看看小紅傘事件紀錄。

Categories: 工作點滴, 更新與回報 | 標籤: | 1 則迴響

[VBA] LongLong 超長整數

話說,公司的專案支援 VBScript 外掛,這幾天在用 Excel 2013 的 VBA 7.1 寫 VBScript 。

因為裡面要用到位元旗標,我就很順手的打了:
2^i

想說,VBA 原始碼自動感知會幫我加空白,就繼續往下寫。

寫完以後用 Excel 測試,變成 #VALUE ,就用追蹤方式追查,才知道這行有問題。

手動改成 2 ^ i 就沒問題,好奇之下另外開個小專案測試:

誤使用到超長整數符號

誤使用到超長整數符號

用除錯模式看,型別居然是 LongLong 。

按下 F2 查物件類別庫,果然有 LongLong ,用 HEX(-1) 測試,是 8 bytes 的超長整數:

LongLong 為 8 bytes 超長整數

LongLong 為 8 bytes 超長整數

用 Google 搜尋 MSDN ,看起來是 x64 版本的 VBA 就加入了,應該是 Office 2010 x64 以後開始有此功能:
64 位元 Visual Basic for Applications 概觀:https://msdn.microsoft.com/zh-tw/library/office/Gg264421.aspx

順便回頭測了 Excel 2003 的 VBA 6.5:

Excel 2003 VBA 6.5 正確處理次方運算符號

Excel 2003 VBA 6.5 正確處理次方運算符號

舊版本的 VBA 就能自動把 2^2 轉成 2 ^ 2 。

從 LongLong 超長整數的 VBA 7.1 來看當初微軟在 2005 年宣告 VB6 不再支援的理由又消滅了一個,不是不能支援 64 bits 及加超長整數,而是不願意加,是不為也,非不能也。

Categories: 工作點滴, 技術分享 | 標籤: | 1 則迴響

Excel Variant Date 在 1900/3/1 以前的基準日與 VB6 不同

這個狀況更詳細的說明可以到 http://support.microsoft.com/ 搜尋 Excel 1900 。
簡單的說,最早的試算表 Lotus 123 把 1900 視為閏年,理論上來說,逢四閏、逢百不閏、逢四百閏,所以 1900 年為非閏年,但是在 Excel 會有 1900/2/29 的存在,當時的設計是為了與 Lotus 123 相容而存在,就用到現在,所以到了 Excel 2007 還是這樣…
Excel 有兩組日期系統,以 1900/1/0 為 基準或是 1904/1/1 為基準。下面是個簡表,Variant Date 為 OleAut32.dll 裡面定義的 Variant Date ,VB6/VBA/VBScript 的內建 Date 型態,VBNET 可用 ToOADate/FromOADate 轉換,核心值域是依據 IEEE 754 的 Double 來設計,所以加上 Double 的對照:
Double Variant Date Excel Date 1904 Date
0 1899/12/30 1900/1/0 1904/1/1
1 1899/12/31 1900/1/1 1904/1/2
2 1900/1/1 1900/1/2 1904/1/3
58 1900/2/26 1900/2/27 1904/2/28
59 1900/2/27 1900/2/28 1904/2/29
60 1900/2/28 1900/2/29 1904/3/1
61 1900/3/1 1900/3/1 1904/3/2
62 1900/3/2 1900/3/2 1904/3/3
Variant Date 在 1900/3/1 以後就完全與 Excel Date 重合,基本上不建議採用 1904 為基礎的日期資料。
可以看出來,Excel Date 居然有個 1900/1/0 ,算是很有趣的東西,此外,Excel 不接受基準日以前的日期,所以不能有 1899/12/31 這類的日期出現,當然,若採用 1904 為基準,就完全不會出現 1904 年以前的日期。
因此在 1900/3/1 以前的日期若仍要使用在 Excel 內,必須改用 VBA 來處理,並運用 String <-> Date 來相互轉換。
Categories: Office | 標籤: | 發表留言

在WordPress.com寫網誌.

%d 位部落客按了讚: