2013-10-30 44 views
3

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

我见过使用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

一些东西......

  1. 在MS Word而言,一个“场”并不一定是一个表单字段。例如,自动更新日期,链接图形,页码等是所有类型的'字段'(或者至少是直到最新版本的Word)。

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

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

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

+0

谢谢!我假定'Range'是指'Result',它返回'Range'对象。 – jasongetsdown

+1

@jasongetsdown - 'Result'返回一个'String','Range'''Range'对象。由于前者更简单一些,我已经更新了答案,谢谢。 –

1

如果你想要的是使用你当前的领域,可以从OLEFormat.Object获得的价值或名称:

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

或者

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

不过,我将与克里斯同意recommendin g避免使用ActiveX控件。由于Microsoft says,有很多原因,他们不是Word形式的最佳选择,除非在特定情况下。

0

使用 “遗产” formfields和

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

是我想出了一个解决方案。

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

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