这个问题的答案指出,为了避免错误,您需要添加对的引用MS Scripting Run-time
。
我已经使用此方法在我的代码中删除了一个文件,但是因为我知道它将在多台不包含该引用的计算机上使用,所以我认为我有两个选择:
- 使用不同的方法删除现有文件。
- 找出在打开文件时加载参考文件的方法。
该子按钮与工作表上的 ActiveX 按钮绑定
Sub Createbackupfile()
Dim strCurrentName As String
Dim strCurrentPathAndName As String
Dim strCurrentPath As String
Dim strPreviousFilename As String
strCurrentName = ThisWorkbook.Name
strCurrentPathAndName = ThisWorkbook.FullName
strCurrentPath = Replace(strCurrentPathAndName, strCurrentName, "")
NewPath = "OldForecasts\"
With ThisWorkbook
.SaveAs Filename:=strCurrentPath & StrNewPath & strCurrentName, FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
End With
With New FileSystemObject
If .FileExists(CurrentPathAndName) Then
.deleteFile CurrentPathAndName
End If
End With
End Sub
问题
使用New FileSytemObject
有几件事要提一下:
(1)一件小事:您可以使用
ThisWorkbook.Path
(请注意,这不包含尾随的反斜杠) 访问工作簿的文件夹。因此使用 strCurrentPath = ThisWorkbook.Path(2)您将子文件夹名称赋值给名为 的变量,
NewPath
但后来您访问了strNewPath
。CurrentPathAndName
vs也存在同样的问题strCurrentPathAndName
。 始终使用 可以避免此类错误Option Explicit
。此外,除非您计划在代码中使用不同的子文件夹作为备份文件夹,否则将新路径声明为常量,而不是变量:
(3)正如评论中所提到的,VBA 中有一些用于文件处理的命令(相当旧):
kill
删除文件Dir
以检查文件或文件夹是否存在。要检查文件夹,您需要将其vbDirectory
作为第二个参数添加到Dir
-command。MkDir
创建文件夹。代码可能如下所示:
请注意,如果此代码也需要在 Mac 上运行,则需要将反斜杠替换为斜杠 - 或者使用
Application.PathSeparator
:(据我所知,这些命令本身可以在 Mac 上运行,但我无法检查这一点,因为我没有 Mac 可以测试。)
(4) Scripting
FileSystemObject
Runtime 是访问文件和文件夹信息的另一种方式。它比旧命令有一些优势(例如,您可以递归遍历文件夹和子文件夹)并提供附加命令。所有Windows 计算机上都有脚本运行时(但 Mac 上没有)。添加对项目的引用只是告诉 VBA 编译器您想要使用它(这称为早期绑定)。优点是编译器可以在编译时为您检查语法,并且在键入代码时您可以获得智能感知的支持。
但是,通过使用 ,您可以完美地摆脱早期绑定
CreateObject
。这称为后期绑定。编译器对所创建的对象一无所知,如果您访问任何属性或方法,VBA 运行时将查看执行时间(如果存在)。示例:VBA 编辑器可以为您提供智能感知,并且编译器会检查方法
FileExists
和是否DeleteFile
存在。如果您输入了拼写错误(例如,您输入了FileExist
),编译器可以在代码运行之前向您发出警告。现在编译器对所创建的对象一无所知,当使用无效的方法名称时,您将收到运行时错误。
这两个版本都可以在存在库的任何计算机上运行,而无法在不存在库的任何计算机上运行。但是,当库不存在并且您使用早期绑定时,代码将无法编译,并且您无法使用任何代码。使用后期绑定,您可以使用项目的任何其他代码。
将包含代码的工作簿移动到特定子文件夹
简单呼叫
工具
方法