Word Macro Source Code : 文書中の康煕部首文字を正常文字に置き換える

Word Macro Source Code : 文書中の康煕部首文字を正常文字に置き換える


「置換」コマンドを連続して実行させる、実務に役立つWordのマクロの完全なソースコードを公開しています。
学習目的でもOKですので、ご自由にお使いください。

問題発生機序と本記事プログラムの守備範囲

問題は次の順序で進んでいく
1.メイリオフォントで文書を作成する
2.この文書をPDFファイル化する。この変換時点で根本問題が発生する。
3.Acrobat ReaderでこのPDFファイルを開き、康煕部首文字を「検索」してみる。例えば、文書内に「高」の文字を視認できれば、その「高」を「検索」してみる。ヒットしないことを確認する
4.Acrobat Readerで、文字データを「コピー」する
5.ワープロアプリWordの文書に「貼り付け」る
6.Wordの「検索」コマンドで、康煕部首文字(例えば、「高」という文字)を「検索」してみる。ヒットしないことを確認する
7.ここで本記事プログラムの登場です。

PDFファイル内のデータ操作はあっちの権限なので、私のような野良では対応できません。
なので、本記事にあるように、Wordでの作業になります。

康煕部首文字やCJK部首補助文字が文書中に混在する問題については次のページに掲載しています。
1.見た目が同一の文字だけど、文字コードが異なっているという意味で「文字化けの問題」を解決する
4.文字列が康煕部首に自動変換される件(コンピュータ)

本記事では、この問題に対処するため、Microsoft社のワープロアプリWordで実行させるmacroのsource codeを掲載しています。

Wordで実行させるmacroのsource code


動作内容

業務視点:Wordの文書中にある康煕部首文字及びCJK部首補助文字を正常な文字に変換しま
す。

技術視点:
1.Unicodeに対応する数値型データテーブル(ソースでの埋め込み固定値)を、文字型データテーブル(文字として視認可能データ)に変換する。
2.Word文書中の康煕部首文字及びCJK部首補助文字を、上記Unicode文字型データに置き換える。何故、このようなややこしい仕掛けなのかは、見た目が同一の文字だけど、文字コードが異なっているという意味で「文字化けの問題」を解決するをご覧ください。


良くなる点

「検索」コマンドでヒットしなかった文字がヒットするようになります。

良くならない点

康煕部首文字のFontはMicrosoft JhengHeiのままです。このため、Wordの行間変更コマンドが有効にならないのは、これまでどおりです。手作業で「MS 明朝」などのFontに変換してください。

付加的利点

本プログラムの実行途中で、中間ファイルとして、康煕部首文字及びCJK部首補助文字が書かれたテキストファイルを生成します。このファイルを使えば、逆に、康煕部首文字などを積極的に使いたい人には役に立ちます。

動作内容詳細

1.Wordの「置換」を実行しているだけです。ファイルとして保存はしていません。
2.本プログラムが正常な文字変換を行っているのかを確認できるようにするため、パソコンのファイルシステムの「デスクトップ」に、変換テーブルをファイルとして作成するようにしています。ファイル名は「勇者あああ.txt」と「賢者あああ.txt」です。
macroを実行する度に、これらファイルを上書きします。
これらファイルは削除可能です。
テキストファイルであるため、閲覧可能です。「メモ帳」で内容をみて頂き、変換の対応関係が正しいことをご確認ください。
3.パソコンやWordの設定変更をしていません。

使い方

1.Wordを起動し、康煕部首文字やCJK部首文字が混在するWordの文書ファイルを開く。
2.本macroの実行時間は長いです。本macroを一番最初に使う場合、本macroの動作内容や実行時間を確認して頂いた方が良いため、変換対象の文字数を少なく編集し、実験として実行させることを推奨します。
3.Wordのコマンド>「表示」>「マクロ」>「マクロの表示」>「編集」でMicrosoft Visual Basic for Applications(VBA)を表示させます。
4.下記のWord macro source codeをコピーし、VBAの編集画面に貼り付けます。
5.Wordのコマンド>「表示」>「マクロ」>「マクロの表示」で「康煕部首文字変換マクロ」を選択し「実行」させます。
6.VBAの「イミディエイトウィンドウ」に進捗状況が表示されます。
7.macroの動作終了後に、文字が「検索」コマンドでヒットすることや、文書内容をコピーし「メモ帳」に貼り付けて文字が小さくなっていないことをご確認ください。

特徴

