如何在VBA代码中执行“另存为”,并将当前的Excel工作簿保存为带有日期时间戳的文件名?

17

我有一个Excel工作簿,希望在表单按钮单击时保存该工作簿的副本,并使文件名为当前日期。

我一直尝试以下代码ActiveWorkbook.SaveAs("\\filePath\FormFlow To MSExcel\" & Left(Now(), 10)) 但出现了运行时错误 '1004':对象'_Workbook'的方法'SaveAs'失败。

有谁能帮助我吗?我还是Excel开发的新手。

8个回答

28

您尝试访问的路径很可能不存在。看起来您正在尝试保存到相对位置,但在该字符串中没有文件扩展名。如果您需要使用相对路径,可以从ActiveWorkbook.FullName解析路径。

编辑: 更好的语法还应该是

ActiveWorkbook.SaveAs Filename:=myFileName, FileFormat:=xlWorkbookNormal

9
感谢您的帮助!最终我用下面的代码得到了想要的结果:ActiveWorkbook.SaveCopyAs ("\\filePath\Feed Program\FormFlow To MSExcel\Archive\FeedSampleReport-" & Format(Now(), "mmddyyyy") & ".xlsm")。请注意,这是一段VBA(Visual Basic for Applications)代码,它将当前活动的工作簿另存为指定路径下的一个以当前日期命名的Excel文件。 - Analytic Lunatic
11
我非常成功地使用了你的代码,谢谢!只有一个小问题:使用 xlWorkbookNormal 文件格式保存文件会将其保存为 Excel 97-2003 工作簿。如需保存为当前的 .xlsx 工作簿,则需要使用 xlOpenXMLWorkbook。我的代码: - Karl Hoaglund
3
请使用数字代替名称(如xlWorkbookNormal),否则有时可能无法在旧版 Excel 中编译。请参阅 http://www.rondebruin.nl/win/s5/win001.htm。 - Patrick Lepelletier
1
请参考xlFileFormat枚举列表。 - danieltakeshi
使用FileFormat:=51(或FileFormat:=xlOpenXMLWorkbook)来获取.xlsx工作簿,这在处理大量数据时尤为重要。 - Jakub Holan

10
最简单的使用此功能的方法是以“录制宏”的方式开始。一旦开始录制,将文件保存到所需位置,命名为所需名称,然后设置文件类型,最可能为“Excel 启用宏的工作簿” ~ “XLSM”。
停止录制后,您可以开始检查您的代码。
我编写了下面的代码,允许您使用文件最初位于的路径保存工作簿,并将其命名为“[A1 单元格中的日期] 事件”。
Option Explicit

Sub SaveFile()

Dim fdate As Date
Dim fname As String
Dim path As String

fdate = Range("A1").Value
path = Application.ActiveWorkbook.path

If fdate > 0 Then
    fname = "Event " & fdate
    Application.ActiveWorkbook.SaveAs Filename:=path & "\" & fname, _
        FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
Else
    MsgBox "Chose a date for the event", vbOKOnly
End If

End Sub

将代码复制到新模块中,然后在单元格"A1"中写入日期,例如01-01-2016 -> 将子过程分配给按钮并运行。[注意]在此脚本工作之前,您需要创建保存文件,因为新工作簿将保存到默认的自动保存位置!


1

可能是您的默认格式与文件扩展名不匹配。您应该在文件名中指定文件格式,并确保格式与扩展名匹配:

With someWorkbook
.SaveAs "C:\someDirector\Awesome.xlsm", fileformat:=xlOpenXMLWorkbookMacroEnabled
End With

OTOH,我没有在您的.SaveAs文件名上看到扩展名。也许在以编程方式执行此操作时需要提供一个扩展名。这很有道理 - 不必从GUI界面提供扩展名很方便,但是我们程序员期望编写明确的代码。我建议添加扩展名和匹配格式。请参见this msdn page获取文件格式列表。说实话,我不认识很多描述。
xlExcel8 = 56是.xls格式
xlExcel12 = 50是.xlsb格式
xlOpenXMLWorkbook = 51是.xlsx格式
xlOpenXMLWorkbookMacroEnabled = 52是.xlsm格式
xlWorkbookDefault还列有一个值为51,这让我感到困惑,因为我认为默认格式可以更改。

@PatrickLepelletier。谢谢。恰好我当时正在使用VBA,自己就解决了这个问题。我不经常写VBA代码,下次可能还得参考我自己的答案。 - riderBill
@riderBill - 很高兴你列举了这些。我知道很多格式,但是常量的名称仍然让人感到困惑。我不知道微软是否在任何地方明确说明哪个文件格式常量对应哪个文件扩展名。 - Jon Peltier

0

我在一个文件中成功使用了以下方法,

但是又出现了完全相同的错误... 只有最后一行出现了错误。

Newpath = Mid(ThisWorkbook.FullName, 1, _
 Len(ThisWorkbook.FullName) - Len(ThisWorkbook.Name)) & "\" & "ABC - " & Format(Date, "dd-mm-yyyy") & ".xlsm"
ThisWorkbook.SaveAs (Newpath)

0
Dim NuevoLibro As Workbook
Dim NombreLibro As String
    NombreLibro = "LibroPrueba"
'---Creamos nuevo libro y lo guardamos
    Set NuevoLibro = Workbooks.Add
        With NuevoLibro
            .SaveAs Filename:=NuevaRuta & NombreLibro, FileFormat:=52
        End With
                                                    '*****************************
                                                        'valores para FileFormat
                                                        '.xlsx = 51 '(52 for Mac)
                                                        '.xlsm = 52 '(53 for Mac)
                                                        '.xlsb = 50 '(51 for Mac)
                                                        '.xls = 56 '(57 for Mac)
                                                    '*****************************

2
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase

0

我曾经苦苦挣扎,但最终下面的方法对我有用!

Dim WB As Workbook

Set WB = Workbooks.Open("\\users\path\Desktop\test.xlsx")

WB.SaveAs fileName:="\\users\path\Desktop\test.xls", _
        FileFormat:=xlExcel8, Password:="", WriteResPassword:="", _
        ReadOnlyRecommended:=False, CreateBackup:=False

0

我认为你的问题在于当你使用Now()函数时,输出将会是"6/20/2014"。这对于文件名来说是一个问题,因为它包含"/"符号。正如你所知道的,文件名中不能使用某些符号。


0

当处理需要使用.xlsx工作簿大量数据时,请使用以下语法

ActiveWorkbook.SaveAs Filename:=myFileName, FileFormat:=51

(如需更多文件格式,请参见文档。)

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