vba - 将光标移动到文档末尾的更快方法(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 代码执行中。
解决方案
显然没有答案,因为这显然是一个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 秒 - 与这些命令行中的哪一个先执行,哪一个稍后执行无关!
书签试验是作为替代方法进行的,因为文档的结尾在一个框架中,而不是编辑完成的地方……顺便说一下,光标的位置和选择宽度没有影响。
因此,我将避免重新定位光标/选择。
推荐阅读
- android - 我无法从 xml 提要阅读器获取链接...它只显示标签“?”但不显示链接中的 url
- salesforce - 将 Zaper 连接到 Salesforce Sandbox 故障排除
- javascript - 路径有问题(nodejs botbuilder)
- tsql - SQL Server:从 VARCHAR 转换为 DATETIME
- swift - 使用从另一个协议继承的协议作为关联类型
- ios - 如何修复 Protocol 只能用作通用约束,因为它具有 Self 或关联的类型要求错误
- html - 用 html width 属性覆盖在 css 中声明的表格宽度
- php - 如何在 PHP 中实现 pub/sub 类?
- ios - 代表保留圈虽然使用弱
- sql-server - 首先按重复最多的记录排序