我正在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类型。
答案 0 :(得分:3)
一些事情......
在MS Word术语中,“字段”不必是表单字段。例如,自动更新日期,链接图形,页码等是所有类型的“字段”(或者至少是直到最新版本的Word)。
出于兼容性原因,最好避免使用ActiveX控件。例如,Mac版的Word不支持它们。
为了获得最佳兼容性,我个人会坚持使用传统的表单控件。实例根据其书签名称命名,可通过右键单击控件并选择“属性”来设置。在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有点像黑客,但考虑到它只是表单字段的范围,除非表单字段或字段可以有嵌套字段,它应该没问题。