vba - 保存现有 Excel 工作簿的副本而不覆盖它

标签 vba excel fso

我正在尝试将 Excel 工作簿从文件夹 X 复制到文件夹 Y,并且如果文件夹 Y 中已经存在该名称的文件,则该文件不会被覆盖,而是新文件的后缀为“-复制” , '- Copy (2)' 等 - 本质上是重新创建用于在文件夹中复制和粘贴相同文件的手动过程。

我原以为会有一个功能可以让你这样做,但到目前为止我没有尝试过似乎符合确切要求:

  • Workbook.SaveAs提示用户是否应替换文件的消息
  • Workbook.SaveCopyAs只是在没有提示的情况下覆盖文件
  • FileSystemObject.CopyFile方法有一个 'overwrite' 参数,但是如果设置为 false 并且文件已经存在,这只是错误,这是根据 Microsoft website 的预期行为

  • 创建一个根据所选文件夹(.xls (1)、.xls (2) 等)中现有文件的数量递增的计数器并不难,但我希望可能有比这更直接的方法这个。

    最佳答案

    该功能对我有用,但经过两个步骤。

    步骤1 :

    进入 VBE 的菜单(工具 -> 引用),然后在“Microsoft Scripting Run-time”旁边打勾。

    第2步 :

    编辑代码,
    因为它是 :

    If FileExists(strFilePath) = True Then
       'Set fl = FSO.GetFile(strFilePath)
       strNewFileName = strFilePathNoFileName & strFileNameNoExt & " (" & intCounter & ")." & strExtension
       Do
           blnNotFound = FileExists(strNewFileName)
           If blnNotFound Then intCounter = intCounter + 1
       Loop Until Not blnNotFound
    Else
         strNewFileName = strFilePath
    End If
    

    我猜你必须在循环中插入一行来更新新文件名,以便检查是否存在。
    所以新的代码应该是:
       Do
           blnNotFound = FileExists(strNewFileName)
           If blnNotFound Then intCounter = intCounter + 1
           ' HERE :
           strNewFileName = fl.ParentFolder & "\" & strFileNameNoExt & " (" & intCounter & ")." & strExtension
    
       Loop Until Not blnNotFound
    

    干得好,谢谢。

    关于vba - 保存现有 Excel 工作簿的副本而不覆盖它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40585931/

    相关文章:

    excel - 在列中显示行值

    file-io - 使用 MoveFile 方法覆盖 vbscript 中目标中的文件的问题?

    file-io - FSO 删除文件/移动文件权限错误

    mysql - RecordSet 上的 GetRows 不会存储 Access DB 中的文本列

    excel - 打开具有完整网络名称的文件会更改工作表名称

    excel - 在 Excel 中去除前导/尾随空格和逗号

    excel - 无法获取 WorksheetFunction 类错误的匹配属性

    VBA 将行高与粘贴图像大小相匹配

    excel - VBA Excel - 在动态寻址的用户窗体上更新控件

    vbscript - 我可以使用 FileSystemObject 使用其索引从文件夹中获取单个文件吗?