ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 905|回复: 6

请高手帮忙解析一个关于备份的代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-9-30 10:27 | 显示全部楼层 |阅读模式

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

    Application.ScreenUpdating = False
    Dim LastBackUpDate As Date, TheBackUpDir As String, filename As String, i%
    Dim f As Object, gfile_name As String, gfile As Object
    Dim Fso As Object
    With ActiveWorkbook
            .Sheets.Copy
            .Save
    End With '先存盘,再备份
    Set Fso = CreateObject("Scripting.FileSystemObject")
    filename = Left((ThisWorkbook.Name), InStr(1, ThisWorkbook.Name, ".") - 1)
    TheBackUpDir = "D:\备份"
    'On Error Resume Next
    If Len(Dir(TheBackUpDir, vbDirectory)) = 0 Then
        MkDir TheBackUpDir '如果没有备份文件夹,则新建
    Else: Set f = Fso.GetFolder(TheBackUpDir) '如果已经存在,则遍历备份文件夹
    For Each gfile In f.Files
        gfile_name = Left((Fso.getbasename(gfile)), 5) '提取文件名的主要字符串
        LastBackUpDate = f.DateLastModified '提取文件的修改时间
        If gfile.fileExists(TheBackUpDir) = False Or ((gfile_name Like filename) And (Date - LastBackUpDate > 6)) Then
         '如果文件不存在,或者文件已经存在并且存在时间已经超过6天,则进行备份
            With ThisWorkbook
            .SaveAs filename:=TheBackUpDir & "\" & filename & "_" & Format(Date, "yyyymmdd")
            End With
        End If
    Next
    End If
    Application.ScreenUpdating = True
End Sub

目前的问题:
1.点击存盘后,就会跳出新的表单"book1.xlsx",一点又会跳出"book2.xlsx",不知是什么原因?
2.运行到For Each gfile In f.Files,就会直接跳到End Sub,不知是不是架构有问题?


本人是新手,一直在努力学习中,问题提得会比较呆萌,
还请各位高手帮忙指点,万分感谢!

日常记录表.rar

61.89 KB, 下载次数: 4

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-30 12:07 | 显示全部楼层
国庆节大家是不是已经休息了啊?
还有高手能帮忙吗?

TA的精华主题

TA的得分主题

发表于 2015-9-30 12:17 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-30 12:20 | 显示全部楼层
t13564865256 发表于 2015-9-30 12:17
这个方法被递归调用了。

小灰兔,您能告诉我该怎么改吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-2 09:06 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-2 10:19 | 显示全部楼层
通过自己的分析,发现存在以下问题:
(1) BeforeSave中不能再Save,这将引起递归,造成反复打开,即引起第1条问题的原因;
(2)遍历中的关系存在问题,目前正在调试,
(3)程序最后忘了重置Fso=Nothing.

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-10-2 12:55 | 显示全部楼层
作了些调整,目前可以运行了!

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Application.ScreenUpdating = False
    Dim LastBackUpDate As Date, TheBackUpDir As String, filename_bu As String, i%, file_name As String
    Dim f As Object, gfile_name As String, gfile As Object
    Dim Fso As Object
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Filename = Left((ThisWorkbook.Name), InStr(1, ThisWorkbook.Name, ".") - 1)
    TheBackUpDir = "D:\备份"
    'On Error Resume Next
    If Len(Dir(TheBackUpDir, vbDirectory)) = 0 Then
        MkDir TheBackUpDir '如果没有备份文件夹,则新建
    Else 'Set f = Fso.GetFolder(TheBackUpDir) '如果已经存在,则遍历备份文件夹
        filename_bu = TheBackUpDir & "\" & Filename & ".xls" 'Format(Date, "yyyymmdd") & ".xls"
        If Not Fso.FileExists(filename_bu) Or Date - Fso.GetFile(filename_bu).DateLastModified > 6 Then
             Kill filename_bu
             With ThisWorkbook
            .SaveAs filename_bu
         '如果文件不存在,或者文件已经存在并且存在时间已经超过6天,则进行备份
            End With
        End If
        'MsgBox Fso.GetFile(filename_bu).DateLastModified
    End If
    Application.ScreenUpdating = True
        Set Fso=Nothing
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2025-1-12 18:08 , Processed in 0.023019 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表