以编程方式打开Excel“信任中心设置”对话框

时间:2014-08-11 00:44:31

标签: excel vba excel-vba vsto

我需要用户单击“信任对VBA项目对象模型的访问权限”,这样我正在构建的应用程序可以帮助他们将代码导入VBE。

我可以显示一个消息框或提供文档,告诉他们如何更改设置(如果他们这样做,则会发出有关反响的警告)。但是这个设置仍然在Excel用户界面中被点击了5次...实际上即使我无法记住在哪里找到它。

所以我想做的是以编程方式打开它们的窗口。

我可能会使用臭名昭着的变幻无常的SendKeys方法,但我想知道是否有更好的方法......

(我发现,当目标Office应用程序未将其作为目标Office应用程序运行时,通过使用VBS脚本更改密钥的值,您实际上可以通过宏设置对用户的VBA项目对象模型的访问权限每this MSDN article但我更希望用户手动启用此选项或选择不这样做。

编辑:VBA VSTO解决方案很好,或者您能想到的任何其他内容。

2 个答案:

答案 0 :(得分:8)

这将打开对话框。

Application.CommandBars.ExecuteMso("MacroSecurity")

或者,这也是做同样的事情:

Application.CommandBars.FindControl(Id:=3627).Execute

用户需要选中该框,即使使用SendKeys也无法以编程方式检查。

额外信用:是否可以更改注册表项?

还有一个注册表项,您可以使用VBA进行更改。

enter image description here

我认为您可以使用这样的子例程将注册表项设置为"允许访问"。但是,当我测试它并且 更改了注册表项值时,它似乎对我访问VBOM的能力没有任何影响:

  • 如果我的设置不允许访问,并且我将键值更改为1,则会出现1004错误。
  • 如果我的设置执行允许访问,并且我将键值更改为0,则操作VBOM的示例代码仍然有效。
  • 如果我以编程方式更改注册表项,则在重新启动Excel应用程序时它将恢复为先前的状态。

我可能做错了什么,所以我会把这个留给别人可以让它工作的机会。我已经使用这种功能为我自己的应用程序设置自定义注册表项,即存储应用程序的当前版本#等,但是这部分注册表可能只是被锁定而且不能被这样操纵。

Const regKey As String = "HKEY_CURRENT_USER\SOFTWARE\MICROSOFT\OFFICE\14.0\Excel\Security\AccessVBOM"
Sub AllowAccessToVBOM()
        With CreateObject("WScript.Shell")
            'write registry key
            .RegWrite regKey, "0", "REG_DWORD"
            MsgBox regKey & " : " & .regRead(regKey)
        End With


End Sub

答案 1 :(得分:0)

我正在研究此问题,实际上您可以使其与SendKeys和DoEvents一起使用。我的以下代码适用于16.0西班牙语版本的Excel。只需使用Ctrl +“ m”定义它即可运行。

Option Explicit
#If VBA7 Then
    Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#Else
    Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
#End If

Sub VBATrust()
Dim x As Boolean, y As Boolean
Dim inicio, final

Application.OnKey "+{m}"

inicio = Now()
x = VBAIsTrusted

'If Application.LanguageSettings.LanguageID(msoLanguageIDUI) = 3082 _
'And Application.Version = "16.0" Then

    AppActivate (ThisWorkbook.Name & " - Excel")
    Application.Wait (Now() + TimeValue("00:00:03"))
    Application.SendKeys "%ao{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}%c", True
    Application.SendKeys "{UP}{UP}{UP}{UP}{UP}{UP}{UP}{UP}{UP}{UP}{UP}", True
    Application.SendKeys "{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}", True
    Application.SendKeys "{TAB}{TAB} ", True
    Application.SendKeys "~", True
    Application.SendKeys "{TAB}~", True

'End If

DoEvents
y = VBAIsTrusted
final = Now()

MsgBox inicio & " - Modelo de objetos VBA : " & x & vbNewLine & _
       final & " - Modelo de objetos VBA : " & y

End Sub

Public Function VBAIsTrusted() As Boolean
Dim a1 As Integer
On Error GoTo Label1
a1 = ActiveWorkbook.VBProject.VBComponents.Count
VBAIsTrusted = True
Exit Function
Label1:
VBAIsTrusted = False
End Function