我有几个在 Windows 上无人值守运行的 VBA 宏。我试图将它们移植到 Mac m1,但在 Mac 上遇到了沙盒问题。每次宏尝试打开一个新文件时,它都会触发一个访问权限对话框。 Microsoft 文档指出 GrantAccessToMultipleFiles 作为部分解决方案。
我编写了以下代码来扫描目录并枚举其中的所有文件以传递给 GrantAccessToMultipleFiles。不幸的是,当我将文件数组传递给例程时,什么也没有发生,除了它返回一个 True 指示访问被授予。根本没有权限对话框出现。
稍后,当我的代码尝试打开枚举文件时,我会看到一个访问权限请求对话框。我想也许有一个未记录的数组限制所以只传递了几个文件但得到了相同的结果。
我做错了什么?
Sub directoryGrant(dire)
Dim files() As String
Dim i, s, b As Boolean
i = 0
s = dir(dire)
If s = "" Then End
While s <> ""
ReDim Preserve files(i)
files(i) = s
i = i + 1
s = dir
Wend
b = GrantAccessToMultipleFiles(files)
If b = False Then i = i / 0
End Sub
正如我所说,上面的代码,如果它有效的话,只是部分解决方案,因为稍后我的代码会下载客户端文件,这些文件的名称在它们到达之前我不知道。我需要能够在不触发权限对话框的情况下打开这些文件。
有什么方法可以在 Mac 上禁用 Excel 的应用程序沙盒,以便我可以使用自己的计算机来完成我的工作?
*编辑更新。很早以前,我尝试过“授予完整磁盘访问权限”以取得优异成绩,但没有奏效。尝试将 GrantAccessToMultipleFiles 授予也不起作用的目录。那时,我编写了上面的代码,看看它是否可行。那里也没有快乐。我终于尝试只授予对特定文件的访问权限,但也没有用。要么这是一个 M1 问题,我完全搞砸了,要么微软从来没有让它工作并发布过。
我在 Word 2019 VBA for Mac 中遇到了类似的问题。看起来 GrantAccessToMultipleFiles 的参数必须是一个数组,但这个数组必须恰好包含一个元素。我必须遍历包含在不同数组中的文件列表,并将用作 GrantAccessToMultipleFiles 参数的数组的内容设置为每次迭代时仅等于一个文件名。代码如下所示
Dim FileToSplitFullPath As String
Dim PermissionCandidates
Dim fileAccessGranted As Boolean
Dim FileToCombine() As String
...
For FileToSplitCount = LBound(FileToCombine) To UBound(FileToCombine)
FileToSplitFullPath = CurrentPath & FileToCombine(FileToSplitCount)
PermissionCandidates = Array(FileToSplitFullPath)
fileAccessGranted = GrantAccessToMultipleFiles(PermissionCandidates)
Next FileToSplitCount
上面的代码静默运行。我通过 Split 函数从外部文件填充 FileToCombine(),但它可以按照您希望的任何方式填充。我想上面的代码可以简单地在每次创建文件名时,在创建后立即以某种方式存储以供将来使用。我想这是 Mac VBA 中的一个错误。
查看线程中发布的代码Excel 2016 for Mac 中的 VBA 宏:SaveAs 不适用于 CSV 文件格式和https://answers.microsoft.com/en-us/msoffice/forum/all/ vba-macro-in-excel-2016-for-mac-saveas-will-not/86d6855f-241d-4b8d-b233-cccd7184c67b 我意识到问题在于 GrantAccessToMultipleFiles (1) 的参数必须是一个数组, (2) 必须在没有类型的情况下声明, (3) 每次使用时必须只包含一个元素。
如果您只想在您的计算机上运行宏,您可以将 Excel 添加到具有“完整磁盘访问权限”的应用程序中:
你也可以尝试
GrantAccessToMultipleFiles
直接到目录(我不擅长VBA)。