1.基本的には、煕部首文字及びCJK部首補助文字の全ての文字を「置換」します。
ただし、置き換えたくない文字があるかもしれません。また、実行速度が遅いかもしれません。
その場合、下記のプログラムの下の方にある 「lgArray(x) =」の右側を「&H1」に変更してください。そうすれば、その文字コードに対して「置換」コマンドを実行せず、その分動作が早くなります。
2.煕部部首文字やCJK部首補助文字ではない文字を任意の文字に変換したい場合は、既存のテーブルを書き換えてください。
テーブルの数を加除した場合、エラーになります。誤ってテーブルの行を削除してしまうエラーへの対応のため、このような仕様にしています。

'以下、Word macro source code

'変換テーブルのデータを視認できるようにするため、このデータをテキストファイル化している
'使い方などは次のサイトをご覧ください
'https://anti-rugby.blogspot.com/2020/09/word-macro-source-code.html
Option Explicit '変数の宣言が必須

Const 賢者あああ As String = "賢者あああ.txt"
Const 勇者あああ As String = "勇者あああ.txt"

Const iProcess_Kangxi As Integer = 1
Const iProcess_CJK As Integer = 2

Const gKangxiHighestCode As Long = &H2FD5
Const gKangxiLowestCode As Long = &H2F00

Const gCJKHighestCode As Long = &H2EF3
Const gCJKLowestCode As Long = &H2E80

Dim iExecutions, iAllItems As Integer
Sub 康煕部首文字変換マクロ()
    
    Debug.Print vbCrLf
    Debug.Print "*** Macro has newly started! *** " + Format(Now, "yyyy/mm/dd HH:mm:ss")
    Dim sFileFullPathName As String
    Dim sInput As String
    Dim WSH As Object 'Windows Script Host
    
    iExecutions = 0
    iAllItems = 0
    
    Set WSH = CreateObject("WScript.Shell")
    
    translateUnicode WSH, iProcess_CJK
    translateUnicode WSH, iProcess_Kangxi
    
    Debug.Print "*** end of macro *** executions : " + CStr(iExecutions) + vbCrLf
    MsgBox "処理終了"
End Sub
Private Sub 変換実行(sRadical As String, sDestination As String)
'このままだとフォントがMicrosoft JhengHeiになったままになる
    Selection.HomeKey Unit:=wdStory
    Selection.WholeStory
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = sRadical
        .Replacement.Text = sDestination
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchByte = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = False
        .MatchFuzzy = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Collapse Direction:=wdCollapseStart
