【问题标题】:How do I write Microsoft Word Content Control field data to a text file using VBA?如何使用 VBA 将 Microsoft Word 内容控制字段数据写入文本文件?
【发布时间】:2020-09-07 09:30:04
【问题描述】:

我有一个看似微不足道的 VBA 任务。但是,我通常不使用 VBA,而且几乎从不在 Microsoft Word 的上下文中使用。我有一个利用内容控制字段(以及一些 ActiveX 单选按钮)的 Word 表单,需要通过将时间戳和完整的表单条目打印到逗号分隔文件来对其进行测试。当我运行以下代码时:

Sub WriteToText()
Dim DataFile As String
Dim StrData As String
Dim CCtrl As ContentControl
Dim bControl_Exists As Boolean

DataFile = "C:\Users\Annabanana\Documents\Data.txt"
StrData = "": Open DataFile For Append As #1
StrData = Format(Now, "DD-MMM-YYYY hh:mm:ss")

With Application.ActiveDocument
    bControl_Exists = .Saved
    For Each CCtrl In ThisDocument.ContentControls
        With CCtrl
            Select Case .Type
                Case Is = wdContentControlCheckBox
                    StrData = StrData & "," & .Checked
                Case wdContentControlDate, wdContentControlDropdownList, wdContentControlComboBox, wdContentControlText
                    StrData = StrData & "," & .Range.Text
                Case Else
            End Select
        End With
    Next
End With
Print #1, StrData: Close #1
End Sub

我得到了日期戳,但没有别的。理想情况下,我希望最终打印字段标签及其相应的值:

标签 1 值 1 标签 2 值 2 标签 3 值 3 ......

最终所有这些都会打印到数据库中,但此时我只想能够看到数据是如何从表单中出来的,以及在加载之前我需要如何对其进行转换。任何意见是极大的赞赏。谢谢。

【问题讨论】:

    标签: vba ms-word word-contentcontrol


    【解决方案1】:

    从本质上讲,您的问题归结为滥用 ThisDocument。试试:

    Sub GetCCtrlData()
    Dim CCtrl As ContentControl, StrData As String, DataFile As String
    StrData = Format(Now, "DD-MMM-YYYY hh:mm:ss")
    DataFile = "C:\Users\" & Environ("UserName") & "\Documents\Data.txt"
    For Each CCtrl In ActiveDocument.ContentControls
      With CCtrl
        StrData = StrData & vbTab & .Title & "|" & .Tag & ": "
        Select Case .Type
          Case Is = wdContentControlCheckBox
            StrData = StrData & .Checked
          Case wdContentControlDate, wdContentControlDropdownList, wdContentControlRichText, wdContentControlText
            StrData = StrData & .Range.Text
          Case Else
        End Select
      End With
    Next
    Open DataFile For Append As #1: Print #1, StrData: Close #1
    End Sub
    

    上面的代码还导出了内容控件的标题和标签,使用制表符分隔符而不是逗号。使用制表符分隔符允许数据中可能存在逗号。

    我想,在某个阶段,您会想要处理多个文档。为此,请参阅:http://www.vbaexpress.com/forum/showthread.php?40406-Extracting-Word-form-Data-and-exporting-to-Excel-spreadsheet&p=257696&viewfull=1#post257696。虽然那里的代码将数据提取到 Excel 工作簿,但基本原理是相同的。

    【讨论】:

    • 谢谢@macropod。我明天去测试。根据您的声誉,我确信它会起作用。实际上,它不会用于批量数据上传,而是用于嵌入 Word 表单本身并由用户触发的“提交”按钮。
    • «对于嵌入在 Word 表单本身并由用户触发的“提交”按钮» 请非常小心。从文档驱动的任何内容都需要防止同一文档的数据被多次输出 - 或者确保之前的数据被删除的方法。
    • 是的,我已经有一个要合并的脚本,它可以检查数据库中是否已经存在唯一 ID。谢谢你,@macropod。
    • 这很好用。谢谢@macropod。我只需要为单选按钮添加一个循环。
    猜你喜欢
    • 2020-11-19
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 2010-09-29
    • 2017-12-27
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多