VBA:保存而不覆盖现有文件

Posted

技术标签:

【中文标题】VBA:保存而不覆盖现有文件【英文标题】:VBA: Saving without overwriting existing files 【发布时间】:2019-02-28 17:49:38 【问题描述】:

如何确保我的 VBA 代码在保存时不会覆盖现有文件?

示例:我将每张工作表保存为新工作簿,并希望拥有 v1、v2、v3 等。使用下面的代码,我总是覆盖现有文件,就像每个文件一样我保存的文件名相同,以“_V1”结尾...

    NewWbName = Left(wbSource.Name, InStr(wbSource.Name, ".") - 1)

For i = 1 To 9
    'check for existence of proposed filename
    If Len(Dir(wbSource.Path & Application.PathSeparator & NewWbName & "_V" & i & ".xlsx")) = 0 Then
        wbTemplate.SaveAs wbSource.Path & Application.PathSeparator & NewWbName & "_V" & i & ".xlsx"
        Exit For
    End If
Next i

If i > 9 Then
    '_V1.xlsx through _V9.xlsx already used; deal with this situation
    MsgBox "out of options"

      wbTemplate.Close False 'close template
    Next wsSource

    wbSource.Close False 'close source


End If
End Sub

【问题讨论】:

首先检查文件是否存在,例如***.com/questions/16351249/vba-check-if-file-exists SO上有很多这样的例子。如果它已经存在,那么您需要决定要做什么......例如重命名或添加数字版本等。 VBA check if file exists的可能重复 【参考方案1】:

建议对这么多版本使用日期和时间戳

“V”和格式(日期,“yyyymmdd”)和格式(时间,“hhmmss”)和“.xlsx”

是的,您可能仍想检查现有文件,但用户很少会在不到一秒的时间内提交输入

【讨论】:

【参考方案2】:

遍历各种 _Vn.xlsx 变体,直到找到不存在的变体。

dim i as long, NewWbName as string

NewWbName = Left(wbSource.Name, InStr(wbSource.Name, ".") - 1)

for i=1 to 9
    'check for existence of proposed filename
    if len(dir(wbSource.Path & Application.PathSeparator & NewWbName & "_V" & i & ".xlsx")) = 0 then
        wbTemplate.SaveAs wbSource.Path & Application.PathSeparator & NewWbName & "_V" & i & ".xlsx"
        exit for
    end if
next i

if i>9 then
    '_V1.xlsx through _V9.xlsx already used; deal with this situation
    msgbox "out of options"
end if

如果您要将循环提高到两位数,也许... & "_V" & Format(i, "00") & ".xlsx 会更好,以便按名称排序的文件夹将它们按正确的顺序排列。

【讨论】:

感谢@Jeeped,我已经用您的代码 sn-p 更新了我的代码,并添加了其中的“关闭工作簿”部分 - 但我收到一条错误消息 - “next without for”。 .. 我已经开始工作了。但我不得不删除“如果 i > 9 then..”部分。我不确定它为什么会导致这个问题。 如果你遍历所有 i(1 到 9)而没有找到要保存的版本,那么当它退出循环时 i 是 10。这意味着已经创建了所有可能的版本。我不确定是什么问题。

以上是关于VBA:保存而不覆盖现有文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 保存时显示“是不是要覆盖文件”对话框

向 tar 文件添加条目而不覆盖其现有内容

将数据添加到现有 JSON 文件而不覆盖它

在 Fortran 中写入现有文件而不覆盖

保存工作簿的 vba 脚本覆盖输入的文件名

VBA 另存为 CSV 文件被第一张表覆盖