适用于Office 2016 for Mac的VB宏在每次尝试访问文件时都需要权限!有没有办法绕过这种行为?

时间:2015-06-22 03:10:03

标签: vba excel-vba mac-office excel

每次Macro尝试访问文件时,Office 2016中的任何VB宏都会向用户显示一个对话框,要求获得权限!有没有办法避免它。

2 个答案:

答案 0 :(得分:8)

与Office for Mac 2011中的VB宏不同,Office 2016 for Mac中的VB宏默认情况下无权访问外部文件。 Office 2016 for Mac应用程序是沙盒,因此缺少访问外部文件所需的权限。

如果应用程序尚无权访问,则更改现有宏文件命令以提示用户进行文件访问。这意味着访问外部文件的宏无法无人值守运行;他们将需要用户交互来在第一次引用每个文件时批准文件访问。

开发人员应使用 GrantAccessToMultipleFiles 命令(请参阅下一节)来避免此体验。此命令允许您的应用程序一次获得所有文件的权限,从而避免困难的用户体验。

GrantAccessToMultipleFiles
这允许您输入文件路径数组并提示用户访问它们的权限  

Boolean  GrantAccessToMultipleFiles(fileArray) 
  • 参数

    • fileArray - POSIX文件路径的数组。
  • 返回值

    • True - 用户授予文件权限。
    • 错误 - 用户拒绝对文件的权限。


注意:授予后,权限随应用程序一起存储,用户无需再授予该文件的权限。

实施例:

Sub requestFileAccess()  
  
'Declare Variables  
    Dim fileAccessGranted As Boolean  
    Dim filePermissionCandidates 
  
 'Create an array with file paths for which permissions are needed  
    filePermissionCandidates = Array("/Users/<user>/Desktop/test1.txt", "/Users/<user>/Desktop/test2.txt") 
  
'Request Access from User  
    fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates) 'returns true if access granted, false otherwise  
      
  
End Sub

答案 1 :(得分:0)

我想使用 VBA 的 Kill 语法删除 Excel 中的文件,并在 VBA 尝试执行命令时收到权限提示。我的脚本应该日夜每 3 分钟运行一次,因此对单独的提示做出响应不会减少它。

为了解决这个问题,我为 VBA 的 Kill 函数创建了一个名为 myKill 的包装器。为了实现它,我:

  1. 在我的 VBA 代码中用 myKill 全局替换所有对 Kill 的调用。

  2. 添加了一个名为 myKill 的新 VBA 子例程(代码如下)

  3. 创建了一个 AppleScript 文件来实际删除文件(下面的代码)

  4. 在系统偏好设置/安全和隐私/隐私中授予 Excel 全磁盘访问权限。不确定这一步是否必要,但我提到了它,因为它是我当前的配置。没有前三步就毫无价值。

这是 myKill 子程序:

 Sub myKill(fname As String)

 Dim s As String

 If Left(Application.OperatingSystem, 3) = "Mac" Then
     s = AppleScriptTask("Kill.applescript", "Kill", fname)
 Else
     Kill fname
 End If

End Sub

这里是 Kill.applescript 文件内容:

on Kill(fileName)
# implementation of vba kill command on Mac. Mac sandboxes Microsoft's
# kill command 

tell application "System Events" to delete alias fileName

end Kill

Kill.applescript 文件必须存储在

 /Users/your user name/Library/Application Scripts/com.microsoft.excel/Kill.applescript

Apple Script 第一次执行时,Mac OS 会请求 Excel 操作要删除的文件所在目录中的文件的权限。 一旦给出,目录中未来的文件删除将不会触发权限请求。我通过退出 Excel,重新输入并删除另一个文件进行了测试。

咆哮 任何人都认为让程序员跳过所有这些箍或每次必须删除文件时单击“确定”是一种可接受的实现,这超出了我的范围。因为 Microsoft 的某个人放弃了抽象简单的文件操作,例如 Kill 超过 10,000 名程序员已经看到这个网页试图弄清楚他们必须做什么才能删除 Microsoft Excel 中的文件。

哟,微软 VBA 项目经理!我和你说话呢!你的工作之所以存在,是因为乔尔·斯波尔斯基说服比尔·盖茨,尽管盖茨怀疑,但 Excel 的宏语言是个好主意。您的工作是确保 Excel VBA abstracts os weirdness 以便程序员可以完成他们的工作,而不必使用其他语言进行黑客攻击。