从Word doc表单控件中获取数据

时间:2013-10-30 18:18:54

标签: vba ms-access ms-word access-vba word-vba

我正在Word .docm(启用宏的Word 2013 doc)中构建表单,目的是编写Access数据库以从已完成的表单导入数据。我已经放置了textBox和comboBox控件来接收用户输入,但我无法将数据退回。

我见过的示例使用Document.FormFields集合,如此(在Word中):

Dim fld as FormField
for each fld in ActiveDocument.FormFields
    Debug.Print fld.Name & " - " & fld.Result.Text
next

但是在我的文档中Document.FormFields是空的,但Document.Fields有19个元素,这恰好是我表单中控件的数量。这很好,除了我似乎无法使用Field对象获取任何控件的名称或值。 Field.Result.Text始终为空,且没有Field.Name属性。

那么Field个对象和FormField个对象之间的区别是什么?当我看到的所有示例都使用Fields时,为什么我的控件会出现在FormFields中?

我使用了错误的表单控件吗?有三种类型(我希望我不是唯一一个认为这很荒谬的人)遗留控件,ActiveX控件和内容控件。我正在使用ActiveX类型。

3 个答案:

答案 0 :(得分:3)

一些事情......

  1. 在MS Word术语中,“字段”不必是表单字段。例如,自动更新日期,链接图形,页码等是所有类型的“字段”(或者至少是直到最新版本的Word)。

  2. 出于兼容性原因,最好避免使用ActiveX控件。例如,Mac版的Word不支持它们。

  3. 为了获得最佳兼容性,我个人会坚持使用传统的表单控件。实例根据其书签名称命名,可通过右键单击控件并选择“属性”来设置。在VBA中,他们的数据然后通过FormFields集合获得;如果您想要特定字段的值,请使用

    Value = ActiveDocument.FormFields("MyFieldName").Result

答案 1 :(得分:1)

如果你想要的只是使用当前的字段,你可以从OLEFormat.Object中获取值或名称:

Application.ActiveDocument.Fields.Item(1).OLEFormat.Object.Value

或者

Application.ActiveDocument.Fields.Item(1).OLEFormat.Object.Name

但是,我同意Chris建议您避免使用ActiveX控件。作为Microsoft says,有很多原因使它们不是Word表单的最佳选择,除非在非常具体的情况下。

答案 2 :(得分:0)

使用"遗产" formfields和

//key
Application.ActiveDocument.FormFields(1).Range.Fields(1).Code
//value
Application.ActiveDocument.FormFields(1).Result

我想出的解决方案。

我见过公司也会出于不同的目的使用书签,默认值,状态/帮助文本。不是我会推荐它,但也许他们正在解决一个我不知道的问题。

我觉得.range有点像黑客,但考虑到它只是表单字段的范围,除非表单字段或字段可以有嵌套字段,它应该没问题。