设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 3444|回复: 19
打印 上一主题 下一主题

[模块/函数] 请教:do while.....Loop语句的应用问题

[复制链接]
跳转到指定楼层
1#
发表于 2012-5-11 13:20:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
备份文件目录中保存了数量不等的文件名格式为“yyyy-mm-dd hh.nn.bak"的备份文件。这段模块代码运行后如果备份文件数量大于允许数量MaxQty,则从最早日期开始删除多余的文件,并且再按照设定的备份文件保存方式删除不需要的文件。
    现在这段代码使用了file search方式,在2007中不能运行,请问各位老师:如果改成能够在07中运行的Do while......Loop 方式代码应该怎样写啊。我试了N多次都不成功,只好求教老师了,谢谢指教。
With Application.FileSearch
        .NewSearch
        .LookIn = BackupDir       'BackupDir是前面过程定义的备份文件存放目录
        .SearchSubFolders = False     
        .FileName = "*.bak"        '备份文件类型:“*。bak”
        If .Execute > 0 And MaxQty > 0 Then    'MaxQty是设定的备份文件最大允许数量   
            If .FoundFiles.Count + 1 > MaxQty Then     
                For n = 1 To (.Execute + 1 - MaxQty)  
                    Kill .FoundFiles(n)
                Next
            End If
        End If      
   
        Select Case BackupMode     'BackupMode 是保存备份文件方式,其中有三个值。
        Case conBackupModeSaveAll        '含义是保存全部文件
            .FileName = Format$(Now(), "yyyy-mm-dd hh.nn") & "*.bak"
        Case conBackupModeSaveEveryDay    '含义是每天只保存一个文件
            .FileName = Format$(Now(), "yyyy-mm-dd") & "*.bak"
        Case conBackupModeSaveEveryMonth   '含义是每月只保存一个文件
            .FileName = Format$(Date, "yyyy-mm") & "*.bak"
        End Select
        If .Execute > 0 Then      
            For n = 1 To .FoundFiles.Count
                Kill .FoundFiles(n)
            Next
        End If
   End With

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2012-5-11 13:42:20 | 只看该作者
鬼打架,Do while呢?
3#
发表于 2012-5-12 11:06:03 | 只看该作者
todaynew 发表于 2012-5-11 13:42
鬼打架,Do while呢?

他正是不清楚怎么用Do While代替For Next。。。。
不过这里是一个集合,Do While并不好写。这是因为集合随时会变,当然,利用Count=0作为条件未尝不可,但是,怎么去Kill每个Item并不好处理。不妨试试For Each:
  1. Sub test()
  2. '需引用Scripting Runtime库
  3. Dim fso As New FileSystemObject
  4. Dim fls As Files
  5. Dim fl As File
  6. Set fls = fso.GetFolder(CurrentProject.Path & "").Files
  7. For Each fl In fls
  8.     If fl.Name Like "*.bak" Then Kill CurrentProject.Path & "" & fl.Name
  9. Next
  10. End Sub
复制代码
4#
发表于 2012-5-17 00:58:23 | 只看该作者
williamwangc 发表于 2012-5-16 19:35
在这里我也想提几个问题:
1、按我原本的想法,本来想用数组的。那么如何用二维数组,并用二维数组找到创建 ...

不知道你有没有留意过我曾写过一个关于冒泡排序的帖子。二维数组可以定义为:
Array(objectFile.DateCreated,objectFile.Name)
思路是这样……嗯,有时间我再调试下。
5#
发表于 2012-5-16 11:42:21 | 只看该作者
本帖最后由 williamwangc 于 2012-5-16 11:50 编辑

这两段代码应经过修改,合二为一才是完整的。
第一段代码经过测试,我用的是word文档进行的编写测试的,但要进行修改,基本框架不变。思路经过调整后,现在的目的建立一个包含文件名和创建时间的表。
第二段代码在第一段代码的基础上,补充后面kill文件和使用do...loop的办法。只是思路未经测试,经各位朋友纠正其中的错误。
6#
发表于 2012-5-15 15:15:51 | 只看该作者
本帖最后由 ycxchen 于 2012-5-15 15:17 编辑
roych 发表于 2012-5-14 20:21
和williamwangc所说的一样,这里里面只是给出一个Do While的写法而已。
1、tbl2表是已经存在的。
2、C ...


版主,能否将此例子作为“新手进阶”中的do while.....Loop语句的应用的例子完善代码?

点评

很好啊。只是最近有些小忙,所以需要hold一hold了。  发表于 2012-5-17 00:49
7#
 楼主| 发表于 2012-5-17 23:32:36 | 只看该作者
williamwangc 朋友辛苦了,非常感谢。
8#
 楼主| 发表于 2012-5-12 22:52:18 | 只看该作者
谢谢版主赐教,我马上去试一下!
不过还有一个条件:就是目标文件夹里的*.bak文件数量+1>设定的数值MaxQty,才开始从最前面的文件kill。
怎样把这个条件加进去呢? if fl.name like.... 后面可以再用and....加一个条件吗?
等待再赐教。

9#
发表于 2012-5-12 23:05:19 | 只看该作者
本帖最后由 williamwangc 于 2012-5-12 23:11 编辑

可以尝试2007里面的filesystemobject和for each来写。roych版主已经在用for each和filesystemobject在写了。
不过有一点比较纠结,filesystemobject是2007里面新加进去的,代替filesearch的方法。可能,或者应该说2007之前的版本不能识别这个(因为我没试过在2003内应用过)。
另外,关于
  1. *.bak文件数量+1>设定的数值MaxQty,才开始从最前面的文件kill
复制代码
这个问题你也可以从filesystemobject里面file的一个创建时间的参数组成数组,min一下,删除最小一个的思路来着手。
ps.我写完这段话才仔细看了roych版主的方法,其实和我的想法差不多。不过后面那个问题用count=0真的对么?不用排列一下么?
10#
发表于 2012-5-13 02:30:45 | 只看该作者
本帖最后由 roych 于 2012-5-13 02:48 编辑
williamwangc 发表于 2012-5-12 23:05
可以尝试2007里面的filesystemobject和for each来写。roych版主已经在用for each和filesystemobject在写了。 ...


随时更新Count,对于集合而言,其实已经是一个排列了。
需要注意的是:没有任何字段的表是不能直接打开的(设计模式倒是可以),因此测试时不妨把里面的0改成1
方法1:
以下是用Do While来删除字段的代码,供参考:
  1. Sub test()
  2. '需引用DAO 3.6库。
  3. Do While CurrentDb.TableDefs("tbl2").Fields.Count > 0
  4. '语法:Fileds.Delete FieldName
  5.     CurrentDb.TableDefs("tbl2").Fields.Delete CurrentDb.TableDefs("tbl2").Fields( _
  6.         CurrentDb.TableDefs("tbl2").Fields.Count - 1).Name
  7.     CurrentDb.TableDefs("tbl2").Fields.Refresh
  8. Loop
  9. End Sub
复制代码
方法2:不使用Refresh方法,请留意更新n的方法。
  1. Sub test()
  2. n = CurrentDb.TableDefs("tbl2").Fields.Count
  3. Do While n > 0
  4.     CurrentDb.TableDefs("tbl2").Fields.Delete CurrentDb.TableDefs("tbl2").Fields(n - 1).Name
  5.     n = n - 1
  6. Loop
  7. End Sub
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-1-25 23:16 , Processed in 0.135538 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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