'------------------------------------------------------------- ' 例句號碼重新編排 Renumber 1.33 (C) 2009-2012 T.Tanomura '------------------------------------------------------------- Sub Renumber() Dim fn, en, wn, m1, m2, m3, m4, m5, z, tr, m, d, p, n, u Dim map(999) As Integer fn = False ' 處理腳注中的例句號碼(True)/不處理(False) en = False ' 處理後注中的例句號碼(True)/不處理(False) wn = True ' 警告例句號碼的重複(True)/不警告(False) m1 = "正在處理中..." m2 = "處理結束了." m3 = "有未定義例句號碼被參照." m4 = "有例句號碼重複." m5 = "警告" z = "★" Application.StatusBar = m1 Application.ScreenUpdating = False tr = ActiveDocument.TrackRevisions ActiveDocument.TrackRevisions = False With ActiveDocument Erase map m = 0 d = "" For Each p In .Paragraphs n = get_exnum(LTrimPlus(p.Range.Text)) If 0 < n Then If map(n) = 0 Then m = m + 1 map(n) = m Else If wn Then append_exnum d, map(n) End If End If Next u = "" rewrite_exnum .Range, map, z, u, m1 If fn And 0 < .Footnotes.Count Then rewrite_exnum .Footnotes(1).Range, map, z, u, m1 End If If en And 0 < .Endnotes.Count Then rewrite_exnum .Endnotes(1).Range, map, z, u, m1 End If End With ActiveDocument.TrackRevisions = tr Application.ScreenUpdating = True Application.ScreenRefresh Application.StatusBar = m2 report_errors u, d, m3, m4, m5 End Sub Function get_exnum(p) Dim i get_exnum = 0 If Left(p, 1) = "(" And Mid(p, 2, 1) <> "0" Then i = 0 While is_a_digit(Mid(p, 2 + i, 1)) i = i + 1 Wend If 1 <= i And i <= 3 Then get_exnum = Val(Mid(p, 2, i)) End If End Function Function is_a_digit(c) is_a_digit = "0" <= c And c <= "9" End Function Function LTrimPlus(p) LTrimPlus = LTrim(Replace(p, vbTab, " ")) End Function Sub rewrite_exnum(r, map, z, u, m1) Dim ls, n r.SetRange 0, 0 With r.Find ls = IIf(Application.International(wdListSeparator) = ";", ";", ",") .Text = "\([0-9]{1" + ls + "4}" .MatchWildcards = True While .Execute With .Parent n = Val(Mid(.Text, 2)) If Mid(.Text, 2, 1) <> "0" And n < 1000 Then If n <> map(n) Then .SetRange .Start + 1, .End If 0 < map(n) Then .Text = CStr(map(n)) Else .Text = z + CStr(n) append_exnum u, n End If .SetRange .End, .End End If End If End With Wend End With End Sub Sub append_exnum(ByRef s, n) If s <> "" Then s = s + ", " s = s + "(" + CStr(n) + ")" End Sub Sub report_errors(u, d, m3, m4, m5) Dim s, e s = " " If u <> "" Then u = m3 + s + vbCr + u + s If d <> "" Then d = m4 + s + vbCr + d + s e = u + IIf(u <> "" And d <> "", vbCr + vbCr, "") + d If e <> "" Then MsgBox e, , "Renumber - " + m5 End Sub