End Sub
Private Function getStringFromFile(sFileFullPathName As String)
    Dim sInput As String
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LoadFromFile sFileFullPathName
        sInput = .ReadText
        .Close
    End With
    
    'image of inputted data: "?":"一","?":"丨","?":"龠"
    If sInput = "" Or InStr(sInput, ":") = 0 Or InStr(sInput, """") = 0 Then
        MsgBox "ファイル内データが誤っている。処理終了"
        Debug.Print "The format in the table text file is not correct."
        End
    End If
    getStringFromFile = sInput
End Function
Private Function getNumberOfAllItems(sInput As String)
    Dim i, j As Integer
    i = 1
    j = InStr(i, sInput, ",", vbTextCompare)
    Do While j <> 0
        iAllItems = iAllItems + 1
        i = j + 1
        j = InStr(i, sInput, ",", vbTextCompare)
    Loop
    iAllItems = iAllItems + 1
End Function
Private Function translateUnicode(WSH As Object, iProcess As Integer)
    Dim sFileFullPathName As String
    Dim iHighestCode, iLowestCode As Integer
    Dim sInput As String

    Select Case iProcess
    Case iProcess_Kangxi
        Debug.Print "start of translateUnicode() for Kangxi"
        sFileFullPathName = WSH.SpecialFolders("Desktop") + "\" + 勇者あああ
        makeKangxiTableFile sFileFullPathName
        iHighestCode = gKangxiHighestCode
        iLowestCode = gKangxiLowestCode

    Case iProcess_CJK
        Debug.Print "start of translateUnicode() for CJK"
        sFileFullPathName = WSH.SpecialFolders("Desktop") + "\" + 賢者あああ
        makeCJKTableFile sFileFullPathName
        iHighestCode = gCJKHighestCode
        iLowestCode = gCJKLowestCode
        
    Case Else
        Debug.Print "error : TranslateUnicode()"
        End
    End Select
    
    sInput = getStringFromFile(sFileFullPathName)
    getNumberOfAllItems sInput
    
    Dim iSearchComma, iPlacedComma As Integer
    Dim s As String
    Dim lg As Long
    
    iSearchComma = 1
    iPlacedComma = InStr(iSearchComma, sInput, ",", vbTextCompare)
    
    Do While iPlacedComma <> 0
        s = Mid(sInput, iSearchComma, iPlacedComma - iSearchComma)
        s = Replace(s, """", "")
        s = Replace(s, ":", "")
        s = Replace(s, vbCrLf, "")

        lg = AscW(Mid(s, 1, 1))
        If lg >= iLowestCode And lg <= iHighestCode Then ' range of radicals
        Else
            Debug.Print "That's not a correct radical at " + CStr(iExecutions)
            End
        End If
        
        lg = AscW(Mid(s, 2, 1))
        If lg >= iLowestCode And lg <= iHighestCode Then
            Debug.Print "That is a radical at " + CStr(iExecutions)
            End
        Else
            If lg = 1 Then ' escape from secondary effect
                Debug.Print "escape. No." + CStr(iExecutions) + " " + Mid(s, 1, 1)
            Else
                iExecutions = iExecutions + 1
                変換実行 Mid(s, 1, 1), Mid(s, 2, 1)
            End If
        End If
        
        iSearchComma = iPlacedComma + 1
        iPlacedComma = InStr(iSearchComma, sInput, ",", vbTextCompare)
        
        If iExecutions Mod 10 = 0 Then
            Debug.Print "  " + CStr(iExecutions) + " / " + CStr(iAllItems)
        End If
    Loop

    s = Mid(sInput, iSearchComma, Len(sInput))
    s = Replace(s, """", "")
    s = Replace(s, ":", "")
    s = Replace(s, vbCrLf, "")

    If Len(s) = 2 Then
        lg = AscW(Mid(s, 1, 1))
        If lg >= iLowestCode And lg <= iHighestCode Then
        Else
            Debug.Print "That's not a correct radical at " + CStr(iExecutions)
            End
        End If
        
        lg = AscW(Mid(s, 2, 1))
        If lg >= iLowestCode And lg <= iHighestCode Then
            Debug.Print "That is a radical at " + CStr(iExecutions)
            End
        Else
            If lg = 1 Then ' escape from secondary effect
                Debug.Print "escape. No." + CStr(iExecutions) + " " + Mid(s, 1, 1)
            Else
                iExecutions = iExecutions + 1
                変換実行 Mid(s, 1, 1), Mid(s, 2, 1)
            End If
        End If
        
        Debug.Print "  " + CStr(iExecutions) + " / " + CStr(iAllItems)
    End If
    
    Debug.Print "end of translateUnicode() executions : " + CStr(iExecutions)
End Function
Private Function makeKangxiTableFile(sFileFullPathName As String)
    Const adTypeText = 2 'https://teratail.com/questions/204165
    Const adWriteChar = 0 'https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/streamwriteenum?view=sql-server-ver15
    Const adSaveCreateOverWrite = 2 'https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/saveoptionsenum?view=sql-server-ver15
    
    Const iKangxis As Integer = gKangxiHighestCode - gKangxiLowestCode + 1 'number of Kangxi characters
    Dim lgKangxiCode, lgArrayKangxiU(iKangxis) As Long
    Dim i As Integer
    
    For i = 0 To iKangxis - 1
        lgArrayKangxiU(i) = 0
    Next i
    
    setKangxiUnicode lgArrayKangxiU
    For i = 0 To iKangxis - 1
        If lgArrayKangxiU(i) = 0 Then
            Debug.Print "error : at makeKangxiTableFile(),  making array(" + CStr(i) + ")"
            End
        End If
    Next i
    
    Debug.Print "makeKangxiTableFile() filename is " + sFileFullPathName

    lgKangxiCode = gKangxiLowestCode
    With CreateObject("ADODB.Stream")
        .Type = adTypeText
        .Charset = "UTF-8"
        .Open

        For i = 1 To iKangxis
            .WriteText """", adWriteChar
            .WriteText ChrW(lgKangxiCode), adWriteChar
            .WriteText """:""", adWriteChar
            .WriteText ChrW(lgArrayKangxiU(i - 1)), adWriteChar
            .WriteText """", adWriteChar
            If i < iKangxis Then
                .WriteText ",", adWriteChar
                .WriteText vbCrLf, adWriteChar '改行挿入
            End If
            lgKangxiCode = lgKangxiCode + 1
        Next i

        .SaveToFile sFileFullPathName, adSaveCreateOverWrite
        .Close
    End With
    
    If Dir(sFileFullPathName, vbNormal) = "" Then
        MsgBox "変換テーブルファイル" & vbCrLf & sFileFullPathName + "が" & vbCrLf & "デスクトップに存在しません。", vbExclamation
        End
    End If
End Function
Private Function makeCJKTableFile(sFileFullPathName As String)
    Const adTypeText = 2 'https://teratail.com/questions/204165
    Const adWriteChar = 0 'https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/streamwriteenum?view=sql-server-ver15
    Const adSaveCreateOverWrite = 2 'https://docs.microsoft.com/ja-jp/sql/ado/reference/ado-api/saveoptionsenum?view=sql-server-ver15
    
    Const iCJKs As Integer = gCJKHighestCode - gCJKLowestCode + 1 'number of CJK characters
    Dim lgCJKCode, lgArrayCJKU(iCJKs) As Long
    Dim i As Integer
    
    For i = 0 To iCJKs - 1
        lgArrayCJKU(i) = 0
    Next i
    
    setCJKUnicode lgArrayCJKU
    For i = 0 To iCJKs - 1
        If lgArrayCJKU(i) = 0 Then
            Debug.Print "error : at makeCJKTableFile(),  making array(" + CStr(i) + ")"
            End
        End If
    Next i
    
    Debug.Print "makeCJKTableFile() filename is " + sFileFullPathName
    lgCJKCode = gCJKLowestCode

    With CreateObject("ADODB.Stream")
        .Type = adTypeText
        .Charset = "UTF-8"
        .Open

        For i = 1 To iCJKs
            If lgCJKCode = &H2E9A Then
                'This code isn't been used.
                Debug.Print "    Code 0x2e9a in CJK isn't been used"
            Else
                .WriteText """", adWriteChar
                .WriteText ChrW(lgCJKCode), adWriteChar
                .WriteText """:""", adWriteChar
                .WriteText ChrW(lgArrayCJKU(i - 1)), adWriteChar
                .WriteText """", adWriteChar
                If i < iCJKs Then
                    .WriteText ",", adWriteChar
                    .WriteText vbCrLf, adWriteChar '改行挿入
                End If
            End If
            lgCJKCode = lgCJKCode + 1
        Next i

        .SaveToFile sFileFullPathName, adSaveCreateOverWrite
        .Close
    End With
    
    If Dir(sFileFullPathName, vbNormal) = "" Then
        MsgBox "変換テーブルファイル" & vbCrLf & sFileFullPathName + "が" & vbCrLf & "デスクトップに存在しません。", vbExclamation
        End
    End If
End Function
Private Function setCJKUnicode(lgArray() As Long)
'全部で115個 = 116個 - 1個(0x2e9a)
 lgArray(0) = AscW("〃") '2e80
 lgArray(1) = &H5382 '2e81
 lgArray(2) = &H4E5B '2e82
 lgArray(3) = &H4E5A '2e83
 lgArray(4) = &H4E59 '2e84
 lgArray(5) = &H4EBB '2e85
 lgArray(6) = &H5182 '2e86
 lgArray(7) = &H51E0 '2e87
 lgArray(8) = &H5200 '2e88
 lgArray(9) = &H5202 '2e89
 lgArray(10) = &H535C '2e8a
 lgArray(11) = &H353E '2e8b
 lgArray(12) = &H5C0F '2e8c
 lgArray(13) = &H5C0F '2e8d
 lgArray(14) = &H5140 '2e8e
 lgArray(15) = &H5C23 '2e8f
 lgArray(16) = &H5C22 '2e90
 lgArray(17) = &H5C23 '2e91
 lgArray(18) = &H5DF3 '2e92
 lgArray(19) = &H5E7A '2e93
 lgArray(20) = &H5F51 '2e94
 lgArray(21) = &H5F50 '2e95
 lgArray(22) = &H5FC4 '2e96
 lgArray(23) = &H5FC3 '2e97
 lgArray(24) = &H624C '2e98
 lgArray(25) = &H6535 '2e99
 lgArray(26) = &H1 '2e9a not used
 lgArray(27) = &H65E1 '2e9b
 lgArray(28) = &H65E5 '2e9c
 lgArray(29) = &H6708 '2e9d
 lgArray(30) = &H6B7A '2e9e
 lgArray(31) = &H6BCD '2e9f
 lgArray(32) = &H6C11 '2ea0
 lgArray(33) = &H6C35 '2ea1
 lgArray(34) = &H6C3A '2ea2
 lgArray(35) = &H706C '2ea3
 lgArray(36) = &H722B '2ea4
 lgArray(37) = &H722B '2ea5
 lgArray(38) = &H4E2C '2ea6
 lgArray(39) = &H725B '2ea7
 lgArray(40) = &H72AD '2ea8
 lgArray(41) = &H738B '2ea9
 lgArray(42) = &H758B '2eaa
 lgArray(43) = &H7F52 '2eab
 lgArray(44) = &H793A '2eac
 lgArray(45) = &H793B '2ead
 lgArray(46) = &H7AF9 '2eae
 lgArray(47) = &H7CF9 '2eaf
 lgArray(48) = &H7E9F '2eb0
 lgArray(49) = &H7F53 '2eb1
 lgArray(50) = &H7F52 '2eb2
 lgArray(51) = &H34C1 '2eb3
 lgArray(52) = &H34C1 '2eb4
' lgArray(53) = &H2626B '2eb5 https://www.unicode.org/charts/
 lgArray(53) = &H25CF '2eb5 input ●
 lgArray(54) = &H7F8A '2eb6
 lgArray(55) = &H7F8A '2eb7
 lgArray(56) = &H7F8B '2eb8
 lgArray(57) = &H8002 '2eb9
 lgArray(58) = &H8080 '2eba
 lgArray(59) = &H807F '2ebb
 lgArray(60) = &H8089 '2ebc
 lgArray(61) = &H81FC '2ebd
 lgArray(62) = &H8279 '2ebe
 lgArray(63) = &H8279 '2ebf
 lgArray(64) = &H8279 '2ec0
 lgArray(65) = &H864E '2ec1
 lgArray(66) = &H8864 '2ec2
 lgArray(67) = &H8980 '2ec3
 lgArray(68) = &H897F '2ec4
 lgArray(69) = &H89C1 '2ec5
 lgArray(70) = &H89D2 '2ec6
' lgArray(71) = &H278B2 '2ec7
 lgArray(71) = &H25CF '2ec7
 lgArray(72) = &H8BA0 '2ec8
 lgArray(73) = &H8D1D '2ec9
 lgArray(74) = &H8DB3 '2eca
 lgArray(75) = &H8F66 '2ecb
 lgArray(76) = &H8FB6 '2ecc
 lgArray(77) = &H8FB6 '2ecd
 lgArray(78) = &H8FB6 '2ece
 lgArray(79) = &H9091 '2ecf
 lgArray(80) = &H9485 '2ed0
 lgArray(81) = &H9577 '2ed1
 lgArray(82) = &H9578 '2ed2
 lgArray(83) = &H957F '2ed3
 lgArray(84) = &H95E8 '2ed4
 lgArray(85) = &H961C '2ed5
 lgArray(86) = &H961D '2ed6
 lgArray(87) = &H96E8 '2ed7
 lgArray(88) = &H9752 '2ed8
 lgArray(89) = &H97E6 '2ed9
 lgArray(90) = &H9875 '2eda
 lgArray(91) = &H98CE '2edb
 lgArray(92) = &H98DE '2edc
 lgArray(93) = &H98DF '2edd
' lgArray(94) = &H2967F '2ede
 lgArray(94) = &H25CF '2ede
 lgArray(95) = &H98E0 '2edf
 lgArray(96) = &H9963 '2ee0
' lgArray(97) = &H29810 '2ee1
 lgArray(97) = &H25CF '2ee1
 lgArray(98) = &H9A6C '2ee2
 lgArray(99) = &H9AA8 '2ee3
 lgArray(100) = &H9B3C '2ee4
 lgArray(101) = &H9C7C '2ee5
 lgArray(102) = &H9E1F '2ee6
 lgArray(103) = &H5364 '2ee7
 lgArray(104) = &H9EA6 '2ee8
 lgArray(105) = &H9EC4 '2ee9
 lgArray(106) = &H9EFE '2eea
 lgArray(107) = &H6589 '2eeb
 lgArray(108) = &H9F50 '2eec
 lgArray(109) = &H6B6F '2eed
 lgArray(110) = &H9F7F '2eee
 lgArray(111) = &H7ADC '2eef
 lgArray(112) = &H9F99 '2ef0
 lgArray(113) = &H9F9C '2ef1
 lgArray(114) = &H4E80 '2ef2
 lgArray(115) = &H9F9F '2ef3
End Function
Private Function setKangxiUnicode(lgArray() As Long)
    lgArray(&H2F00 - &H2F00) = &H4E00 '2f00
    lgArray(&H2F01 - &H2F00) = &H4E28
    lgArray(&H2F02 - &H2F00) = &H4E36
    lgArray(&H2F03 - &H2F00) = &H4E3F
    lgArray(&H2F04 - &H2F00) = &H4E59
    lgArray(&H2F05 - &H2F00) = &H4E85
    lgArray(&H2F06 - &H2F00) = &H4E8C
    lgArray(&H2F07 - &H2F00) = &H4EA0
    lgArray(&H2F08 - &H2F00) = &H4EBA
    lgArray(&H2F09 - &H2F00) = &H513F
    lgArray(&H2F0A - &H2F00) = &H5165
    lgArray(&H2F0B - &H2F00) = &H516B
    lgArray(&H2F0C - &H2F00) = &H5182
    lgArray(&H2F0D - &H2F00) = &H5196
    lgArray(&H2F0E - &H2F00) = &H51AB
    lgArray(&H2F0F - &H2F00) = &H51E0
    
    lgArray(&H2F10 - &H2F00) = &H51F5
    lgArray(&H2F11 - &H2F00) = &H5200
    lgArray(&H2F12 - &H2F00) = &H529B
    lgArray(&H2F13 - &H2F00) = &H52F9
    lgArray(&H2F14 - &H2F00) = &H5315
    lgArray(&H2F15 - &H2F00) = &H531A
    lgArray(&H2F16 - &H2F00) = &H5338
    lgArray(&H2F17 - &H2F00) = &H5341
    lgArray(&H2F18 - &H2F00) = &H535C
    lgArray(&H2F19 - &H2F00) = &H5369
    lgArray(&H2F1A - &H2F00) = &H5382
    lgArray(&H2F1B - &H2F00) = &H53B6
    lgArray(&H2F1C - &H2F00) = &H53C8
    lgArray(&H2F1D - &H2F00) = &H53E3
    lgArray(&H2F1E - &H2F00) = &H56D7
    lgArray(&H2F1F - &H2F00) = &H571F
    
    lgArray(&H2F20 - &H2F00) = &H58EB
    lgArray(&H2F21 - &H2F00) = &H5902
    lgArray(&H2F22 - &H2F00) = &H590A
    lgArray(&H2F23 - &H2F00) = &H5915
    lgArray(&H2F24 - &H2F00) = &H5927
    lgArray(&H2F25 - &H2F00) = &H5973
    lgArray(&H2F26 - &H2F00) = &H5B50
    lgArray(&H2F27 - &H2F00) = &H5B80
    lgArray(&H2F28 - &H2F00) = &H5BF8
    lgArray(&H2F29 - &H2F00) = &H5C0F
    lgArray(&H2F2A - &H2F00) = &H5C22
    lgArray(&H2F2B - &H2F00) = &H5C38
    lgArray(&H2F2C - &H2F00) = &H5C6E
    lgArray(&H2F2D - &H2F00) = &H5C71
    lgArray(&H2F2E - &H2F00) = &H5DDB
    lgArray(&H2F2F - &H2F00) = &H5DE5
    
    lgArray(&H2F30 - &H2F00) = &H5DF1
    lgArray(&H2F31 - &H2F00) = &H5DFE
    lgArray(&H2F32 - &H2F00) = &H5E72
    lgArray(&H2F33 - &H2F00) = &H5E7A
    lgArray(&H2F34 - &H2F00) = &H5E7F
    lgArray(&H2F35 - &H2F00) = &H5EF4
    lgArray(&H2F36 - &H2F00) = &H5EFE
    lgArray(&H2F37 - &H2F00) = &H5F0B
    lgArray(&H2F38 - &H2F00) = &H5F13
    lgArray(&H2F39 - &H2F00) = &H5F50
    lgArray(&H2F3A - &H2F00) = &H5F61
    lgArray(&H2F3B - &H2F00) = &H5F73
    lgArray(&H2F3C - &H2F00) = &H5FC3
    lgArray(&H2F3D - &H2F00) = &H6208
    lgArray(&H2F3E - &H2F00) = &H6236
    lgArray(&H2F3F - &H2F00) = &H624B
    
    lgArray(&H2F40 - &H2F00) = &H652F
    lgArray(&H2F41 - &H2F00) = &H6534
    lgArray(&H2F42 - &H2F00) = &H6587
    lgArray(&H2F43 - &H2F00) = &H6597
    lgArray(&H2F44 - &H2F00) = &H65A4
    lgArray(&H2F45 - &H2F00) = &H65B9
    lgArray(&H2F46 - &H2F00) = &H65E0
    lgArray(&H2F47 - &H2F00) = &H65E5
    lgArray(&H2F48 - &H2F00) = &H66F0
    lgArray(&H2F49 - &H2F00) = &H6708
    lgArray(&H2F4A - &H2F00) = &H6728
    lgArray(&H2F4B - &H2F00) = &H6B20
    lgArray(&H2F4C - &H2F00) = &H6B62
    lgArray(&H2F4D - &H2F00) = &H6B79
    lgArray(&H2F4E - &H2F00) = &H6BB3
    lgArray(&H2F4F - &H2F00) = &H6BCB
    
    lgArray(&H2F50 - &H2F00) = &H6BD4
    lgArray(&H2F51 - &H2F00) = &H6BDB
    lgArray(&H2F52 - &H2F00) = &H6C0F
    lgArray(&H2F53 - &H2F00) = &H6C14
    lgArray(&H2F54 - &H2F00) = &H6C34
    lgArray(&H2F55 - &H2F00) = &H706B
    lgArray(&H2F56 - &H2F00) = &H722A
    lgArray(&H2F57 - &H2F00) = &H7236
    lgArray(&H2F58 - &H2F00) = &H723B
    lgArray(&H2F59 - &H2F00) = &H723F
    lgArray(&H2F5A - &H2F00) = &H7247
    lgArray(&H2F5B - &H2F00) = &H7259
    lgArray(&H2F5C - &H2F00) = &H725B
    lgArray(&H2F5D - &H2F00) = &H72AC
    lgArray(&H2F5E - &H2F00) = &H7384
    lgArray(&H2F5F - &H2F00) = &H7389
    
    lgArray(&H2F60 - &H2F00) = &H74DC
    lgArray(&H2F61 - &H2F00) = &H74E6
    lgArray(&H2F62 - &H2F00) = &H7518
    lgArray(&H2F63 - &H2F00) = &H751F
    lgArray(&H2F64 - &H2F00) = &H7528
    lgArray(&H2F65 - &H2F00) = &H7530
    lgArray(&H2F66 - &H2F00) = &H758B
    lgArray(&H2F67 - &H2F00) = &H7592
    lgArray(&H2F68 - &H2F00) = &H7676
    lgArray(&H2F69 - &H2F00) = &H767D
    lgArray(&H2F6A - &H2F00) = &H76AE
    lgArray(&H2F6B - &H2F00) = &H76BF
    lgArray(&H2F6C - &H2F00) = &H76EE
    lgArray(&H2F6D - &H2F00) = &H77DB
    lgArray(&H2F6E - &H2F00) = &H77E2
    lgArray(&H2F6F - &H2F00) = &H77F3
    
    lgArray(&H2F70 - &H2F00) = &H793A
    lgArray(&H2F71 - &H2F00) = &H79B8
    lgArray(&H2F72 - &H2F00) = &H79BE
    lgArray(&H2F73 - &H2F00) = &H7A74
    lgArray(&H2F74 - &H2F00) = &H7ACB
    lgArray(&H2F75 - &H2F00) = &H7AF9
    lgArray(&H2F76 - &H2F00) = &H7C73
    lgArray(&H2F77 - &H2F00) = &H7CF8
    lgArray(&H2F78 - &H2F00) = &H7F36
    lgArray(&H2F79 - &H2F00) = &H7F51
    lgArray(&H2F7A - &H2F00) = &H7F8A
    lgArray(&H2F7B - &H2F00) = &H7FBD
    lgArray(&H2F7C - &H2F00) = &H8001
    lgArray(&H2F7D - &H2F00) = &H800C
    lgArray(&H2F7E - &H2F00) = &H8012
    lgArray(&H2F7F - &H2F00) = &H8033
    
    lgArray(&H2F80 - &H2F00) = &H807F
    lgArray(&H2F81 - &H2F00) = &H8089
    lgArray(&H2F82 - &H2F00) = &H81E3
    lgArray(&H2F83 - &H2F00) = &H81EA
    lgArray(&H2F84 - &H2F00) = &H81F3
    lgArray(&H2F85 - &H2F00) = &H81FC
    lgArray(&H2F86 - &H2F00) = &H820C
    lgArray(&H2F87 - &H2F00) = &H821B
    lgArray(&H2F88 - &H2F00) = &H821F
    lgArray(&H2F89 - &H2F00) = &H826E
    lgArray(&H2F8A - &H2F00) = &H8272
    lgArray(&H2F8B - &H2F00) = &H8278
    lgArray(&H2F8C - &H2F00) = &H864D
    lgArray(&H2F8D - &H2F00) = &H866B
    lgArray(&H2F8E - &H2F00) = &H8840
    lgArray(&H2F8F - &H2F00) = &H884C
    
    lgArray(&H2F90 - &H2F00) = &H8863
    lgArray(&H2F91 - &H2F00) = &H897E
    lgArray(&H2F92 - &H2F00) = &H898B
    lgArray(&H2F93 - &H2F00) = &H89D2
    lgArray(&H2F94 - &H2F00) = &H8A00
    lgArray(&H2F95 - &H2F00) = &H8C37
    lgArray(&H2F96 - &H2F00) = &H8C46
    lgArray(&H2F97 - &H2F00) = &H8C55
    lgArray(&H2F98 - &H2F00) = &H8C78
    lgArray(&H2F99 - &H2F00) = &H8C9D
    lgArray(&H2F9A - &H2F00) = &H8D64
    lgArray(&H2F9B - &H2F00) = &H8D70
    lgArray(&H2F9C - &H2F00) = &H8DB3
    lgArray(&H2F9D - &H2F00) = &H8EAB
    lgArray(&H2F9E - &H2F00) = &H8ECA
    lgArray(&H2F9F - &H2F00) = &H8F9B
    
    lgArray(&H2FA0 - &H2F00) = &H8FB0
    lgArray(&H2FA1 - &H2F00) = &H8FB5
    lgArray(&H2FA2 - &H2F00) = &H9091
    lgArray(&H2FA3 - &H2F00) = &H9149
    lgArray(&H2FA4 - &H2F00) = &H91C6
    lgArray(&H2FA5 - &H2F00) = &H91CC
    lgArray(&H2FA6 - &H2F00) = &H91D1
    lgArray(&H2FA7 - &H2F00) = &H9577
    lgArray(&H2FA8 - &H2F00) = &H9580
    lgArray(&H2FA9 - &H2F00) = &H961C
    lgArray(&H2FAA - &H2F00) = &H96B6
    lgArray(&H2FAB - &H2F00) = &H96B9
    lgArray(&H2FAC - &H2F00) = &H96E8
    lgArray(&H2FAD - &H2F00) = &H9751
    lgArray(&H2FAE - &H2F00) = &H975E
    lgArray(&H2FAF - &H2F00) = &H9762
    
    lgArray(&H2FB0 - &H2F00) = &H9769
    lgArray(&H2FB1 - &H2F00) = &H97CB
    lgArray(&H2FB2 - &H2F00) = &H97ED
    lgArray(&H2FB3 - &H2F00) = &H97F3
    lgArray(&H2FB4 - &H2F00) = &H9801
    lgArray(&H2FB5 - &H2F00) = &H98A8
    lgArray(&H2FB6 - &H2F00) = &H98DB
    lgArray(&H2FB7 - &H2F00) = &H98DF
    lgArray(&H2FB8 - &H2F00) = &H9996
    lgArray(&H2FB9 - &H2F00) = &H9999
    lgArray(&H2FBA - &H2F00) = &H99AC
    lgArray(&H2FBB - &H2F00) = &H9AA8
    lgArray(&H2FBC - &H2F00) = &H9AD8
    lgArray(&H2FBD - &H2F00) = &H9ADF
    lgArray(&H2FBE - &H2F00) = &H9B25
    lgArray(&H2FBF - &H2F00) = &H9B2F
    
    lgArray(&H2FC0 - &H2F00) = &H9B32
    lgArray(&H2FC1 - &H2F00) = &H9B3C
    lgArray(&H2FC2 - &H2F00) = &H9B5A
    lgArray(&H2FC3 - &H2F00) = &H9CE5
    lgArray(&H2FC4 - &H2F00) = &H9E75
    lgArray(&H2FC5 - &H2F00) = &H9E7F
    lgArray(&H2FC6 - &H2F00) = &H9EA5
    lgArray(&H2FC7 - &H2F00) = &H9EBB
    lgArray(&H2FC8 - &H2F00) = &H9EC3
    lgArray(&H2FC9 - &H2F00) = &H9ECD
    lgArray(&H2FCA - &H2F00) = &H9ED1
    lgArray(&H2FCB - &H2F00) = &H9EF9
    lgArray(&H2FCC - &H2F00) = &H9EFD
    lgArray(&H2FCD - &H2F00) = &H9F0E
    lgArray(&H2FCE - &H2F00) = &H9F13
    lgArray(&H2FCF - &H2F00) = &H9F20
    
    lgArray(&H2FD0 - &H2F00) = &H9F3B
    lgArray(&H2FD1 - &H2F00) = &H9F4A
    lgArray(&H2FD2 - &H2F00) = &H9F52
    lgArray(&H2FD3 - &H2F00) = &H9F8D
    lgArray(&H2FD4 - &H2F00) = &H9F9C
    lgArray(&H2FD5 - &H2F00) = &H9FA0
    
End Function