更快地将光标移动到文档末尾(Word用户表单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

可以看出,通常的命令Selection.EndKey Unit:=wdStory,Extend:=wdMove需要在我速度相当快的个人电脑上超过6秒(Systemscore 8.1(省略Extend:=wdMove没有任何区别。请注意,用户表单代码的其余部分,包括对Farbe((子的多次调用,在不到1秒的时间内终止(感谢多任务处理(,然后子只在.Endkey上等待完成。

因此,我需要一个更快的vba代码来将光标定位在用户表单中Word文档的末尾……提前感谢您的好建议。当然,推动<CTRL>lt;结束>在文档中以交互方式按键的速度和往常一样非常快。错误出现在用户表单的vba代码执行中。

显然没有答案,因为这显然是一个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秒,这与这些命令行中哪一个先执行,哪一个后执行无关!

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

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

最新更新