2022-02-06 xlsb 文件中的 ActiveX 命令按鈕和 VBA 代碼綁定問題

遇到一個比較奇葩的問題,沒找到解決方案,用英文關(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,問題少多了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容