2017-02-28 6 views
0

このプロセスをより効果的に処理するためには完全に迷っています。WordのVBAを使用しているドキュメントに特殊文字をフラグする

次のマクロは、ドキュメントのすべての文字を分析し、ASCII値が255より大きい場合は、特定の言語用の特殊文字スタイルを適用します。特定の言語用のものもあれば、それらの一部でない場合は 'lang'言語。

マクロは正常に動作しますが、長いドキュメントでは処理に時間がかかります。たとえば、私はちょうど各ページでギリシャ語のいくつかの行で147ページ(単一スペースの)文書を処理し、WindowsのWord 2016で40分かかりました(対照的に、正確に同じファイルと同じコードは2分かかりましたMacの場合)。

これをWindows用に最適化するために、以下のコードに何かできることはありますか?

ありがとうございます。何らかの理由Range.DetectLanguageについては ジョン

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 
+0

書式で検索して置換するhttp://www.excelforum.com/word-programming-vba-macros/997078-best-way-to-find-replace-unicode-characters.html – Slai

+0

リンクのアプローチは、あなたが探している文字をすでに知っていることを前提としているので、私が必要とするものはありません。私は文書で使用されている特殊文字を特定しようとしています。特定の共通範囲に該当する場合は、特定の言語にタグを付けますが、それ以外の場合は、一般的な文字スタイルが適用されます。 – johnwangel

答えて

0

は、Word(2007)の私のバージョンでは動作していないようですが、それは代わりに文字コードを確認するのに見て何かあるかもしれません。

オフィスVBAマクロを高速化する一般的なアプローチは、画面の更新を無効にすることです:

あなたが Rangeの代わりに Selection遅くを使用しているので、あなたの場合のビットを助けるべき
Application.ScreenUpdating = False 
' some slow code that causes the screen to be updated 
Application.ScreenUpdating = True 

はまた、バイトの値をチェックすることは、直接少し速くAscWよりも思える:

8190のようなあなたのコード内のUnicodeコードポイントのほとんど
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 

は、ビットをオフに思えるので、あなたは http://www.fileformat.info/info/unicode/block/index.htm

でそれらを確認することができます
+0

ありがとうございます。私はこれをテストし、あなたに知らせるでしょう。もともとは画面更新を無効にしていましたが、これでは十分なスピードを出せなかったので、長時間空白の画面が表示されたときにクラッシュしたと考えました。だから私は、何か起こっていることが何もないよりも優れていることを彼らに知らせることを考えました。 – johnwangel

+0

@Slaiありがとうございます。方法はWindows上でもっと効率的です - それは40分から4分に短縮されます! (奇妙なことに、このバージョンはMacでは非常に遅いので、私はMac用の古い方法を保っている) – johnwangel

+0

@johnwangel私のテストでは4分で私には少し遅く聞こえるが、3秒で10ページだった。ケースステートメント以外を変更しましたか?実際には、私のテストはハイライトではなくスタイルのみを変更しているので気にしないでください。 – Slai

関連する問題