将数据从Excel导出到Word:数据目标/占位符

时间:2018-04-18 15:14:06

标签: excel vba ms-word

在Excel中,我有一个userform,它使用RowSource = myTable从Excel表中填充ListBox。

现在我想选择一行,按一个按钮,然后将所选行中的每一列导出到Word文档的不同位置,这是一个带有预先格式化文本的模板。 Column1应该将place1,column2转到place2,无论我想要什么......

Word中有哪些数据目标/占位符可用于插入数据?

1 个答案:

答案 0 :(得分:0)

Word有多种可能性让开发人员编写将在文档中显示的数据。使用哪个取决于开发人员的个人要求。

  1. 传统上,最常使用书签Bookmark对象提供Range属性,以便可以格式化或以其他方式操纵插入的内容。书签可以在文档的其他位置引用作为交叉引用或多次重复信息。
  2. 要写入书签的VBA代码

     ActiveDocument.Bookmarks("BookmarkName").Range.Text = "Data as string"
    

    使用内容书写书签会删除书签。如果书签应该保留

    Dim sBookmarkName as String
    Dim rngBookmark as Word.Range
    Dim doc as Word.Document
    Dim bkm as Word.Bookmark
    sBookmarkName = "BookmarkName"
    Set doc = ActiveDocument
    If doc.Bookmarks.Exists(sBookmarkName) Then
      Set bkm = doc.Bookmarks(sBookmarkName)
      Set rng = bkm.Range
      rng.Text = "Data as string"
      doc.Bookmarks.Add(sBookmarkName, rngBookmark)
    End If
    
    1. 可以使用Document.VariableCustomDocumentProperty字段将文字内容写入DocVariableDocProperty个对象,并将内容反映在文档表面上。这具有内容与文档一起旅行的优点,无论用户是否编辑表面上显示的内容。格式化内容存在问题。
    2. 要写入文档变量和自定义文档属性:

      ActiveDocument.Variables("VariableName") = "Data as string"
      'See the language reference for more about values for Type
      ActiveDocument.CustomDocumentProperties.Add Name:="PropertyName", _
                                                  LinkToContent:=False,  _
                                                  Type:=msoPropertyTypeString, _
                                                  Value:="Data as string"
      
      1. 从Word 2007开始,Microsoft建议将内容控件作为数据占位符。以编程方式处理它们类似于使用书签。主要区别:
        • 内容控件的标题或标签可以在文档中多次使用
        • 写入内容控件不需要(但可以)删除内容控件(写入书签会删除书签,但如果将来需要引用或写入数据,则可以重新创建书签)
        • 内容控件可以链接到文档中的自定义XML部件
        • 可以通过Office Open XML文件格式从已关闭的 Word文档中更轻松地提取写入内容控件的数据。 (如果内容控件链接到自定义XML部件,则更容易)
        • 推论:还可以将数据直接写入链接到文档中内容控件的自定义XML部件。如果应将数据写入已关闭的文件,这一点尤其有用。
      2. 由于内容控件可以具有相同的标题或标记,因此对象模型会返回这些属性的数组。 Word还为每个内容控件分配一个唯一ID(GUID) - 如果GUID已知,则可以直接寻址内容控件。

        Dim doc as Word.Document
        Dim sCC_ID as String
        Dim sCC_Title as String
        Dim sCC_Tag as String
        
        Set doc = ActiveDocument
        'ID value is passed as a string
        doc.ContentControls("1691881769").Range.Text = "Data as String"
        
        'Get the first content control with the given title
        sCC_Title = "Content Control Title"
        doc.ContentControls.SelectContentControlByTitle(sCC_Title).Item(1).Range.Text = "Data as String"
        
        'Loop all content controls having the same tag
        Dim aCC as Word.ContentControls
        Dim cc as Word.ContentControl
        
        sCC_Tag = "Content Control Tag"
        Set aCC = doc.SelectContentControlsByTag("Content Control Tag")
        For Each cc In aCC
            cc.Range.Text = "Data as string"
        Next
        
        1. 可以将数据写入合并字段,但这并非如何使用合并字段。当想法是用户可以“容易地”设置文档时,最常使用这种方法。编写代码以定位合并字段比使用其他类型的占位符更复杂。
        2. 以下代码段演示了如何循环文档中未链接到邮件合并数据源的所有字段,搜索合并字段并将其替换为数据

          Dim fld As Word.Field
          Dim fldRange As Word.Range
          Dim sFldCode As String, sDataField As String, sDataContent
          
          sDataField = "MergefieldName"
          sDataContent = "Data as string"
          For Each fld In ActiveDocument.Fields
              sFldCode = fld.code
              Select Case InStr(sFldCode, sDataField)
                  Case Is > 0
                    Set fldRange = fld.result
                    fld.Delete
                    fldRange = sDataContent
              End Select
          Next
          
          1. 查找/替换也是一种选择。通常,某种特殊字符会分隔“占位符”的开头和结尾。代码搜索这些字符,读取占位符并在“找到”位置插入数据。
          2. 简单搜索代码:

            Dim wdDoc As Word.Document
            Dim sPlaceholder as String, sData as String
            
            sData = "Data as string"
            sPlaceholder = "DataFieldName"
            Set wdDoc = ActiveDocument
            
            With wdDoc.content.Find
                .ClearFormatting
                .Text = "<<" & sPlaceholder & ">>"
                With .Replacement
                    .ClearFormatting
                    .Text = sData
                End With
                .Execute Replace:=wdReplaceAll
            End With