代码之家  ›  专栏  ›  技术社区  ›  Rahilly

如何使用Word VBA将<eq></eq>标记之间的文本转换为公式?

  •  0
  • Rahilly  · 技术社区  · 1 年前

    我正在用Word设置数学考试的格式。默认情况下,我收到的所有问题都有用乳胶写的方程,并用<eq>并且</eq>标签。要执行适当的格式设置,我需要找到这些标记中的每一个,选择其中的文本,并插入一个公式。由于这是一项重复性任务,我知道使用宏可以实现自动化,但我对VBA一无所知。如何创建一个宏来遍历整个文档、查找这些标记、插入公式和删除标记?

    我不知道这是否有帮助,但命令 Selection.OMaths.Add Range:=Selection.Range 插入所选文本的公式。

    文本示例:

    找到表达式<eq>-2x^2+3x+5</eq>。

    不需要完成表达式的格式化。我只需要选择并插入等式(alt+=)。

    1 回复  |  直到 1 年前
        1
  •  0
  •   taller    1 年前
    Option Explicit
    
    Sub ConvertEquation()
        Dim objDoc As Document
        Dim wdRng As Range
        Dim SearchTxt As String
        Const START_TAG = "\<eq\>"
        Const END_TAG = "\</eq\>"
        Set objDoc = ActiveDocument
        Set wdRng = objDoc.Content
        ' Search with wildcards
        SearchTxt = START_TAG & "*" & END_TAG
        With wdRng.Find
            .ClearFormatting
            .Forward = True
            .Wrap = wdFindStop
            .MatchWholeWord = True
            .MatchCase = False
            .MatchWildcards = True
            .Text = SearchTxt
        End With
        Do While wdRng.Find.Execute
            ' Locate the equation range
            wdRng.MoveStart wdCharacter, Len(START_TAG) - 2
            wdRng.MoveEnd wdCharacter, 2 - Len(END_TAG)
            ' Convert equation
            wdRng.OMaths.Add Range:=wdRng
            wdRng.Collapse wdCollapseEnd
        Loop
    End Sub
    
    

    enter image description here


    使现代化

    问题:它也可以删除标签吗?(来自评论)

    Sub ConvertEquation()
        Dim objDoc As Document
        Dim wdRng As Range
        Dim SearchTxt As String
        Dim EquTxt As String
        Dim iStart As Integer
        Dim iOffset As Integer
        Const START_TAG = "\<eq\>"
        Const END_TAG = "\</eq\>"
        Set objDoc = ActiveDocument
        Set wdRng = objDoc.Content
        ' Search with wildcards
        SearchTxt = START_TAG & "*" & END_TAG
        With wdRng.Find
            .ClearFormatting
            .Forward = True
            .Wrap = wdFindStop
            .MatchWholeWord = True
            .MatchCase = False
            .MatchWildcards = True
            .Text = SearchTxt
        End With
        iStart = Len(START_TAG) - 1
        Do While wdRng.Find.Execute
            ' Remove tag
            EquTxt = wdRng.Text
            iOffset = Len(EquTxt) - Len(START_TAG) - Len(END_TAG) + 4
            EquTxt = VBA.Mid(EquTxt, iStart, iOffset)
            wdRng.Text = EquTxt
            ' Convert equation
            wdRng.OMaths.Add Range:=wdRng
            wdRng.Collapse wdCollapseEnd
        Loop
    End Sub
    

    enter image description here