作者:iamlaosong
日常工作中可能会碰到这样的情况,就是需要批量替换一些文件的内容,如合同、产品说明、ISO认证标准化文档(质量手册、程序文件、管理手册)、项目推广方案等,先做批量替换,再进行修改,可以节省大量时间。
本工具可以实现一键完成批量替换,只需按键前将要替换的内容输入表格当中。工具用VBA实现,主要是针对ISO认证标准化文档做的,即对多个文件做同样的替换。界面如下:
功能简单,实现起来也容易。也就是读取表格内容到数组,选择要替换的文件,然后逐个替换即可。
1、文件夹替换:点击按钮选择一个文件夹,工具对文件夹下所有Word文档进行替换,替换后的文件保留在当前文件夹下新建的new文件夹下,文件名和源文件相同。
2、文件替换:点击按钮后选择一个或多个Word文档,工具对对选中的文档进行替换,替换后的文件保留在当前文件夹下新建的new文件夹下,文件名和源文件相同。
本来想用Excel VBA做的(毕竟这个我比较熟),可是Excel VBA代码写完后,打开Word文档没问题,其他代码执行没问题,就是替换功能那部分代码执行了完不成替换,而同样的代码在Word VBA中却可以实现所需的功能,不知道问题出在哪儿。
核心代码如下:
1、读取表格内容:
'读取替换内容
For k = 2 To 100
tmp = ActiveDocument.Tables(1).Cell(k, 1)
sFind(k) = Left(tmp, Len(tmp) - 2)
tmp = ActiveDocument.Tables(1).Cell(k, 2)
sRepl(k) = Left(tmp, Len(tmp) - 2)
If sFind(k) = "" Then Exit For
Next k
WordNo = k - 1
2、批量替换
If Dir(sPath & "\new", vbDirectory) = "" Then MkDir sPath & "\new"
'开始替换
For kk = 1 To FileNo
Target = sPath & "\" & myFile(kk)
Debug.Print Target
Documents.Open Target
For k = 2 To WordNo
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = sFind(k)
.Replacement.Text = sRepl(k)
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = True
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
'执行替换
.Execute Replace:=wdReplaceAll
End With
Next k
ActiveDocument.SaveAs2 FileName:=sPath & "\new\" & myFile(kk)
'ActiveDocument.Save
ActiveDocument.Close
Next kk
MsgBox "共有" & FileNo & "个文件替换完毕!"
补记:
后来发现,Excel之所以不行,是因为Excel环境下wdReplaceAll、wdFindContinue都是空值。而这些参数为空值,是因为我们没有引用Word对象,引用一下就不是空值了(如果把wdReplaceAll、wdFindContinue等常量换成其值2、1,不引用也可以),如下图:
Excel下面的关键代码如下:
'查找并替换
For k = 1 To Strno
With docApp.Selection.Find
.ClearFormatting
.Text = arrStr(k, 1)
.Replacement.Text = arrStr(k, 2)
.Forward = True
.Wrap = wdFindContinue
.MatchWildcards = False
End With
docApp.Selection.Find.Execute Replace:=wdReplaceAll
Next k
注意:docApp是Word应用对象,即:Set docApp = CreateObject("Word.Application")
====================================================
补充强调一下:工具可以用于docx类型,如果选择文件夹替换的话,会包括docx文件;如果选择文件替换的话,可以把选择类型改成所有文件(*.*)就行了。文件替换时可以按Ctrl键多选。