作者:iamlaosong

日常工作中可能会碰到这样的情况,就是需要批量替换一些文件的内容,如合同、产品说明、ISO认证标准化文档(质量手册、程序文件、管理手册)、项目推广方案等,先做批量替换,再进行修改,可以节省大量时间。

本工具可以实现一键完成批量替换,只需按键前将要替换的内容输入表格当中。工具用VBA实现,主要是针对ISO认证标准化文档做的,即对多个文件做同样的替换。界面如下:

portainer中批量替换容器 如何实现批量替换_portainer中批量替换容器

功能简单,实现起来也容易。也就是读取表格内容到数组,选择要替换的文件,然后逐个替换即可。

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,不引用也可以),如下图:

portainer中批量替换容器 如何实现批量替换_Word_02

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键多选。