【问题标题】:Programatically bringing up Excel's "Trust Center Settings" dialog以编程方式打开 Excel“信任中心设置”对话框
【发布时间】:2019-02-26 08:39:42
【问题描述】:

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

我可以显示一个消息框或提供文档告诉他们如何更改设置(并警告他们这样做的后果)。但该设置仍然隐藏在 Excel UI 中单击 5 次...事实上,即使我也很难记住在哪里可以找到它。

所以我想做的是以编程方式为他们打开那个窗口。

我可能会使用众所周知的反复无常的 SendKeys 方法,但我想知道是否有更好的方法...

(我看到,当目标 Office 应用程序未以每个this MSDN article,但我更希望用户手动启用此选项或选择不启用)。

编辑:VBA 或 VSTO 解决方案都可以,或者您能想到的任何其他解决方案。

【问题讨论】:

  • Alt、F、T、向下 9 次、Tab、T。够简单!?哎呀,已经记住了!只是在开玩笑;不幸的是,除了使用脆弱的 SendKeys 或更复杂的版本,使用 AutoHotKey...
  • 顺便说一句,我确实测试了注册表选项,但它似乎不起作用(可能是设计使然)。这似乎与您链接到的 MSDN 文章一致(我昨晚没读过)。

标签: vba excel vsto


【解决方案1】:

这将打开对话框。

Application.CommandBars.ExecuteMso("MacroSecurity")

或者,这做同样的事情:

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

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

额外积分:是否可以更改注册表项?

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

我认为您可以使用这样的子例程将注册表项设置为“允许访问”。但是,当我对此进行测试并且它确实更改了注册表项值时,它似乎对我访问 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

【讨论】:

  • 让它工作将是一个严重的安全问题 IMO。很高兴它在抛出 - 看起来非常像设计行为。
  • 同意@Mat'sMug 我认为这不应该被允许,所以它很可能不是按设计工作的。更多的是“我很好奇……”:D
  • TBH 在我通读的过程中,我一直在想“天哪,这行不通,请不要告诉我这行得通!” - 直到关于 1004 错误的那个子弹 =)
【解决方案2】:

我正在研究这个,实际上你可以让它与 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

【讨论】:

    猜你喜欢
    • 2017-04-16
    • 2019-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2019-06-19
    • 2015-11-27
    相关资源
    最近更新 更多