引子:好久沒有更新博客了,特別是沒有更新關(guān)于VBA方面的內(nèi)容了,不是不想,是有太多的事要做了。但我想忙不是理由,因此以后還是要更勤勞一點(diǎn),在博客中多分享一些有用的知識(shí)。
為了防止宏病毒對(duì)用戶的文檔產(chǎn)生危害,Microsoft為Office應(yīng)用程序創(chuàng)建了一個(gè)安全模型,能夠使用戶選擇禁用宏,以作為一個(gè)防護(hù)措施。雖然這能夠在一定程序上防止宏病毒,但同時(shí)也帶來了副作用,因?yàn)橛泻芏辔臋n中的許多功能依賴于用戶已經(jīng)實(shí)現(xiàn)的宏,如果禁用宏,那么這些功能就不可用。這個(gè)問題也一直困擾著許多VBA開發(fā)人員,因?yàn)樗麄冮_發(fā)的功能發(fā)送給用戶時(shí),如果用戶禁用宏或者將宏安全級(jí)別設(shè)置為高以上,就意味著用戶無法使用他們的功能,特別是那些對(duì)宏一無所知的用戶。因此,很多人問:有沒有辦法能夠去掉打開帶有宏的文檔時(shí)出現(xiàn)的警告消息而直接啟用宏。
下面是一個(gè)技巧,看了之后覺得很有意思,特輯錄于此。這個(gè)技巧并不能夠去掉是否關(guān)于宏的安全警告消息,但能夠提示用戶,如果不啟用宏,那么就不能夠使用該工作簿。這個(gè)提示信息是通過事先在工作簿中創(chuàng)建的一個(gè)默認(rèn)工作表(即名為“啟用宏”的工作表)來實(shí)現(xiàn)的。
代碼如下:
Sub AskUserEnabledMacros() Dim wksInfoSheet As Worksheet Dim objSheet As Object On Error Resume Next '引用<啟用宏>工作表并判斷其是否存在 Set wksInfoSheet = ThisWorkbook.Worksheets("啟用宏") If wksInfoSheet Is Nothing Then MsgBox "不能夠找到<啟用宏>工作表", vbCritical Exit Sub End If '關(guān)閉屏幕更新 Application.ScreenUpdating = False '遍歷工作簿中的所有工作表并設(shè)置所有工作表可見 For Each objSheet In ThisWorkbook.Sheets objSheet.Visible = xlSheetVisible Next objSheet '隱藏<啟用宏>工作表 wksInfoSheet.Visible = xlSheetVeryHidden '保存工作簿 ThisWorkbook.Saved = True '恢復(fù)屏幕更新 Application.ScreenUpdating = True End Sub '隱藏除<啟用宏>工作表之外的所有工作表 Sub RunOnClose() Dim wksInfoSheet As Worksheet Dim objSheet As Object On Error Resume Next '引用<啟用宏>工作表并判斷其是否存在 Set wksInfoSheet = ThisWorkbook.Worksheets("啟用宏") If wksInfoSheet Is Nothing Then MsgBox "不能夠找到<啟用宏>工作表", vbCritical Exit Sub End If '關(guān)閉屏幕更新 Application.ScreenUpdating = False '顯示<啟用宏>工作表 wksInfoSheet.Visible = xlSheetVisible '隱藏其他工作表 For Each objSheet In ThisWorkbook.Sheets If Not objSheet Is wksInfoSheet Then objSheet.Visible = xlSheetVeryHidden End If Next objSheet '保存工作簿 ThisWorkbook.Save End Sub Sub auto_open() '當(dāng)工作簿打開時(shí)運(yùn)行AskUserEnabledMacros過程 AskUserEnabledMacros End Sub Sub auto_close() '隱藏除<啟用宏>工作表之外的所有工作表 RunOnClose End Sub
打開該工作簿時(shí),如果禁用宏,那么就只出現(xiàn)“啟用宏”工作表,提示用戶只有啟用宏才能夠使用該工作簿。如果啟用宏,那么就會(huì)出現(xiàn)具體的工作表。