Есть ли какая-либо документация о том, как управлять «Редактором уравнений» через VBA в Excel? - PullRequest
3 голосов
/ 02 апреля 2019

Кто-нибудь работал над использованием одного из редакторов уравнений Microsoft в вашем коде VBA?Если да, то можете ли вы дать мне какое-то руководство, где я могу найти руководство по программированию?Я хочу придерживаться редактора, встроенного в Excel 2018 или даже OMaths из Word 2018, если это возможно.

Лучшее, что я получил, было, если я вручную вставил уравнение, и его присвоенное имя было "TextBox 55" затем:

ActiveSheet.Shapes("TextBox 55").DrawingObject.Text = "(a+b)/c"

Я хочу иметь возможность создавать и редактировать / читать содержимое уравнения "Редактор уравнений" через VBA, но информации там практически нет.Думал, что кто-то знает, с чего начать.

1 Ответ

2 голосов
/ 03 апреля 2019

Обратите внимание, что это только обходной путь (поскольку нет официального способа):

Вы можете использовать Application.CommandBars.ExecuteMso для запуска любых кнопок на ленте.Например, Application.CommandBars.ExecuteMso "EquationProfessional" для преобразования формулы в профессиональный стиль.

См. Документированы ли коды команд для ExecuteMso? для получения идентификаторов.

Вот некоторые идеи,Обратите внимание, что вам нужно создать объект формы уравнения и назвать его Textfeld 1, прежде чем запускать эти коды.Мне не удалось создать его с помощью VBA, но вы по крайней мере можете изменить содержание существующего уравнения.

  • TestWriteFormulaA записывает формулу

    enter image description here

  • TestWriteFormulaB записывает формулу

    enter image description here

  • MakeEquationLinear преобразует, например, формулу A в линейную форму

    enter image description here

  • MakeEquationProfessional преобразует ее обратно в профессиональную форму

  • GenerateAscWFromString создает комбинацию ChrW уравнения.Обратите внимание, что уравнение может быть изменено только в линейной форме MyEquation.DrawingObject.Text =.Поэтому убедитесь, что она линейная, прежде чем вы сгенерируете комбинацию ChrW.

Обратите внимание, что вы можете преобразовать большинство знаков в команды, такие как \sum для знака суммы ∑.Таким образом, вместо комбинации Chrw вы можете использовать, например,

MyEquation.DrawingObject.Text = "(x+a)^n=\sum_(k=0)^n (n¦k)x^k a^(n-k)"

, чтобы написать FormulaA.

Здесь вы можете найти неофициальную документацию по командам уравнения:
http://www.iun.edu/~mathiho/useful/Equation%20Editor%20Shortcut%20Commands.pdf


Option Explicit

' write a formula A
Public Sub TestWriteFormulaA()
    Dim MyEquation As Shape
    Set MyEquation = ThisWorkbook.Worksheets("Sheet1").Shapes("Textfeld 1")

    MakeEquationLinear MyEquation

    MyEquation.DrawingObject.Text = ChrW(40) & ChrW(-10187) & ChrW(-9115) & ChrW(43) & ChrW(-10187) & ChrW(-9138) & ChrW(41) & ChrW(94) & ChrW(-10187) & ChrW(-9125) & ChrW(61) & ChrW(8721) & ChrW(50) & ChrW(52) & ChrW(95) & ChrW(40) & ChrW(-10187) & ChrW(-9128) & ChrW(61) & ChrW(48) & ChrW(41) & ChrW(94) & ChrW(-10187) & ChrW(-9125) & ChrW(9618) & ChrW(12310) & ChrW(40) & ChrW(-10187) & ChrW(-9125) & ChrW(166) & ChrW(-10187) & ChrW(-9128) & ChrW(41) & ChrW(32) & ChrW(-10187) & ChrW(-9115) & ChrW(94) & ChrW(-10187) & ChrW(-9128) & ChrW(32) & ChrW(-10187) & ChrW(-9138) & ChrW(94) & ChrW(40) & ChrW(-10187) & ChrW(-9125) & ChrW(8722) & ChrW(-10187) & ChrW(-9128) & ChrW(41) & ChrW(32) & ChrW(12311)
    'same as below which was converted manually to the command structure
    'MyEquation.DrawingObject.Text = "(x+a)^n=\sum_(k=0)^n (n¦k)x^k a^(n-k)"
    MakeEquationProfessional MyEquation
End Sub


' write another forumla B
Public Sub TestWriteFormulaB()
    Dim MyEquation As Shape
    Set MyEquation = ThisWorkbook.Worksheets("Sheet1").Shapes("Textfeld 1")

    MakeEquationLinear MyEquation

    MyEquation.DrawingObject.Text = ChrW(40) & ChrW(49) & ChrW(43) & ChrW(-10187) & ChrW(-9115) & ChrW(41) & ChrW(94) & ChrW(-10187) & ChrW(-9125) & ChrW(61) & ChrW(49) & ChrW(43) & ChrW(-10187) & ChrW(-9125) & ChrW(-10187) & ChrW(-9115) & ChrW(47) & ChrW(49) & ChrW(33) & ChrW(43) & ChrW(40) & ChrW(-10187) & ChrW(-9125) & ChrW(40) & ChrW(-10187) & ChrW(-9125) & ChrW(8722) & ChrW(49) & ChrW(41) & ChrW(32) & ChrW(-10187) & ChrW(-9115) & ChrW(94) & ChrW(50) & ChrW(41) & ChrW(47) & ChrW(50) & ChrW(33) & ChrW(43) & ChrW(8230)

    MakeEquationProfessional MyEquation
End Sub


'get the ChrW combination of an equation in the immediate window
Public Sub TestGetChrWFromEquation()
    Dim MyEquation As Shape
    Set MyEquation = ThisWorkbook.Worksheets("Sheet1").Shapes("Textfeld 1")

    MakeEquationLinear MyEquation

    GenerateAscWFromString MyEquation.DrawingObject.Text

    MakeEquationProfessional MyEquation
End Sub




Public Sub MakeEquationLinear(ByVal Equation As Shape)
    Dim OriginalSheet As Object
    If Equation.Parent.Name <> ActiveSheet.Name Then
        Set OriginalSheet = ActiveSheet
        Equation.Parent.Activate
    End If

    Equation.Select
    Application.CommandBars.ExecuteMso "EquationLinearFormat"

    If Not OriginalSheet Is Nothing Then OriginalSheet.Activate
End Sub

Public Sub MakeEquationProfessional(ByVal Equation As Shape)
    Dim OriginalSheet As Object
    If Equation.Parent.Name <> ActiveSheet.Name Then
        Set OriginalSheet = ActiveSheet
        Equation.Parent.Activate
    End If

    Equation.Select
    Application.CommandBars.ExecuteMso "EquationProfessional"

    If Not OriginalSheet Is Nothing Then OriginalSheet.Activate
End Sub

Public Sub GenerateAscWFromString(ByVal InputString As String)
    Dim OutputString As String

    Dim ChrIdx As Long
    For ChrIdx = 1 To Len(InputString)
        OutputString = OutputString & IIf(OutputString <> vbNullString, " & ", "") & "ChrW(" & AscW(Mid$(InputString, ChrIdx, 1)) & ")"
    Next ChrIdx
    Debug.Print OutputString
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...