我需要用户单击“信任对VBA项目对象模型的访问权限”,这样我正在构建的应用程序可以帮助他们将代码导入VBE。
我可以显示一个消息框或提供文档,告诉他们如何更改设置(如果他们这样做,则会发出有关反响的警告)。但是这个设置仍然在Excel用户界面中被点击了5次...实际上即使我无法记住在哪里找到它。
所以我想做的是以编程方式打开它们的窗口。
我可能会使用臭名昭着的变幻无常的SendKeys方法,但我想知道是否有更好的方法......
(我发现,当目标Office应用程序未将其作为目标Office应用程序运行时,通过使用VBS脚本更改密钥的值,您实际上可以通过宏设置对用户的VBA项目对象模型的访问权限每this MSDN article但我更希望用户手动启用此选项或选择不这样做。
编辑:VBA 或 VSTO解决方案很好,或者您能想到的任何其他内容。
答案 0 :(得分:8)
这将打开对话框。
Application.CommandBars.ExecuteMso("MacroSecurity")
或者,这也是做同样的事情:
Application.CommandBars.FindControl(Id:=3627).Execute
用户需要选中该框,即使使用SendKeys也无法以编程方式检查。
额外信用:是否可以更改注册表项?
还有一个注册表项,您可以使用VBA进行更改。
我认为您可以使用这样的子例程将注册表项设置为"允许访问"。但是,当我测试它并且 更改了注册表项值时,它似乎对我访问VBOM的能力没有任何影响:
我可能做错了什么,所以我会把这个留给别人可以让它工作的机会。我已经使用这种功能为我自己的应用程序设置自定义注册表项,即存储应用程序的当前版本#等,但是这部分注册表可能只是被锁定而且不能被这样操纵。
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