当前位置:编程学习 > VB >>

求助,废寝忘食想让这段依次打开DOC的代码完美

编写了一段vba宏代码,实现的功能是,在word软件中,依次打开某文件夹中的所有doc文件,读取数据操作后,关闭并删除该doc文件(运行环境是word2000)。

 myFolder = "C:\Users\dell\Desktop\副本"
        With Application.FileSearch
            .NewSearch
            .FileType = msoFileTypeWordDocuments
            .LookIn = myFolder
            .Execute
            TotalFiles = .FoundFiles.Count
            '开始逐个DOC校验
            For i = 1 To TotalFiles
                MyName = .FoundFiles(i)
                '打开DOC
                Set mydoc = Documents.Open(MyName, Visible:=True)
                '规范DOC格式
                With mydoc
                    .TrackRevisions = False
                    .PrintRevisions = False
                    .ShowRevisions = False
                    .AcceptAllRevisions
                End With
...
mydoc.Close (False)
                Set mydoc = Nothing
                Kill (MyName) '删除这个文件
            Next i
        End With
 MsgBox "已全部完成!" 



但实际运行中,有些不完美,具体表现在:宏在打开doc文件时,屏幕会依次看到doc文件打开关闭,屏幕全闪,进度条无法显示。程序执行速度约为0.7秒/个文件。

   随后修改代码如下后,屏幕看不到这些doc文件,但word软件工具条随着文件打开关闭还在闪,进度条仍然无法显示。程序执行速度约为0.3秒/个文件,但此刻,文件也不能被删除了。

    myFolder = "C:\Users\dell\Desktop\副本"
        
        With Application.FileSearch
            .NewSearch
            .FileType = msoFileTypeWordDocuments
            .LookIn = myFolder
            .Execute
            TotalFiles = .FoundFiles.Count
            '开始逐个DOC校验
            For i = 1 To TotalFiles
                MyName = .FoundFiles(i)
                '打开DOC
                Set mydoc = Documents.Open(MyName, Visible:=False)‘对比上面,将此处visible修改为false
                '规范DOC格式
                With mydoc
                    .TrackRevisions = False
                    .PrintRevisions = False
                    .ShowRevisions = False
                    .AcceptAllRevisions
                End With
...
                Documents(MyName).Close (False)
                Set mydoc = Nothing
                'Kill (MyName) '‘对比上面,此处需要将kill注释掉,因为已经无法删除该文件
            Next i
        End With
 MsgBox "已全部完成!" 

3.再次修改代码,屏幕不闪现doc文件,进度条也能正常显示,但是速度巨慢,程序执行速度约为13秒/个文件。
    myFolder = "C:\Users\dell\Desktop\副本"
        
        With Application.FileSearch
            .NewSearch
            .FileType = msoFileTypeWordDocuments
            .LookIn = myFolder
            .Execute
            TotalFiles = .FoundFiles.Count
            '开始逐个DOC校验
            For i = 1 To TotalFiles
                MyName = .FoundFiles(i)
                '打开DOC
set docapp=createobject("Word.application")
docapp.documents.open myname
                Set mydoc =docapp.documents(Myname)
                '规范DOC格式
                With mydoc
                    .TrackRevisions = False
                    .PrintRevisions = False
                    .ShowRevisions = False
                    .AcceptAllRevisions
                End With
...
               mydoc.Close (False)
               Set docApp=nothing
Set mydoc = Nothing
                Kill (MyName) ‘对比上面,此处删除该文件可以了。
            Next i
        End With
 MsgBox "已全部完成!" 


求高手提供完美解决的代码,屏幕既不闪,进度条也能正常显示,速度也能快(最好是0.3秒/个),小弟提前谢过。
引用楼主 mrmake 的回复:
编写了一段vba宏代码,实现的功能是,在word软件中,依次打开某文件夹中的所有doc文件,读取数据操作后,关闭并删除该doc文件(运行环境是word2000)。

 myFolder = "C:\Users\dell\Desktop\副本"
        With Application.FileSearch
            .NewSearch
            .F……
你还是用方法二吧,处理一个记录一个(可以写到文件中),等到所有处理完成后再删除。按道理关闭后可以删除的,不知道还有什么东西在残留着,你如果可以的话你还是用vb写个程序处理吧。这个比方法1快是因为不需要显示到前台,所以不需要应对处理来自系统的很多消息也不用画界面什么的。之前做过批量处理ppt文档时我也发现的。

方法3的话每次都要创建一个新进程,肯定慢了。
引用 2 楼 sysdzw 的回复:
引用楼主 mrmake 的回复:
编写了一段vba宏代码,实现的功能是,在word软件中,依次打开某文件夹中的所有doc文件,读取数据操作后,关闭并删除该doc文件(运行环境是word2000)。

myFolder = "C:\Users\dell\Desktop\副本"
With Application.FileSearch
.NewSearch
.F……
你还是用方法二吧,处……
方法二中的Kill (MyName)改为下面代码试试:
if i>1 then
  if dir(.FoundFiles(i-1))<>"" then
    kill .FoundFiles(i-1)
  end if
end if

表示每次都删除前一个文件。
Application.ScreenUpdating = False '关闭屏幕刷新'

'大量的操作'

