首页 > 解决方案 > 将光标移动到文档末尾的更快方法(Word userform VBA 巨大的性能问题)

问题描述

我有一个包含两个用户表单的 Word 模板。关闭表单 (.Hide) 时,表单中的第一个文本会插入到书签中,并且如果需要,可以更改书签的颜色;那么光标应该移动到文档的末尾。但是,这个简单的步骤执行速度非常慢!

Private Sub Fertig_Click()     ''''' code in userform

Application.ScreenUpdating = False
QL(19) = TextBox4.Text: QL(20) = "CHF": QL(21) = "K"
QL(22) = TextBox1.Text: QL(23) = TextBox2.Text: QL(24) = TextBox3.Text
' leere QL-Felder werden nicht geändert
Call PasteIntoBookmark("Name", TextBox1.Text)
Call PasteIntoBookmark("Strasse", TextBox2.Text)
Call PasteIntoBookmark("Ort", TextBox3.Text)
Call PasteIntoBookmark("Betrag", TextBox4.Text)
Call PasteIntoBookmark("Referenz", TextBox5.Text)
'————————————————
Dim StartTime
StartTime = Timer
Debug.Print Right(Format(Timer - StartTime, "#0.00"), 5) & " [timer start]"
'————————————————  output:  0.00
Selection.EndKey Unit:=wdStory, Extend:=wdMove
Debug.Print Right(Format(Timer - StartTime, "#0.00"), 5) & " seconds !!!"
'————————————————  output:  6.10 seconds !!!
'StartTime = Timer
' who knows any quicker command to reach the document's end ?
'Debug.Print Right(Format(Timer - StartTime, "#0.00"), 5) & " seconds"
'————————————————
Call Farbe("Datum", True)
If Len(TextBox1.Text) = 0 Or Len(TextBox2.Text) = 0 Or Len(TextBox3.Text) = 0 Then
    Call Farbe("Feld_1", False)
    Call Farbe("Feld_4", False)
Else
    Call Farbe("Feld_1", True)
    Call Farbe("Feld_4", True)
End If

' …………

End Sub

==== 以下代码位于 .dotm 模板的一个模块中:

Sub Farbe(ByVal Feld As String, ByVal Sichtbar As Boolean)
Selection.GoTo What:=wdGoToBookmark, Name:=Feld
If Sichtbar = True Then
    Selection.Font.Color = wdColorAutomatic   ' schwarz
Else
    Selection.Font.Color = -603914241         ' weiss
End If
End Sub

可以看出, 在我相当快的个人计算机(Systemscore 8.1)上,通常的命令Selection.EndKey Unit:=wdStory, Extend:=wdMove 需要超过 6 秒!省略 ,Extend:=wdMove 完全没有区别。请注意,包括对 Farbe() 子程序的大量调用在内的整个其余用户表单代码在不到 1 秒的时间内终止(感谢多任务处理),然后子程序仅等待 .Endkey 完成。

因此,我需要一个更快的 vba 代码来将光标定位在用户表单中 Word 文档的末尾……在此先感谢您的好建议。当然,在文档本身中交互地按下 <CTRL><END> 键是非常快的。该错误存在于用户窗体的 vba 代码执行中。

标签: vbams-worduserformsendkeysslowdown

解决方案


显然没有答案,因为这显然是一个BUG! 我以不同的顺序尝试了以下 3 个命令行:

Selection.EndKey Unit:=wdStory, Extend:=wdMove
ThisDocument.Range(ThisDocument.Range.End - 1, ThisDocument.Range.End - 1).Select
Selection.GoTo What:=wdGoToField, Name:="Date"
' "Date" is a bookmark, but What:=wdGoToBookmark leads to an error (Office 2019 ×64)

在所有情况下,3 个命令行中的第一个需要 6 秒,然后只需要 0.02 秒 - 与这些命令行中的哪一个先执行,哪一个稍后执行无关!

书签试验是作为替代方法进行的,因为文档的结尾在一个框架中,而不是编辑完成的地方……顺便说一下,光标的位置和选择宽度没有影响。

因此,我将避免重新定位光标/选择。


推荐阅读