Использование VBA для установки маркеров и дополнительных маркеров

Я хотел бы создать макрос в PowerPoint, когда я выделяю часть текста и запускаю макрос. это создаст круглую пулю уровня 1. Я намереваюсь использовать это в качестве основы для создания уровня 2 (подпункты, вложенные в уровень 1) и уровня 3, но не смог понять, что не так с моим кодом. Есть ли здесь какой-нибудь эксперт, который может дать мне какое-то направление, пожалуйста?

Чего я хочу добиться, так это того, что в конечном итоге у меня будет 3 кнопки в качестве надстройки, а стиль пули уровня 1 на уровень 3 можно свободно переключать, нажимая на кнопку.

  • Текст 1 уровня
  • Level 2 text
    • Level 2 text
      • Level 3 text
      • Текст 3 уровня
Sub ApplyLBulletsToSelectedCode()
On Error Resume Next
Err.Clear
Dim oText As TextRange

Set oText = ActiveWindow.Selection.TextRange
If Err.Number <> 0 Then
MsgBox "No text was selected. Please highlight some text " _
& "or select a text frame and run the macro again.", vbExclamation
End
End If

With oText
.ParagraphFormat.Alignment = ppAlignLeft
.IndentLevel = 1
With .Parent.Ruler
.Levels(1).FirstMargin = 20
.Levels(1).LeftMargin = 0
End With
With .ParagraphFormat.Bullet
.Visible = msoCTrue
.RelativeSize = 1
.Character = 159
With .Font
.Color.RGB = RGB(0, 0, 0)
.Name = "Wingdings"
End With
End With
With .Font
.Name = "Calibri"
.Bold = msoFalse
.Color.RGB = RGB(0, 0, 0)
.Size = 14
End With
End With

End Sub

person Gerald Tao    schedule 13.12.2017    source источник


Ответы (1)


Это один из верных путей, но я вижу две основные проблемы.

Во-первых, у вас нет никакой обработки для установки разных уровней отступа — он просто предполагает, что мы устанавливаем уровень отступа равным 1. Но если вы хотите установить уровень отступа для 2, 3, 4 и т. д., тогда Вы не хотите писать совершенно новый саб. Итак, лучше всего, чтобы подпрограмма принимала переменную (my_level) и использовала ее для установки отступов и уровня отступов, как показано ниже. Затем вы просто указываете свои три кнопки отступа на их собственные подпрограммы вызывающего абонента, которые проходят по соответствующему уровню отступа.

Обратите внимание, что отступ первой строки всегда равен -20 — это значение нужно изменить только в том случае, если вы хотите, чтобы расстояние между маркером и текстом на каждом уровне было разным. Значение LeftIndent просто кратно значению my_level.

Другая проблема, которую я вижу, заключается в том, что вы используете объект Ruler для установки отступов. Проблема в том, что если сделать это таким образом, это повлияет на отступ всего остального текста в фигуре, включая невыделенный текст. TextRange2 содержит свойства .ParagraphFormat.FirstLineIndent и .ParagraphFormat.LeftIndent, которые сохранят ваши изменения локализованными в выделенном тексте. Однако некоторые свойства, которые вы изменяете, недоступны в TextRange2, поэтому вам необходимо установить две разные переменные, основанные на выделении: одну для TextRange и одну для TextRange2.

Обратите внимание, что вы должны установить свойства .FirstLineIndent и .LeftIndent после установки уровня отступа. Если бы вы переместили часть oText2 перед частью oText в приведенном ниже коде, отступы не были бы установлены должным образом.

Это должно указать вам правильное направление:

Sub CallLevel1()
    ApplyLBulletsToSelectedCode (1)
End Sub

Sub CallLevel2()
    ApplyLBulletsToSelectedCode (2)
End Sub

Sub CallLevel3()
    ApplyLBulletsToSelectedCode (3)
End Sub



Sub ApplyLBulletsToSelectedCode(my_level As Long)

On Error Resume Next
Err.Clear

Dim oText As TextRange
Dim oText2 As TextRange2

Set oText = ActiveWindow.Selection.TextRange
Set oText2 = ActiveWindow.Selection.TextRange2

If Err.Number <> 0 Then
    MsgBox "No text was selected. Please highlight some text " _
    & "or select a text frame and run the macro again.", vbExclamation
    End
End If

With oText
    .Paragraphs.IndentLevel = my_level

     With .ParagraphFormat.Bullet
        .Visible = msoCTrue
        .RelativeSize = 1
        .Character = 159

        With .Font
            .Color.RGB = RGB(0, 0, 0)
            .Name = "Wingdings"
        End With

    End With

    With .Font
        .Name = "Calibri"
        .Bold = msoFalse
        .Color.RGB = RGB(0, 0, 0)
        .Size = 14
    End With
End With

With oText2
    .ParagraphFormat.Alignment = ppAlignLeft
    .ParagraphFormat.FirstLineIndent = -20
    .ParagraphFormat.LeftIndent = 20 * my_level
End With

End Sub
person egerz    schedule 11.08.2019