Как да съхраня оригиналното форматиране на текст преди стартиране на VBA?

Имам някакъв код, който превключва цвета на шрифта на избран текст чрез предварително определени цветове (черно > червено > зелено > черно и т.н.). Това, което наистина бих искал да направя обаче, е да го направя по-динамичен за какъвто и формат да е моята презентация.

Например, ако стартирам макроса върху част от заглавието на слайд, което е форматирано да бъде синьо, нямам добър начин да се върна към оригиналното синьо. Мислил съм да "копирам" форматирането в някаква променлива, но не съм сигурен как точно да изчистя променливата или да я съхраня за по-късно.

Това, което изглежда по-вероятно, е да се изгради някакъв вид търсене на „контекст“. Ако мога да погледна отляво и отдясно на избрания текст, може да има някакъв вход за цвета на текста (тъй като много рядко трябва да се различава в рамките на текстов блок). Но това бързо излиза извън моето ноу-хау.

Вижте кода по-долу за текущата настройка.

Sub TextColorSwap()

On Error Resume Next

With ActiveWindow.Selection
    If .TextRange.Font.Color = RGB(0, 0, 0) Then
        .TextRange.Font.Color = vbRed
    ElseIf .TextRange.Font.Color = vbRed Then
        .TextRange.Font.Color = RGB(0, 153, 0)
    Else
        .TextRange.Font.Color = RGB(0, 0, 0)
    End If
End With

End Sub

Някакви мисли от професионалистите?

-R


person randall13    schedule 31.10.2016    source източник


Отговори (1)


Какво ще кажете за нещо подобно, за да започнете:

Option Explicit

Public bFirstColour As Boolean

Sub TextColorSwap()

  ' This will mask all errors, and if you don't have your own error handler,
  ' is bad practice as you'll never know if something's gone wrong.
  On Error Resume Next

  Dim lColour As Long
  Dim lCursor As Long

  With ActiveWindow.Selection

    If .Type = ppSelectionText Then
      ' Get the start position of the selected text
      lCursor = .TextRange.Start
      ' If there are characters to the left of the selected text, save the colour and set a flag
      If lCursor > 1 And Not bFirstColour Then
        lColour = .TextRange.Characters(1).Font.Color
        bFirstColour = True
      End If
      ' Toggle the colour
      With .TextRange.Font
        If .Color = lColour Then
          .Color = vbRed
        ElseIf .Color = vbRed Then
          .Color = RGB(0, 153, 0)
        Else
          ' Reset the colour to the colour fond to the left of the text
          .Color = lColour
          bFirstColour = False
        End If
      End With
    End If
  End With
End Sub
person Jamie Garroch - MVP    schedule 31.10.2016