【问题标题】:VBA macro in Excel 2016 for Mac: SaveAs will not work with a CSV file formatExcel 2016 for Mac 中的 VBA 宏:SaveAs 不适用于 CSV 文件格式
【发布时间】:2017-01-01 23:55:49
【问题描述】:

我正在 Excel 2016 for Mac 中运行 VBA 宏。该宏适用于装有 Excel 2016 的 Windows 平台,以及低于 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),则代码将引发上述错误。我无法SaveAsxlCSVxlCSVMac

我的完整脚本如下:

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 参数的各种文件类型,但如前所述,实际上只有两种类型有效。
  • 尝试上述链接文章中提到的代码,但没有帮助(这就是我在此处发布原始代码的原因)。

【问题讨论】:

标签: excel vba macos macros excel-2016


【解决方案1】:

我认为这是一个错误,我有同样的问题,我使用了一种解决方法:

ActiveWorkbook.SaveAs newFileName, CreateBackup:=False
杀死新文件名
ActiveWorkbook.SaveAs newFileName, FileFormat:=xlCSV, CreateBackup:=False
ActiveWorkbook.关闭

这首先将我的工作簿保存为原始文件 (xlsx),删除它并保存为 csv,它对我有用。

【讨论】:

    【解决方案2】:

    试试这个:

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

    同时删除 ActiveWorkbook.Save 行。你是双重保存它。 我正在使用 Excel 2010,它在我的机器上完美运行。

    【讨论】:

    • 感谢您的建议!不幸的是,它没有按预期工作。虽然代码将使用此行Application.ThisWorkbook.SaveAs (newFileName) 以适当的名称和 CSV 文件扩展名运行并保存,但文件的实际格式似乎不是 CSV。当我尝试打开时,我收到格式和扩展名不匹配的错误,并且所有格式仍然存在。此外,使用ThisWorkbook 对象将导致代码实际重命名原始文件,并且似乎不会保留我想要保留的原始工作表的版本。
    • 将该行更改为Sheets("OfflineComments").SaveAs Filename:=newFileName, FileFormat:=6, CreateBackup:=False 工作了一段时间,但随后又随机停止工作。现在抛出错误Run-time error '1004': SaveAs method of Worksheet class failed
    • 嗯,好吧,如果它在开始时有效并且后来它们停止工作,我猜它可能与您的路径有关。它是否有某种非法字符,或者可能是双空格?
    • 再次感谢您的建议。我已经使用MsgBox 检查了路径,它们对我来说看起来不错。它可能是路径的唯一方法是,如果路径在我的尝试之间发生了变化,但它没有(明显地)。我唯一能想到的是 OSX dev.office.com/blogs/VBA-improvements-in-Office-2016 存在已知的权限问题,但我不确定这会如何在后台影响它。
    【解决方案3】:

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

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

    【讨论】:

    • 感谢@user6853416 的建议,但不幸的是,这并没有奏效。有趣的是,它现在不会提示我访问该文件夹,但我仍然在 SaveAs 命令上收到相同的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2015-11-10
    • 1970-01-01
    相关资源
    最近更新 更多