求助,废寝忘食想让这段依次打开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秒/个),小弟提前谢过。
你还是用方法二吧,处理一个记录一个(可以写到文件中),等到所有处理完成后再删除。按道理关闭后可以删除的,不知道还有什么东西在残留着,你如果可以的话你还是用vb写个程序处理吧。这个比方法1快是因为不需要显示到前台,所以不需要应对处理来自系统的很多消息也不用画界面什么的。之前做过批量处理ppt文档时我也发现的。
方法3的话每次都要创建一个新进程,肯定慢了。 方法二中的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 控制不了word状态栏 他控制的是文档窗口 删除?DANGER! 进度条也能正常显示
'大量的操作'
Application.ScreenUpdating = True '恢复屏幕刷新'
这是什么意思 哪里的进度条 便历目录下的DOC文件,然后一一处理就是 想要完美解决的话,先不说进度条的事,没看懂
循环开始前创建一个隐藏word进程wdApp,所有的操作都在wdApp进程内进行就可以了,文档打开时不显示 关闭文档后删除 Application.FileSearch用起来浪费了 这个最合适的场合是 搜索文件内的文字
单纯搜索word文档大材小用了,直接dir遍历就行了 如果你是追求速度极致者 不妨换掉Application.FileSearch
恩,一个很好的思路。刚才试验了一下,在word2000环境下,这个语句还是不行,但是,如果到word2003,就没任何问题。我们公司的环境是office2000,所以,现在就先不用这个删除了。
另外,又看了一下word2000和word2003执行的时候,word2000貌似打开的单个文件都不关闭,最后关闭这个模板时全部关闭,而word2003是随时关闭的。
这个方法,我试验过,速度我觉得接受不了,大抵是创建一个新的进程占用时间吧。方法三就是用这个机理。
是,现在状态栏还在闪。
不过,进度条的问题解决了,在循环中加了一个doevents,就可以正常显示了。原来只是一个白框。 是在循环开始前 创建一个word进程 只创建一次 你的方法三是每个循环期间都打开一个进程 当然慢了 他的是意思是你本身的vba代码所在的宿主就需要一个word进程,然后再创建一个word进程专门用于载入一个个doc然后close。
跟我在2楼提的相似,如果你用vb的话可以将这些代码移植到vb里,然后创建一个word进程,循环读进一个个doc,然后一个个close,这样应该可以删除。 这个问题 ,我要用到 ,占个位 ,拿去调试一下
这个方式我很感兴趣,我来试试看,看看速度能提高多少,测试完汇报,呵呵 那个只是在遍历每个文件,耗不了多少时间的。 用过word的文件搜索功能,你才会知道他有多慢
Set mydoc = Documents.Open(FileName:=MyName, Visible:=False)
抱歉,没说清楚,是工具栏还在闪。
用这段话后,还是在闪的。 我这里不闪的。WinXP, Office 2003。
是你的文档中有自定义工具条吧? 不可能不闪 不知道你咋测试的 你运行宏的时候看得到word状态栏么
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
不闪。
你可以用完全空白的文档进行测试。
记得关掉加载项、工具条等。
补充:VB , VBA