当前位置: 首页 > 知识库问答 >
问题:

在Word中使用VBA标记文档中的特殊字符

邢弘业
2023-03-14

我完全不知道如何更好地处理这个过程。

下面的宏分析文档中的每个字符,如果ASCII值高于255,它会对其应用特殊的字符样式——有些是针对特定语言的,如果不是这些语言的一部分,则只使用“lang”。

宏工作正常,但是在长文档上,处理它需要很长时间。例如,我刚刚处理了一个147页(单行间距)的文档,每页上有几行希腊文,用了40分钟,在Windows的Word 2016中(相比之下,在Mac上完全相同的文件和代码用了2分钟)。

我可以对下面的代码做些什么来优化Windows?

谢谢你的建议。约翰

    Sub CheckSpecialCharacters()
    'This macro looks for any characters above 255 and tags them with the appropriate existing language character.

        Dim ch As Range: Set ch = ActiveDocument.Characters(1)

        Do

            Counter = Counter + 1

            ch.Select

            myValue = AscW(Selection.Text)
            If myValue > 255 Then

                If (myValue > 8190 And myValue < 8225) Or (myValue > 288 And myValue < 381) Or (myValue > 701 And myValue < 704) Or myValue = 730 Then
                    'Ignores Curly Quotes and Transliteration punctuation

                ElseIf (myValue > 7935 And myValue < 8192) Or (myValue > 879 And myValue < 1024) Then
                    'Greek Characters get langgrk applied
                    Selection.Expand unit:=wdWord
                    Selection.Style = "langgrk"

                ElseIf (myValue > 1423 And myValue < 1535) Then
                    'Hebrew Characters get langheb applied
                    Selection.Expand unit:=wdWord
                    Selection.Style = "langheb"

                ElseIf myValue > 7679 And myValue < 7830 Then
                    'Extended transliteration characters get langtrans applied //OLD VALUES// (myValue > 288 And myValue < 381) Or (myValue > 701 And myValue < 704)
                    If HCCP = True Then Selection.Expand unit:=wdWord
                    Selection.Style = "langtrans"

                ElseIf (myValue > 19968 And myValue < 40959) Then
                    'Chinese Characters get langchin applied
                    Selection.Expand unit:=wdWord
                    Selection.Style = "langchin"

                ElseIf (myValue > 19968 And myValue < 40917) Then
                    'Japanese Characters get langjap applied
                    Selection.Expand unit:=wdWord
                    Selection.Style = "langjap"

                Else
                    If HCCP = True Then Selection.Expand unit:=wdWord
                    Selection.Style = "lang"

                End If

            End If

DoNext:


End Sub

共有1个答案

尚俊楠
2023-03-14

由于某种原因,范围。DetectLanguage在我的Word(2007)版本中似乎不起作用,但这可能是需要研究的内容,而不是检查字符代码。

加快Office VBA宏速度的一般方法是禁用屏幕更新:

Application.ScreenUpdating = False
' some slow code that causes the screen to be updated
Application.ScreenUpdating = True 

这对您的情况应该有点帮助,因为您使用的是较慢的选择,而不是范围

此外,直接检查字节值似乎比AscW快一点:

Sub test()
    'Options.DefaultHighlightColorIndex = wdNoHighlight
    'Range.HighlightColorIndex = wdNoHighlight ' used for testing to clear Highlight

    Dim r As Range, t As Double: t = Timer
    Application.ScreenUpdating = False

    For Each r In Range.Characters ' For Each r In Range.Words is somehow about 2 times slower than .Characters
        checkRange r
    Next

    Application.ScreenUpdating = True
    Debug.Print Timer - t; Range.Words.Count; Range.Characters.Count; Range.End ' " 3.15625  8801  20601  20601 "
End Sub

Sub checkRange(r As Range)
    Dim b() As Byte, i As Long, a As Long
    b = r.Text ' converts the string to byte array (2 or 4 bytes per character)
    'Debug.Print "'" & r & "'"; r.LanguageID; r.LanguageIDFarEast; r.LanguageIDOther

    For i = 1 To UBound(b) Step 2            ' 2 bytes per Unicode codepoint
        If b(i) > 0 Then                     ' if AscW > 255
            a = b(i): a = a * 256 + b(i - 1) ' AscW
            Select Case a
                Case &H1F00 To &H1FFF: r.HighlightColorIndex = wdBlue: Exit Sub ' Greek Extended
                Case &H3040 To &H30FF: r.HighlightColorIndex = wdPink: Exit Sub ' Hiragana and Katakana
                Case &H4E00 To 40959: r.HighlightColorIndex = wdGreen: Exit Sub ' CJK Unified Ideographs

                Case 55296 To 56319: ' ignore leading High Surrogates ?
                Case 56320 To 57343: ' ignore trailing Low Surrogates ?

                Case Else: r.HighlightColorIndex = wdRed: Debug.Print Hex(a), r.End - r.Start ' other
            End Select
        End If
    Next
End Sub

代码中的一些Unicode代码点(如8190)似乎有点不对劲,因此您可以在http://www.fileformat.info/info/unicode/block/index.htm

 类似资料:
  • 代码段 很简单-分配字符串,然后将字符串分配给单元格。 我想做的是告诉“狐狸”这个词,他很大胆。这能做到吗?有特殊的字符序列吗?例如^B,有人知道在哪里可以找到完整的列表吗?文本显然可以是任何东西。。。 谢谢并问候塞恩

  • 我有一个当前格式的文档 标题 字幕 H1 样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本 H2 样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本样本文本 H3 样本文本样本文本样本文本样本文本样本文

  • 我有一个word文档,其中包含许多由html标记定义的html文档。我想创建一个数组或范围集合,每个范围由一个html文档组成。例如,以下是Word文档: 等等。我想用一系列范围来填充rngHTMLDocs()As Range,每个范围包含每个打开和关闭html标记中的文本。 我创建了以下代码,试图遍历定义这些范围的整个文档,但它只继续选择超文本标记语言Doc 1。我想我可能以错误的方式接近整个迭

  • 我已经很多年没有使用VB了,所以如果这是显而易见的,请原谅我。我正在尝试编写一个word vba宏,以便在模板中使用,该模板将显示一个userform,然后导入fileA的内容。docx,fileB。docx或fileC。docx取决于用户表单。(之后我将使用书签填写一些表单数据,我不知道这是否相关)。文件A、B和C将包含一些基本格式(如列表)的文本,但没有什么特别之处。 我在网上看到的解决方案可

  • 我需要循环一些word文档,并从word文档中提取图像,并将其保存在单独的文件夹中。我尝试过将它们保存为超文本标记语言文档的方法,但它不太适合我的需求。 现在,我使用inlineshapes对象循环浏览图像,然后将它们复制粘贴到publisher文档上,然后将它们保存为图像。但是,在运行脚本时,我会遇到运行时自动化错误。对于使用Publisher运行时库,我尝试了早期绑定和晚期绑定,但都遇到了错误

  • 我想用vba来保护我的word文档。 的确,这是可能的,但我已经通过以下链接搜索了如何取消文档保护: http://www.aurelp.com/2015/04/01/how-to-unlock-a-microsoft-word-document-step-by-stepsolved/ 有没有其他方法可以成功地保护文档不被未经授权的用户使用?