Mac Excel2016宏跨设备运行报Workbooks对象Open方法1004错误如何解决
错误根因
报错的核心原因是GetFileName函数的路径处理逻辑存在两处致命问题,仅能在你本地设备的特定路径场景下运行:
- 硬编码路径截取逻辑
Fname = Mid(Fname, 13)仅适配你本地的路径长度,其他用户的文件路径长度不同,截取后会直接破坏路径完整性 Fname = Right(MyFiles, Len(MyFiles) - InStrRev(MyFiles, Application.PathSeparator, , 1))直接丢弃了选中文件的完整目录路径,仅保留文件名。只有当选中文件刚好存放在Excel的当前默认工作目录时才能正常打开,你本地测试时刚好符合该条件,其他用户的工作目录和选中文件目录不一致时,Excel无法找到对应文件,就会触发Workbooks.Open方法报错。
另外还存在两个隐患:
- 开启
On Error Resume Next后未做错误判断,如果用户取消了文件选择,MyFiles为空时后续处理会生成无效字符串 - 开启了文件多选规则,但未处理多选后返回的逗号分隔路径列表,选中多个文件时也会生成无效路径
修复方案
直接替换原有GetFileName函数为以下版本即可,修复了路径处理逻辑,增加异常判断,默认适配单选场景:
Function GetFileName() As String Dim MyPath As String Dim MyScript As String Dim MyFiles As String ' 初始化返回值为空 GetFileName = "" On Error Resume Next MyPath = MacScript("return (path to documents folder) as String") ' 不需要多选的话保持multiple selections allowed为false即可,需要多选可以自行修改后增加路径拆分逻辑 MyScript = _ "set applescript's text item delimiters to "","" " & vbNewLine & _ "set theFiles to (choose file of type " & _ " {""com.microsoft.Excel.xls"",""public.comma-separated-values-text""} " & _ "with prompt ""请选择文件"" default location alias """ & _ MyPath & """ multiple selections allowed false) as string" & vbNewLine & _ "set applescript's text item delimiters to """" " & vbNewLine & _ "return theFiles" MyFiles = MacScript(MyScript) On Error GoTo 0 ' 只有成功拿到路径才返回 If MyFiles <> "" Then ' Mac版Excel可直接识别AppleScript返回的冒号分隔原生路径,不需要额外截取转换 GetFileName = MyFiles End If End Function
如果需要保留多选功能,只需要把multiple selections allowed改为true,再对返回的逗号分隔的路径列表做拆分,循环调用Workbooks.Open处理每一个文件即可。
如果替换后仍有异常,可以检查Mac系统设置>隐私与安全性>文件和文件夹,确认Excel已经获得了选中文件所在目录的访问权限。
内容的提问来源于stack exchange,提问作者SovietSwag
相关产品推荐
相关产品推荐

