В Word VBA, как я могу правильно установить цвета шрифтов, которые используют цветовые оттенки темы? - PullRequest
0 голосов
/ 29 апреля 2019

Я пишу макрос VBA, который устанавливает цвет одного фрагмента текста в соответствии с цветом другого фрагмента текста. У меня возникают трудности, когда текст окрашен оттенком одного из цветов темы.

Option Explicit

Sub ChangeRangeColour()

Dim rSourceColourRange As Range
Set rSourceColourRange = ActiveDocument.Range(Start:=10, End:=20)

Dim rDestinationRange As Range
Set rDestinationRange = ActiveDocument.Range(Start:=30, End:=40)

rDestinationRange.Font.Color = rSourceColourRange.Font.Color


End Sub

Я использую .Font.Color, хотя это недокументировано, потому что .Font.ColorIndex, кажется, не работает правильно с пользовательскими цветами. Если есть другое свойство, которое я должен использовать вместо этого, пожалуйста, дайте мне знать.

Это прекрасно работает для пользовательских цветов, стандартных цветов и основных цветов темы. Когда текст окрашен с оттенком одного из цветов темы, текст назначения изменяется на цвет темы без оттенка. Как я могу получить оттенок вместе с цветом?

1 Ответ

1 голос
/ 30 апреля 2019

Ну, .Font.Color наверняка раньше работал, по крайней мере, в WD2007 - WD2013.Он вернул длинное значение, которое было либо конкретным RGB для не-тематических цветов, либо эквивалентом значения HEX комбинации цвета и оттенка темы (или оттенка).Тони Джолланс написал подробную статью для Word 2007, в которой приведены все подробные сведения о цветах темы.

.Font.Color не имеет документов, поскольку он устарел и после тестирования в Word 365 могу подтвердитьчто он больше не работает, как раньше.Теперь он возвращает только цвет темы, а не оттенок или оттенок.

@ Синди Мейстер предложила .Font.TextColor, что звучит так, как будто оно должно давать нужные вам значения.К сожалению, хотя он возвращает объект ColorFormat, полный свойств .ObjectThemeColor, .Brightness и .TintAndShade, единственная действительная информация, которую вы получите, - от .ObjectThemeColor, так что это не даст вам того, что вам нужно.

Чтобы получить всю необходимую вам информацию, вам необходимо отложить логику и изучить .Font.Fill.ForeColor.(Например, действительно ?! Шрифт имеет заливка цвет ??). Это также вернет объект ColorFormat, но на этот раз все свойства вернут действительные данные.

Поэтому вам следует изменить:

rDestinationRange.Font.Color = rSourceColourRange.Font.Color

на:

With rDestinationRange.Font.Fill.ForeColor
    .ObjectThemeColor = rSourceColourRange.Font.Fill.ForeColor.ObjectThemeColor
    .Brightness = rSourceColourRange.Font.Fill.ForeColor.Brightness
End With

Для полноты свойство .Brightness возвращает значение -1 для 100% (т.е. без оттенка или оттенка)0,6 для 40% светлее, 0,4 для 60% светлее и т. Д. Отрицательные значения используются для оттенков с -0,75, что на 25% темнее и -0,5 на 50% темнее.

Также можно установить .Brightnessзначения, которые не соответствуют значениям в палитре, например, 0,25 для 75% светлее или -0,9 для 10% темнее.

...