Обратите внимание, что это только обходной путь (поскольку нет официального способа):
Вы можете использовать Application.CommandBars.ExecuteMso
для запуска любых кнопок на ленте.Например, Application.CommandBars.ExecuteMso "EquationProfessional"
для преобразования формулы в профессиональный стиль.
См. Документированы ли коды команд для ExecuteMso? для получения идентификаторов.
Вот некоторые идеи,Обратите внимание, что вам нужно создать объект формы уравнения и назвать его Textfeld 1
, прежде чем запускать эти коды.Мне не удалось создать его с помощью VBA, но вы по крайней мере можете изменить содержание существующего уравнения.
TestWriteFormulaA
записывает формулу

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

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

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