禁止在Word 2013 VBA脚本上进行不必要的跳转/滚动



访问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 

我看不出用书签引用替换表单字段引用的方法,但也许我遗漏了一些东西。

最新更新