Как создать уравнение Word VBA, используя математические выражения, которые форматируют показатели и дроби? - PullRequest
0 голосов
/ 16 января 2020

Я использую Excel VBA для написания уравнений в Word.

Дробная составляющая уравнения неправильно форматируется. Выражение имеет дробь, где числитель и знаменатель имеют показатель степени. Я не могу получить показатели в правильном положении.

Я попытался использовать квадратные скобки и лишние пробелы - в результате либо не было накопления объекта уравнения, либо странных показателей.

Sub TextToEquation()
Dim appWord as Word.Application
Dim eqText as String
Dim ac as OMathAutoCorrectEntry
Dim eqObj as Word.OMaths

'Create new word application
Set appWord = New Word.Application

With appWord
   'Create new word document
   .Documents.Add
   'Turn Math Autocorrect On
   .OMathAutoCorrect.UseOutsideOMath = True

   With .Selection
      'Write Text
      .Text = "x^2 \times x^5/x^3"

      'Find any math autocorrect and replace with character
      For each ac in appWord.OMathAutoCorrect.Entries
         If InStr(.text, ac.Name) > 0 then
            .text = Replace(.text, ac.name, ac.value)
         End If
      Next ac
   End With

   'Add math object
   Set eqObj = .OMaths.Add(.Range).OMaths.item(1)
   'Build up equation <<< THIS IS WHERE THE BUG LIES
   eqObj.BuildUp
   eqObj.BuildUp

End With

Примечание. Фактический код отличается, но это актуально Фрагмент кода изменен для работы независимо.

1 Ответ

0 голосов
/ 22 января 2020

Итак, я не смог понять, почему оригинальный код не работает, но, работая в обратном направлении, я нашел решение. Обратите внимание, что это ситуационный код, поэтому это не самый прямой код.

Sub runTest()
    Dim appWord As Word.Application

    Set appWord = New Word.Application

    With appWord
        .Visible = True
        .Activate
        .Documents.Add
        For i = 1 To 5
            .Selection.TypeText "\equation{x^" & i & " \times x^5/x^3}"
            .Selection.TypeParagraph
            .Selection.TypeParagraph
        Next i
    End With

    Call TextToEquation(appWord)


End Sub

Sub TextToEquation(appWord As Word.Application)
    Dim objRange As Word.Range
    Dim objEq As Word.OMath
    Dim objText As String

    With appWord
        With .Selection

            'Search the document for \equation{} tags
            With .Find
                'Search Settings
                .ClearFormatting
                .Format = False
                .Forward = True
                .Wrap = wdFindContinue
                .MatchCase = False
                .MatchWholeWord = False
                .MatchAllWordForms = False
                .MatchSoundsLike = False
                'Search Text
                .text = "\\equation\{*\}"
                .Replacement.text = ""
                .MatchWildcards = True
                'Execute search
                .Execute
            End With 'Find

            Do 'While there are still \equation{} tags to be found
                'Select location to insert equation
                Set objRange = .Range

                'Write equation text
                objText = objRange.text
                objText = Replace(Replace(objText, "\equation{", ""), "}", "")  'Remove tag
                objText = MathSymbol(objText)                                   'Replace math symbols

                'Create equation
                objRange.text = objText
                Set objRange = .OMaths.Add(objRange)
                Set objEq = objRange.OMaths(1)
                objEq.BuildUp

                'Search for the next occurrence
                .Find.Execute

            Loop While .Find.Found
        End With 'Selection
    End With 'appWord

End Sub

Function MathSymbol(strText As String) As String

    strText = Replace(strText, "\times", Chr(215))  'Multiplication symbol

    MathSymbol = strText

End Function

...