VBA 对象 _workbook 的运行时错误方法保存失败

VBA runtime error method save of object _workbook failed

我正在尝试创建一个检查指定文件夹的宏,以确保存在名为当年的文件夹。如果不是,它会按当年的名称创建一个文件夹。 然后宏从已打开的工作簿的 Sheet1 复制所有内容,并粘贴到新添加的工作簿中。以指定名称保存新工作簿并关闭它。

我尝试了下面提到的代码。如果我已经有了名称为当年的文件夹,宏将按预期工作。但是,如果该文件夹不存在,则宏会创建一个文件夹,打开一个新工作簿,粘贴复制的数据,保存文件,但不会进行下一步关闭文件,而是显示 运行 -time 错误“对象 _workbook 的 1004 方法保存失败”。 有人可以帮我吗?

Sub Copy_Data()

Dim ThisYear As String
Dim fdObj As Object
Dim wbO As Workbook

ThisYear = Format(Date, "YYYY")

Set fdObj = CreateObject("Scripting.FileSystemObject")

If fdObj.FolderExists("C:\Temp\" & ThisYear) Then GoTo DataCopy:
fdObj.CreateFolder ("C:\Temp\" & ThisYear)

DataCopy:

Sheet1.UsedRange.Copy

Set wbO = Workbooks.Add
Range("A1").PasteSpecial xlPasteAll

wbO.SaveAs Filename:="C:\Temp\" & ThisYear & "\Data_New_" & Format(Now(), "ddmmyyyy"), FileFormat:=51     'Stops here

Windows("Data_New_" & Format(Now(), "ddmmyyyy") & ".xlsx").Close

End Sub

根据建议,我编辑了如下代码。我仍然遇到同样的问题。如果我使用 F8 执行步骤,代码工作正常,但如果我 运行 宏,则显示 运行 时间错误。

Sub Copy_Data()

Dim ThisYear As String
Dim fdObj As Object
Dim wbO As Workbook

ThisYear = Format(Date, "YYYY")

Set fdObj = CreateObject("Scripting.FileSystemObject")

If Not fdObj.FolderExists("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear) Then
fdObj.CreateFolder ("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear)
End If

Sheet1.UsedRange.Copy

Set wbO = Workbooks.Add
Range("A1").PasteSpecial xlPasteAll

wbO.SaveAs Filename:="C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear & "\Data_New_" & Format(Now(), "ddmmyyyy"), FileFormat:=51      'Stop here

wbO.Close

End Sub

通过反复试验和谷歌搜索,我发现在尝试将文件另存为 xlsx 时会发生此运行时错误“对象 _workbook 的方法保存失败”。如果选择的文件格式是 xls,那么宏就可以正常工作。但我更喜欢将文件保存为 xlsx 格式。

https://techcommunity.microsoft.com/t5/excel/solved-quot-method-saveas-of-object-workbook-failed-quot-1004/m-p/3249728

https://support.microsoft.com/en-us/topic/error-message-when-you-run-a-visual-basic-for-applications-macro-in-excel-method-saveas-of-object-worksheet-failed-376fcbb2-9941-f34d-1aba-ca602903245f

由于我的宏会在文件夹不存在时创建该文件夹,并且还会使用指定的名称保存文件,所以我只是选择使用 On Error Resume Next 跳过该错误消息宏现在按预期工作。下面是我使用的代码。

Sub Copy_Data()

Dim ThisYear As String
Dim fdObj As Object
Dim wbO As Workbook

ThisYear = Format(Date, "YYYY")

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Set fdObj = CreateObject("Scripting.FileSystemObject")

If Not fdObj.FolderExists("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear) Then
fdObj.CreateFolder ("C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear)
End If

Sheet1.UsedRange.Copy

Set wbO = Workbooks.Add
Range("A1").PasteSpecial xlPasteAll

On Error Resume Next

wbO.SaveAs Filename:="C:\Users\abcd\OneDrive - abcd\Desktop\Temp\" & ThisYear & "\Data_New_" & Format(Now(), "ddmmyyyy"), FileFormat:=51

wbO.Close

Application.DisplayAlerts = True
Application.ScreenUpdating = True

End Sub