Application.ScreenUpdating = True '恢复屏幕刷新'
Application.ScreenUpdating 控制不了word状态栏 他控制的是文档窗口 删除?DANGER! 进度条也能正常显示
这是什么意思 哪里的进度条 便历目录下的DOC文件,然后一一处理就是 想要完美解决的话,先不说进度条的事,没看懂
循环开始前创建一个隐藏word进程wdApp,所有的操作都在wdApp进程内进行就可以了,文档打开时不显示 关闭文档后删除  Application.FileSearch用起来浪费了 这个最合适的场合是 搜索文件内的文字
单纯搜索word文档大材小用了,直接dir遍历就行了 如果你是追求速度极致者 不妨换掉Application.FileSearch
引用 3 楼 sysdzw 的回复:
引用 2 楼 sysdzw 的回复:

引用楼主 mrmake 的回复:
编写了一段vba宏代码,实现的功能是,在word软件中,依次打开某文件夹中的所有doc文件,读取数据操作后,关闭并删除该doc文件(运行环境是word2000)。

myFolder = "C:\Users\dell\Desktop\副本"
With Application.FileSearch
.NewSea……


恩,一个很好的思路。刚才试验了一下,在word2000环境下,这个语句还是不行,但是,如果到word2003,就没任何问题。我们公司的环境是office2000,所以,现在就先不用这个删除了。

另外,又看了一下word2000和word2003执行的时候,word2000貌似打开的单个文件都不关闭,最后关闭这个模板时全部关闭,而word2003是随时关闭的。
引用 9 楼 andy95800 的回复:
想要完美解决的话,先不说进度条的事,没看懂
循环开始前创建一个隐藏word进程wdApp,所有的操作都在wdApp进程内进行就可以了,文档打开时不显示 关闭文档后删除


这个方法,我试验过,速度我觉得接受不了,大抵是创建一个新的进程占用时间吧。方法三就是用这个机理。
引用 5 楼 andy95800 的回复:
Application.ScreenUpdating 控制不了word状态栏 他控制的是文档窗口


是,现在状态栏还在闪。
不过,进度条的问题解决了,在循环中加了一个doevents,就可以正常显示了。原来只是一个白框。 是在循环开始前 创建一个word进程 只创建一次 你的方法三是每个循环期间都打开一个进程 当然慢了
引用 12 楼 mrmake 的回复:
引用 9 楼 andy95800 的回复:
想要完美解决的话,先不说进度条的事,没看懂
循环开始前创建一个隐藏word进程wdApp,所有的操作都在wdApp进程内进行就可以了,文档打开时不显示 关闭文档后删除


这个方法,我试验过,速度我觉得接受不了,大抵是创建一个新的进程占用时间吧。方法三就是用这个机理。
他的是意思是你本身的vba代码所在的宿主就需要一个word进程,然后再创建一个word进程专门用于载入一个个doc然后close。
跟我在2楼提的相似,如果你用vb的话可以将这些代码移植到vb里,然后创建一个word进程,循环读进一个个doc,然后一个个close,这样应该可以删除。 这个问题 ,我要用到 ,占个位 ,拿去调试一下
引用 10 楼 andy95800 的回复:
Application.FileSearch用起来浪费了 这个最合适的场合是 搜索文件内的文字
单纯搜索word文档大材小用了,直接dir遍历就行了 如果你是追求速度极致者 不妨换掉Application.FileSearch


这个方式我很感兴趣,我来试试看,看看速度能提高多少,测试完汇报,呵呵
引用 17 楼 mrmake 的回复:
引用 10 楼 andy95800 的回复:
Application.FileSearch用起来浪费了 这个最合适的场合是 搜索文件内的文字
单纯搜索word文档大材小用了,直接dir遍历就行了 如果你是追求速度极致者 不妨换掉Application.FileSearch


这个方式我很感兴趣,我来试试看,看看速度能提高多少,测试完汇报,呵呵
那个只是在遍历每个文件,耗不了多少时间的。 用过word的文件搜索功能,你才会知道他有多慢
引用 13 楼 mrmake 的回复:
是,现在状态栏还在闪。

Set mydoc = Documents.Open(FileName:=MyName, Visible:=False)
引用 20 楼 tiger_zhao 的回复:
引用 13 楼 mrmake 的回复:是,现在状态栏还在闪。

VB code
Set mydoc = Documents.Open(FileName:=MyName, Visible:=False)


抱歉,没说清楚,是工具栏还在闪。

用这段话后,还是在闪的。 我这里不闪的。WinXP, Office 2003。
是你的文档中有自定义工具条吧? 不可能不闪 不知道你咋测试的 你运行宏的时候看得到word状态栏么
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
    
'大量的操作'

Application.DisplayStatusBar = True
Application.ScreenUpdating = True
引用 25 楼 tiger_zhao 的回复:
VB code
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
    
'大量的操作'

Application.DisplayStatusBar = True
Application.ScreenUpdating = True


用此方法不行,工具条仍然在闪。 不要在本实例中打开,而是使用VBA重新创建一个不可见的实例打开并操作DOC,比如
    Dim wdApp As New Application
    Dim wdDoc As Document
    
    wdApp.Visible = False
    Set wdDoc = wdApp.Documents.Open(FileName)
    ...
    wdApp.Documents.Close
    wdApp.Quit False
引用 26 楼 mrmake 的回复:
用此方法不行,工具条仍然在闪。

不闪。
你可以用完全空白的文档进行测试。
记得关掉加载项、工具条等。
补充:VB ,  VBA
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,