如何給Excel設置動態登陸密碼?


剛剛看到評論區裡面 SUI42 的提示,可以將工作表對象的visible屬性設置為 veryHidden,從而將其完全隱藏。這樣除非運行一段VBA代碼讓它的visible屬性設置回 visible,否則用戶單憑人工操作很難將這些隱藏的工作表顯示出來。感覺 SUI42 的這個主意非常棒,可以很有效的提高之前代碼的實用性,能夠基本滿足樓主的需要。所以我又更新了代碼如下:

上面的代碼就是每次保存文件時都用VBA將第一張工作表(用於迷惑他人)之外的所有工作表都隱藏起來。然後每次打開時,VBA詢問密碼,輸入正確後將它們重新設為可見。

這樣如果用戶禁用了VBA,那麼打開時就看不到各張工作表。除非用戶知道這些表的存在,並且自己手動編寫一段VBA程序將之恢復。雖然各種VBA方案無法從根本上做到文件保護,但已經足夠騙過大多數普通Excel用戶了。

再次感謝 SUI42 !

~~~~~~~~ 下面是之前貼出的原答案 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

看到樓上 任鏗 的回答,覺得很有啟發,謝謝先。首先需要跟樓主說明的是,用VBA來動態生成密碼本質上就是不完備的。因為用戶可以在任何時間禁用excel的運行宏功能,此時VBA將失去作用,無論是生成密碼還是保護文件都會失效。比如參照樓上的方案,如果用戶某一次打開該文檔時禁用了宏,那麼再次保存時該文件的密碼並沒有被更新成當日日期,仍然保留為上一次啟用宏並打開時生成的密碼。結果就是用戶自己很可能不會注意到這一點,誤以為密碼已經更新,結果下次無法打開,只能破解。

現在,假如我們假設用戶永遠啟用VBA,那麼樓主的想法,也就是「每次打開時的口令都是打開當時的日期」,可以採用一個近似辦法來解決,就是不加密工作簿,而是讓關鍵工作表無法瀏覽。

首先,請在工作簿中新建一個完全空白的工作表,比如我下面例子中把它放在第一張工作表位置上。如果用戶不能輸入正確密碼,那麼就始終讓這張工作表顯示在最前面,無法看到後面真正有數據的那幾張表。

然後,跟樓上回答一樣,打開VBA工程中「ThisWorkbook」的代碼頁,寫入下面這些代碼(我在裡面加了注釋,希望樓主能看懂):

現在保存工作簿為 .xlsm 文件。然後再次打開時,就是下面的效果了。只要用戶輸入的密碼不正確,就永遠無法終止消息框,也就看不到真正的數據表了。

這個代碼最大的問題,就是一旦用戶禁用了宏,那麼就可以直接打開工作簿看數據,VBA根本不運行。不過辦法總還是有的,只是實現上要複雜很多。這裡給樓主一個思路:首先,用VBA編寫一個加密的私有函數,可以把所有工作表中的重要數據進行加密;然後,再編寫一個VBA解密函數。這樣,在 workbook_open 中,當用戶輸入了正確口令後,調用解密代碼將所有表格數據解密;而在workbook_close 中,每當關閉時都調用加密代碼將所有表格數據加密後再保存退出。最後,將VBA工程進行口令保護,使別人無法看到這些代碼。這樣,如果用戶不啟用宏,那麼雖然打開工作表也只能看到密文;而一旦啟用宏,就必須輸入正確口令才可以。除非他找工具破解了VBA Project的口令,然後直接調用運行你的解密函數。

不過最後還是特別提醒一下,用VBA動態保護這個工作簿,包括我自己這段代碼在內,都不是無懈可擊的,只能是增加破解成本。其實Excel工作簿的口令保護本身也是只是增加了破解成本,真有人想破解的話有很多種方法可以使用。而且樓主想保護的文件是要分發給別人的,所以我們不可能開發系統級程序去修改和擴展別人電腦的Office底層甚至文件系統。所以我也是拋磚引玉,看看有沒有其他大神有簡單的辦法來解決吧。


由於你的描述比較模糊,我先按我理解的回答吧。

假設你是需要對某一個文檔自動設置動態登錄密碼,密碼規則為日期加文字。

那麼需要先對這個文件另存為啟用宏的工作簿,然後使用ALT+F11,打開VBE輸入代碼就可以了。

每次關閉工作簿,他都會重新根據當前日期設置一下密碼的。

如果需要改變密碼的編製規則,那就用year(now())*3.5+month(now())*8+day(now())*20這樣的內容代替等號後面的代碼就行了,但是這樣搞下去我擔心你自己也會忘記密碼,只能通過破解的方式打開文檔了。


推薦閱讀:

excel中如何利用宏做上千次的表格數據求平均?
如何整理excel?
如何在Excel中提取指定字元內的文本?
求助!如何簡便地將兩千多個excel文件中的數據放到一個excel表格中?

TAG:MicrosoftExcel | VBA | Excel編程 |