5

我正在 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了我的控件?FieldsFormFields

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

4

3 回答 3

3

一些东西...

  1. 在 MS Word 术语中,“字段”不一定是表单字段。例如,自动更新的日期、链接的图形、页码等都是“字段”类型(或者至少在 Word 的最新版本之前是这样的)。

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

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

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

于 2013-10-30T19:43:35.903 回答
1

如果您只想使用您拥有的当前字段,您可以从 OLEFormat.Object 获取值或名称:

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

或者

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

但是,我同意 Chris 的建议,即避免使用 ActiveX 控件。正如微软所说,有很多原因表明它们不是 Word 表单的最佳选择,除非在非常特殊的情况下。

于 2013-10-30T19:58:14.430 回答
0

使用“旧版”表单域和

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

是我想出的解决方案。

我已经看到公司将书签、默认值、状态/帮助文本也用于不同的目的。并不是我会推荐它,但也许他们正在解决我不知道的问题。

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

于 2017-04-05T08:02:36.877 回答