Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从一系列文档模板生成Word文档(在Excel VBA中)_Excel_Ms Word_Documentation Generation_Vba - Fatal编程技术网

从一系列文档模板生成Word文档(在Excel VBA中)

从一系列文档模板生成Word文档(在Excel VBA中),excel,ms-word,documentation-generation,vba,Excel,Ms Word,Documentation Generation,Vba,大家好。我会尽量使这一点简单明了。:) 我有 大约40个样板word文档,其中包含一系列需要填写的字段(姓名、地址等)。这在历史上是手动完成的,但它是重复和繁琐的 用户填写了大量个人信息的工作簿 我需要 以编程方式(从Excel VBA)打开这些样板文件,编辑工作簿中不同命名范围的字段值,并将填写的模板保存到本地文件夹的方法 如果我使用VBA以编程方式编辑一组电子表格中的特定值,我会编辑所有这些电子表格,以包含一组可在自动填充过程中使用的命名范围,但我不知道Word文档中有任何“命名字段”功

大家好。我会尽量使这一点简单明了。:)

我有

  • 大约40个样板word文档,其中包含一系列需要填写的字段(姓名、地址等)。这在历史上是手动完成的,但它是重复和繁琐的
  • 用户填写了大量个人信息的工作簿
  • 我需要

    • 以编程方式(从Excel VBA)打开这些样板文件,编辑工作簿中不同命名范围的字段值,并将填写的模板保存到本地文件夹的方法
    如果我使用VBA以编程方式编辑一组电子表格中的特定值,我会编辑所有这些电子表格,以包含一组可在自动填充过程中使用的命名范围,但我不知道Word文档中有任何“命名字段”功能

    如何编辑文档并创建VBA例程,以便打开每个文档、查找可能需要填写的一组字段并替换值

    例如,工作原理如下:

    for each document in set_of_templates
        if document.FieldExists("Name") then document.Field("Name").value = strName
        if document.FieldExists("Address") then document.Field("Name").value = strAddress
        ...
    
        document.saveAs( thisWorkbook.Path & "\GeneratedDocs\ " & document.Name )
    next document
    
    我考虑过的事情:

    • 邮件合并-但这是不够的,因为它需要手动打开每个文档并将工作簿结构化为数据源,我有点希望相反。模板是数据源,工作簿正在对其进行迭代。此外,邮件合并用于使用不同数据表创建许多相同的文档。我有许多文档都使用相同的数据
    • 使用占位符文本,如“#名称#”,打开每个文档进行搜索和替换。如果没有更优雅的提议,这就是我会求助的解决方案
      • 描述了Word书签的使用

        文档中的一部分文本可以添加书签,并提供一个变量名。使用VBA,可以访问此变量,并且可以用替代内容替换文档中的内容。这是一种解决方案,用于在文档中包含诸如名称和地址之类的占位符

        此外,使用书签,可以修改文档以引用书签文本。如果一个名称在整个文档中出现多次,则可以将第一个实例作为书签,其他实例可以引用该书签。现在,当通过编程更改第一个实例时,整个文档中变量的所有其他实例也会自动更改

        现在需要做的就是更新所有文档,方法是为占位符文本添加书签,并在整个文档中使用一致的命名约定,然后遍历每个文档,如果存在书签,则替换书签:

        document.Bookmarks("myBookmark").Range.Text = "Inserted Text"
        
        在尝试每次替换之前,我可能会使用on error resume next子句解决给定文档中没有出现的变量问题


        感谢你在评论中提到书签的存在。我事先不知道他们的存在。我将把这个主题放在这个解决方案是否足够的问题上。

        你可以考虑一个基于XML的方法。< /P> Word有一个称为自定义XML数据绑定或数据绑定内容控件的功能。内容控件本质上是文档中可以包含内容的点。“数据绑定”内容控件从包含在docx zip文件中的XML文档获取其内容。XPath表达式用于表示XML的哪一位。因此,您所需要做的就是包含XML文件,剩下的工作由Word来完成

        Excel有办法以XML的形式从中获取数据,因此整个解决方案应该可以很好地工作

        MSDN上有大量关于内容控制数据绑定的信息(其中一些已经在前面的SO问题中被引用),所以我不想在这里包含它们


        但是您确实需要一种设置绑定的方法。您可以使用Content Control Toolkit,或者如果您想在Word中使用我的OpenDoPE加载项。

        我问这个问题已经很久了,我的解决方案已经经历了越来越多的改进。我必须处理各种特殊情况,例如直接来自工作簿的值、需要根据列表专门生成的部分,以及需要替换页眉和页脚

        事实证明,仅仅使用书签是不够的,因为用户可以在以后编辑文档来更改、添加和删除文档中的占位符值。解决方案实际上是使用关键字,例如:

        这只是示例文档中的一个页面,它使用了一些可能的值,这些值可以自动插入到文档中。有50多个文档具有完全不同的结构和布局,并使用不同的参数。word文档和excel电子表格共享的唯一公共知识是这些占位符值的含义。在excel中,该值存储在文档生成关键字列表中,其中包含该关键字,然后是对实际包含该值的范围的引用:

        这是所需的两种关键成分。现在有了一些聪明的代码,我所要做的就是迭代要生成的每个文档,然后迭代所有已知关键字的范围,并对每个文档中的每个关键字进行搜索和替换


        首先,我有一个包装器方法,它负责维护microsoft word的一个实例,该实例迭代所有选定要生成的文档,对文档进行编号,并执行用户界面操作(如处理错误、向用户显示文件夹等)

        ”目的:迭代并生成要生成的表单列表中的所有文档
        '通过创建用于所有生成文档的持久Word应用程序,提高了速度
        公共子代政策()
        Dim oWrd作为新单词。Appl
        
            With oDoc.Tables(5)
            For i = 0 To Data.InvoiceDictionary.Count - 1
                If i > 0 Then
                    oDoc.Tables(5).rows.Add
                End If
                 Set invoice = Data.InvoiceDictionary.Items(i)
                .Cell(i + 2, 1).Range.Text = invoice.InvoiceCCNumber
                .Cell(i + 2, 2).Range.Text = invoice.InvoiceDate
                .Cell(i + 2, 3).Range.Text = invoice.TransactionType
                .Cell(i + 2, 4).Range.Text = invoice.Description
                .Cell(i + 2, 5).Range.Text = invoice.SumOfValue
        
            Next i