遇到一個比較奇葩的問題,沒找到解決方案,用英文關(guān)鍵詞找了也沒有,stackoverflow 和 EH 論壇都沒有找到可以參考的方法,最后春節(jié)假期自己研究,搞定了。我和大約 300 個用戶都是 win10 64+office365 或 office2016 環(huán)境。
我用 excel 做了設(shè)備維護用的巡檢表,里面有一千多行 vba,實現(xiàn)了很多功能。里面有表單控件的命令按鈕,也有 ActiveX 控件的命令按鈕,維護人員填寫完巡檢表后點擊按鈕提交,會自動另存為 pdf 并把 xlsb 和 pdf 文件放到指定目錄,然后調(diào)用 outlook 發(fā)郵件到指定郵箱歸檔文件。
前不久有同事給我發(fā)了七十多個文件,說里面有個按鈕點擊沒反應(yīng),讓我看下能不能修復(fù)。
我打開文件發(fā)現(xiàn) ActiveX 按鈕變成了圖片,沒有和代碼關(guān)聯(lián)。而大家知道,activeX 按鈕在創(chuàng)建后雙擊直接就跳到自動創(chuàng)建的形如 private sub commandbutton1_Click () 私有過程中了,我就在這里面寫的代碼。
現(xiàn)在最簡單的解決方法是,把 Private 去掉,在按鈕上右鍵,重新綁定,選擇 commandbutton1_Click,解決。但是我有很多文件,每個都有密碼保護,都先解除密碼再這么操作,太費勁了。有什么代碼可以指定按鈕關(guān)聯(lián)哪個過程呢?找到了 OnAction 方法,用 ActiveSheet.Shapes (1).OnAction = "test" 這種可以。但是 Private sub 怎么辦?經(jīng)過測試,ActiveSheet.Shapes (1).OnAction = "Sheet1.CommandButton1_Click" 寫成這樣,可以了。
于是,我在 personal.xla 里寫了如下代碼,放到快速訪問工具欄上,然后選中有問題的文件,每選 15 個,回車,全部打開(我 win11 下超過 15 個再按回車就沒反應(yīng)了,win10 下選 20 多個再按回車也可以)。點一下快速訪問工具欄的圖標(或者按快捷鍵,快速訪問工具欄第一個圖標快捷鍵就是 alt+1,第 8 個就是 alt+8),搞定,逐個點下去,一鍵修復(fù),70 多個文件操作五六批全部搞定。
Sub 按鈕綁定修復(fù) ()
ActiveWorkbook.Sheets("test").Activate
解鎖表
ActiveSheet.Shapes(1).OnAction = "sheet1.CommandButton1_Click"
ActiveWorkbook.Close 1
End Sub
主要就是要注意,私有過程,前面要加工作表名稱。
這個問題我遇到過不止一次,好好的文件在有的用戶電腦上保存一下就自動解綁了。我后面要遠程看下那個用戶 office 環(huán)境。
xlsb 文件損壞概率比 xlsm 大,但 xlsb 比 xlsm 感覺安全一點點,別人破解要先另存為 xlsm 或 xls 才行。
控件能用表單控件就盡量用表單控制,因為表單控件的兼容性比 ActiveX 控件要好的多。
我最早是 office2007 sp3 環(huán)境下開發(fā)的這一套模板,到 office2007 沒有 sp 包的環(huán)境就不正常,至少要 sp2 才能正常,后面 office2010 也有問題,2013 也有問題,2016 問題最少,2007 以后,每個版本又有 32 和 64 位,頭大的很。造成問題的主要就是 ActiveX 控件,每個版本要打哪個補丁,我曾經(jīng)做過一個表,后面放棄了,太費勁了,統(tǒng)一要求 office2016,不是 2016 的卸載裝 2016,問題少多了。