遇到一個比較奇葩的問題乘盼,沒找到解決方案螟凭,用英文關鍵詞找了也沒有亿虽,stackoverflow 和 EH 論壇都沒有找到可以參考的方法菱涤,最后春節(jié)假期自己研究,搞定了洛勉。我和大約 300 個用戶都是 win10 64+office365 或 office2016 環(huán)境粘秆。
我用 excel 做了設備維護用的巡檢表,里面有一千多行 vba收毫,實現(xiàn)了很多功能攻走。里面有表單控件的命令按鈕,也有 ActiveX 控件的命令按鈕此再,維護人員填寫完巡檢表后點擊按鈕提交昔搂,會自動另存為 pdf 并把 xlsb 和 pdf 文件放到指定目錄,然后調用 outlook 發(fā)郵件到指定郵箱歸檔文件引润。
前不久有同事給我發(fā)了七十多個文件巩趁,說里面有個按鈕點擊沒反應,讓我看下能不能修復淳附。
我打開文件發(fā)現(xiàn) ActiveX 按鈕變成了圖片议慰,沒有和代碼關聯(lián)。而大家知道奴曙,activeX 按鈕在創(chuàng)建后雙擊直接就跳到自動創(chuàng)建的形如 private sub commandbutton1_Click () 私有過程中了别凹,我就在這里面寫的代碼。
現(xiàn)在最簡單的解決方法是洽糟,把 Private 去掉炉菲,在按鈕上右鍵堕战,重新綁定,選擇 commandbutton1_Click拍霜,解決嘱丢。但是我有很多文件,每個都有密碼保護祠饺,都先解除密碼再這么操作越驻,太費勁了。有什么代碼可以指定按鈕關聯(lián)哪個過程呢道偷?找到了 OnAction 方法缀旁,用 ActiveSheet.Shapes (1).OnAction = "test" 這種可以。但是 Private sub 怎么辦勺鸦?經過測試并巍,ActiveSheet.Shapes (1).OnAction = "Sheet1.CommandButton1_Click" 寫成這樣,可以了换途。
于是懊渡,我在 personal.xla 里寫了如下代碼,放到快速訪問工具欄上怀跛,然后選中有問題的文件距贷,每選 15 個柄冲,回車吻谋,全部打開(我 win11 下超過 15 個再按回車就沒反應了,win10 下選 20 多個再按回車也可以)现横。點一下快速訪問工具欄的圖標(或者按快捷鍵漓拾,快速訪問工具欄第一個圖標快捷鍵就是 alt+1,第 8 個就是 alt+8)戒祠,搞定骇两,逐個點下去,一鍵修復姜盈,70 多個文件操作五六批全部搞定低千。
Sub 按鈕綁定修復 ()
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 控件烈疚,每個版本要打哪個補丁黔牵,我曾經做過一個表,后面放棄了爷肝,太費勁了猾浦,統(tǒng)一要求 office2016,不是 2016 的卸載裝 2016灯抛,問題少多了金赦。