访问Word 2013文档中的旧表单字段值时,如下所示(获取或设置):
' get
myField = ActiveDocument.FormFields("myField").Result
' set
ActiveDocument.FormFields("myField").Result = myValue
文档奇怪地上下跳跃/滚动,并停在完全不同的位置(它似乎跳到了引用字段所在的行)。
看看这个屏幕截图或一个可以查看错误的示例文件。
我用过
Application.ScreenUpdating = False
在我的Sub
和开始时
Application.ScreenUpdating = True
在我的Sub
结束时,但不幸的是,这没有帮助。
为了抑制这种行为,我必须修改什么?
我在Word MVP网站上找到了解决方案的线索。正如您所指出的,问题是当您访问FormField
对象的属性时,焦点设置为该表单字段。即使在VBA编辑器中通过"区域设置"窗口浏览表单字段时,也可以看到这种行为。
不使用FormField
对象,而是通过Bookmark
对象访问Result
属性。
更改此项:
myField = ActiveDocument.FormFields("myField").Result
到此:
myField = ActiveDocument.Bookmarks("myField").Range.Fields(1).Result
现在,您可以访问此字段的值,而无需更改文档中的焦点。要设置字段的值,可以使用Text
属性。
ActiveDocument.Bookmarks("myField").Range.Fields(1).Result.Text = myValue
希望这能有所帮助!!:-)
如果您只需要访问Result字段,那么这是一个非常好的解决方法。遗憾的是,某些表单字段属性无法通过Bookmark集合间接访问,尤其是StatusText。我使用表单字段来构建在VBA代码中自动评分的测试,而StatusText是(据我所知)唯一允许您在每个表单字段中存储静态(非易失性)答案数据的字段。
以下是我正在使用的代码示例。以下循环测试Result字段,查看它们是否与StatusText字段中存储的答案匹配
For Each fld In oFormFields
strResult = fld.Result
strStatus = fld.StatusText
If strStatus = strResult Then
' color answer green to show that it was correct
fld.Range.Font.ColorIndex = wdBrightGreen
Else
' color answer red to show that it was wrong
fld.Range.Font.ColorIndex = wdRed
End If
Next fld
我看不出用书签引用替换表单字段引用的方法,但也许我遗漏了一些东西。