Excel 2016 for Mac中的VBA宏:使用CSV文件格式无法使用SaveAs功能

4

我正在运行Excel 2016 for Mac中的VBA宏。该宏适用于Windows平台上的Excel 2016以及早期版本的Mac平台。问题似乎出现在尝试导出CSV时,特定于Excel 2016 for Mac。

代码应该允许用户点击按钮,然后将活动工作表导出为CSV文件。虽然在这里记录了类似的问题(Getting "method saveas of object _workbook failed" error while trying to save an XLSM as CSV),但是,不幸的是,尽管将xlCSV更改为6对他们有用,但对我没有用。

代码工作正常,直到ActiveWorkbook.SaveAs Filename:=newFileName, FileFormat:=6, CreateBackup:=False这一行,然后抛出以下错误:

运行时错误 '1004':对象'_Workbook'的方法'SaveAs'失败

如果我将FileFormat更改为51(.xlsx)或53(.xlsm),则代码将成功完成。但是,如果FileFormat设置为6(.csv),代码将抛出上述错误。我无法将xlCSVxlCSVMac保存为SaveAs

我的完整脚本如下:

Sub btnExportCSV_Click()
Dim oldFileName As String
Dim newFileName As String
Dim timeStamp As String
Dim fileAccessGranted As Boolean
Dim filePermissionCandidates
Dim wsPath As String

timeStamp = Format(Now, "yyyymmddhhmmss")

wsPath = Application.ThisWorkbook.Path

oldFileName = ThisWorkbook.FullName
newFileName = Mid(oldFileName, 1, InStrRev(oldFileName, ".") - 1) & timeStamp & ".csv"

' Check if software is Office 2016 for Mac
' Documentation for this comes from https://dev.office.com/blogs/VBA-improvements-in-Office-2016
#If MAC_OFFICE_VERSION >= 15 Then
    filePermissionCandidates = Array(wsPath)
    fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)
#End If

Application.DisplayAlerts = False

Sheets("OfflineComments").Activate
Sheets("OfflineComments").Copy
ActiveWorkbook.SaveAs Filename:=newFileName, FileFormat:=6, CreateBackup:=False
ActiveWorkbook.Save
ActiveWindow.Close

MsgBox ("Offline comments exported to " & newFileName)

Application.DisplayAlerts = True
End Sub

我尝试过以下方法:

  • 在输入/输出文件名中添加完整路径
  • 确保检查了Excel的版本并允许用户权限
  • 尝试使用不同的文件类型作为FileFormat参数,但只有两种类型实际上有效。
  • 尝试使用上面链接文章中提到的代码,但没有帮助(这就是为什么我在这里发布原始代码的原因)。

这里有一些更新的信息:http://answers.microsoft.com/en-us/msoffice/forum/msoffice_excel-mso_mac/vba-macro-in-excel-2016-for-mac-saveas-will-not/86d6855f-241d-4b8d-b233-cccd7184c67b。对于那些感兴趣的人,问题似乎与苹果沙盒引起的新权限问题有关。 - Kate
3个回答

1
我认为这是一个bug,我遇到了同样的问题并使用了一个解决方法:

ActiveWorkbook.SaveAs newFileName, CreateBackup:=False
Kill newFileName
ActiveWorkbook.SaveAs newFileName, FileFormat:=xlCSV, CreateBackup:=False
ActiveWorkbook.Close

这个方法首先将我的工作簿保存为原始文件(xlsx),然后删除它并保存为csv格式,它对我起作用了。

0

试试这个:

Application.ThisWorkbook.SaveAs ("C:\User\Folder\test.csv")

同时删除ActiveWorkbook.Save这一行。你已经保存了两次。

我正在使用Excel 2010,在我的电脑上运行得非常完美。


谢谢您的建议!不幸的是,它并没有按照预期工作。虽然使用这行代码Application.ThisWorkbook.SaveAs (newFileName)可以运行和保存具有适当名称和CSV文件扩展名的文件,但实际文件的格式似乎并不是CSV。当我尝试打开时,会出现格式和扩展名不匹配的错误,并且所有的格式仍然存在。此外,使用ThisWorkbook对象将导致代码实际上重命名原始文件,并且似乎没有保留原始工作表的版本,而我希望保留原始工作表的一个版本。 - Kate
将该行更改为Sheets("OfflineComments").SaveAs Filename:=newFileName, FileFormat:=6, CreateBackup:=False一度起作用,但随机停止工作。现在抛出错误运行时错误'1004':工作表类的SaveAs方法失败 - Kate
嗯,如果一开始它能够工作,但后来停止工作,我的猜测是可能与你的路径有关。它是否包含某些非法字符或双重空格? - TheGuyOverThere
再次感谢您的建议。我使用 MsgBox 检查了路径,看起来没问题。唯一可能导致路径错误的方式是在我的尝试之间路径发生了变化,但这并没有(明显)。我能想到的唯一可能是OSX存在已知的权限问题 https://dev.office.com/blogs/VBA-improvements-in-Office-2016 ,但我不确定它会如何影响后台操作。 - Kate

0

尝试更改权限,通过将wsPath更改为newFileName来显式请求新文件名而不是路径:

#If MAC_OFFICE_VERSION >= 15 Then
    filePermissionCandidates = Array(newFileName)
    fileAccessGranted = GrantAccessToMultipleFiles(filePermissionCandidates)
#End If

感谢@user6853416的建议,但不幸的是那并没有起作用。有趣的是,现在它不再提示我访问该文件夹,但我仍然收到了SaveAs命令的相同错误。 - Kate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接