Макрос VBA для выделения выделенного текста в текущем сообщении электронной почты

Я пытаюсь создать макрос VBA для Outlook 2013, который возьмет выбранный текст в сообщении электронной почты, которое я сейчас пишу (в формате HTML), и установит размер/цвет/жирность/выделение шрифта.

Мой макрос имеет два блока if/then. Один блок предназначен для Outlook 2003 и дает желаемый результат для всех четырех характеристик текста. Однако после 2003 года Outlook использует Word EditorType для электронных писем в формате HTML, и поэтому мне нужен другой блок VBA с другим синтаксисом для изменения шрифта выделенного текста. VBA в моем блоке 2013 года правильно работает для изменения жирности/размера точки, но не применяет выделение к тексту. Вместо этого команда выделения текста (rng.Range.HighlightColorIndex = wdYellow) приводит к тому, что цвет фона окна выбора становится прозрачным (так что текст больше не кажется выделенным, даже если он все еще действительно выделен) , но выделение выделенного текста не применяется.

Когда выделение текста не работало, я пробовал что-то другое. Я попытался использовать команду vba для установки желтого фона (который имеет эквивалентный визуальный эффект при ручном применении без vba). rng.Shading.BackgroundPatternColor = wdColorYellow. Но вместо того, чтобы сделать фон желтым, фон становится черным.

Также блок 2013 не вызывает изменения цвета шрифта. Цвет шрифта остается черным, несмотря на оператор (rng.Font.Color = wdColorBlue)

Пожалуйста, сообщите мне, как я могу выделить выделенный текст желтым цветом и установить цвет выделенного текста на синий.

Полный макрос VBA приведен ниже.

 Sub ChangeSelectedFontBold14HiYellow()
 Dim msg As Outlook.MailItem
 Dim insp As Outlook.Inspector

 Set insp = Application.ActiveInspector

 If insp.CurrentItem.Class = olMail Then 
     Set msg = insp.CurrentItem

     If insp.EditorType = olEditorHTML Then ' outlook 2003
         Set hed = msg.GetInspector.HTMLEditor
         Set rng = hed.Selection.createRange
         rng.pasteHTML "<b><font style='color: blue; background: yellow; font-size: 14pt;'>" & rng.Text & "</font></b>"
     End If

     If insp.EditorType = olEditorWord Then ' outlook 2013
         Set hed = msg.GetInspector.WordEditor
         Set word = hed.Application
         Set rng = word.Selection
         rng.Font.Size = 14
         rng.Font.Color = wdColorBlue ' color does not change
         rng.Font.Bold = True
         ' rng.Shading.BackgroundPatternColor = wdColorYellow ' changes background color to black instead of yellow
         ' rng.HighlightColorIndex = wdYellow ' does not work  ' error 438 object doesn't support this property
         rng.Range.HighlightColorIndex = wdYellow ' does not work - changes the background to clear for the selection indicator color

     End If

 End If
 Set insp = Nothing
 Set rng = Nothing
 Set hed = Nothing
 Set msg = Nothing
 End Sub

person user3109378    schedule 17.12.2013    source источник


Ответы (1)


Вам нужно добавить ссылку на проект VBA в библиотеку объектов Word или определить эти константы, чтобы Outlook мог понять, каковы истинные значения wdColorBlue и wdYellow.

Когда я это сделал, ваш код имел желаемый эффект (но если вы добавите ссылку, вы не сможете использовать Word в качестве имени переменной)

Вот что сработало у меня (более или менее - я был на работе, когда тестировал, но не сейчас...) Часть Collapse отлично работает в Word, поэтому должна работать и в Outlook.

Sub ChangeSelectedFontBold14HiYellow()
 Dim msg As Outlook.MailItem
 Dim insp As Outlook.Inspector

 Set insp = Application.ActiveInspector

 If insp.CurrentItem.Class = olMail Then 
     Set msg = insp.CurrentItem

     If insp.EditorType = olEditorHTML Then ' outlook 2003
         Set hed = msg.GetInspector.HTMLEditor
         Set rng = hed.Selection.createRange
         rng.pasteHTML "<b><font style='color: blue; background: yellow; font-size: 14pt;'>" & rng.Text & "</font></b>"
     End If

     If insp.EditorType = olEditorWord Then ' outlook 2013
         Set hed = msg.GetInspector.WordEditor
         Set appWord = hed.Application
         Set rng = appWord.Selection
         rng.Font.Size = 14
         rng.Font.Color = wdColorBlue 
         rng.Font.Bold = True
         rng.Range.HighlightColorIndex = wdYellow

         rng.Collapse Direction:=wdCollapseEnd 'UNTESTED, but something like this...
     End If

 End If

 Set appWord = Nothing
 Set insp = Nothing
 Set rng = Nothing
 Set hed = Nothing
 Set msg = Nothing

 End Sub
person Tim Williams    schedule 17.12.2013
comment
Спасибо. Можете ли вы опубликовать свой код, который работает? Я почти там, но все еще есть проблема. Я изменил rng.Range.HighlightColorIndex=wdYellow на =7. Теперь подсветка работает корректно. Но изменение rng.Font.Color = wdColorBlue на = 2 (или любое другое число) не приводит к изменению цвета текста. Кстати, в качестве последнего шага в макросе, после применения изменений к выделенному тексту, я хотел бы отменить выделение текста и переместить точку вставки курсора в следующую позицию справа (как если бы пользователь набрал стрелку вправо ключ). Как я могу сделать это в Outlook через vba? - person user3109378; 17.12.2013
comment
Значение для wdColorBlue равно 16711680. Перейдите в редактор VB и используйте Object Browser (F2), чтобы найти значения для этих констант. Значения для констант типа ColorIndex имеют тенденцию быть низкими числами, тогда как константы Color будут числами типа Long с широким диапазоном возможных значений (от черного = 0 до белого = 16777215). - person Tim Williams; 17.12.2013
comment
Спасибо, Тим. Этот оператор работает правильно: rng.Collapse Direction:=wdCollapseEnd. Также изменение 2 на 16711680 решает проблему синего цвета. Для полноты, как вы заставили свою опубликованную версию тренироваться с именами цветовых переменных. То есть, как вы добавили ссылку на проект VBA в библиотеку объектов Word. Я гуглил, но инструкции не нашел. - person user3109378; 17.12.2013
comment
В редакторе Outlook VB перейдите к Tools >> References и установите флажок для Microsoft Word 12.0 Object Library (или любой другой версии, которая у вас есть) - person Tim Williams; 17.12.2013