2017-06-22 35 views
3

我目前有一個代碼,它在啓動時檢查是否啓用了「信任訪問VBA項目對象模型」選項。在啓動時從VBA打開宏安全性

在未啓用的情況下,我需要程序打開宏安全設置以方便用戶訪問。

我做了一些代碼,不會這在大多數情況下,但我遇到一個問題,我不知道如何解決。

的代碼如下:

Private Sub Workbook_Open 
If Not VBATrusted() Then 
    MsgBox "Trust access to the VBA project object model is not enabled" & vbNewLine & vbNewLine & _ 
    "Please allow access by ticking the checkbox in the window that appears after clicking Ok" 
    Application.CommandBars.ExecuteMso ("MacroSecurity") 
End If 
End Sub 

Function VBATrusted() As Boolean 
    On Error Resume Next 
    VBATrusted = (Application.VBE.VBProjects.Count) > 0 
End Function 

此代碼,它的工作,除非宏設置爲默認的「禁用與通知所有宏」,在這種情況下,我激活宏,然後得到一個運行時間錯誤「-2147467259(80004005)對象'_CommandBars'的方法'ExecuteMso'失敗」

此錯誤只會在第一次啓動時發生,因爲我不必在連續啓動時激活宏,除非我移動文件位置。

我試着暫停了兩秒鐘的宏,但是這對我沒有任何幫助,也沒有試圖抓取錯誤的錯誤處理程序,然後嘗試再次執行Application.CommandBars.ExecuteMso ("MacroSecurity")行。它以相同的錯誤結束。

調試器告訴我的錯誤是在Application.CommandBars.ExecuteMso ("MacroSecurity")線,但是這可能沒有太大的與該錯誤消息的驚喜。

+3

你有沒有考慮,而不是暫停2秒,在設定的'Application.OnTime'事件觸發2秒? – CLR

+0

過去我嘗試過這樣的事情,這並不容易 - 爲了防止惡意代碼在用戶的計算機上運行,​​這很困難。雖然我確信可以做到這一點,但我從未能夠自己找到可行的解決方案。 – dwirony

+0

@dwirony在下面看到幾個解決方案:) –

回答

1

簡單的解決方案由@CLR在上面的註釋中提出,但是當我最初測試它時(用戶錯誤!)並沒有工作。所有代碼都在ThisWorkbook模塊:

Option Explicit 

Private Sub Workbook_Open() 
If Not VBATrusted() Then 
    MsgBox "Trust access to the VBA project object model is not enabled. " & vbNewLine & _ 
    "Please allow access by ticking the checkbox in the window that appears" 
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.SetSecurity" 
End If 
End Sub 

Function VBATrusted() As Boolean 
    On Error Resume Next 
    VBATrusted = (Application.VBE.VBProjects.Count) > 0 
End Function 

Sub SetSecurity(Optional foo) 
    Application.CommandBars.ExecuteMso "MacroSecurity" 
End Sub 

稍微複雜:添加MSForms.CommandButton到這將打開安全用戶單擊它後設置面板中的工作表。請MsgBox提示用戶單擊該按鈕,然後更改安全設置。

Module1,該按鈕的Click事件處理程序:

Option Explicit 
Sub Button1_Click() 
    Call ThisWorkbook.SetSecurity 
End Sub 

ThisWorkbook模塊:

Option Explicit 

Private Sub Workbook_Open() 
If Not VBATrusted() Then 
    MsgBox "Trust access to the VBA project object model is not enabled. " & vbNewLine & _ 
    "Please allow access by:" & vbNewLine & vbNewLine & _ 
    "1. Clicking the button on this sheet" & vbNewLine & _ 
    "2. Ticking the checkbox in the window that appears" 
End If 
End Sub 

Function VBATrusted() As Boolean 
    On Error Resume Next 
    VBATrusted = (Application.VBE.VBProjects.Count) > 0 
End Function 

Sub SetSecurity(Optional foo) 
    Application.CommandBars.ExecuteMso "MacroSecurity" 
End Sub 
+0

這是一個很好的方式來解決它,雖然有點更詳細,我曾希望。我剛剛開始測試CLR在原始帖子的評論中建議的'Application.Ontime',並且實際上做到了這一點。 –

+0

你確定嗎?當我嘗試Application.OnTime時,我以爲得到了同樣的錯誤。 –

+0

啊。是的,當我嘗試它時,我有一些錯誤的配置。我也會將該選項添加到此答案中。 –

2

在這裏考慮......
如果你在工作表上放一個大消息告訴用戶激活宏,然後讓自動啓動宏刪除或隱藏該消息,該怎麼辦?這會將信息傳達給需要它的人,而不是其他人。

+0

我正在爲那些可能從未在他們的生活中使用電腦的用戶製作完全自動化的工作表。要求他們進入excel的設置只是要求一個崩潰,所以我不能這樣做。相信我,我很喜歡,但我不能 –

+1

@ChristianEmilJohansen你可以把它作爲你想要的精心製作(考慮一個帶有分步說明和截圖的工作表)。默認情況下顯示它,但如果VBATrusted,則將該表單隱藏在Auto_Open或Workbook_Open事件中,以便不受影響的用戶不會看到它。 –

+0

我應該可以製作一個按鈕,點擊後按步驟教程中的Application.CommandBars.ExecuteMso(「MacroSecurity」)'雖然,對不對?所以,在從Excel中點擊「啓用內容」後,他們所要做的就是點擊我的按鈕以獲取設置? –