我有几个在 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 的应用程序沙箱吗?
很早就尝试过对 Excel 进行“授予完全磁盘访问”。
尝试仅授予目录的 GrantAccessToMultipleFiles 。
那时,我写了上面的代码。
我终于尝试授予对特定文件的访问权限。
我在 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)。