سؤال

I'm trying to use the WordEditor object to modify the color of the selected text (Outlook VBA) but i'm unable to find documentation or examples on how to do it. Any ideas?

I don't want to use the HTML editor, i need a solution for WordEditor.

I tried debuging the code and using OutlookSpy, but everytime i go into WordEditor.Content my outlook freezes and restarts :(.

Using Outlook 2010 on Windows 7

هل كانت مفيدة؟

المحلول

OK - I found something that works. Ugly, but works:

Sub EmphesizeSelectedText(color As Long)
    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 = olEditorWord Then

            Set document = msg.GetInspector.WordEditor
            Set rng = document.Application.Selection

            With rng.font
                .Bold = True
                .color = color
            End With
        End If
    End If
    Set insp = Nothing
    Set rng = Nothing
    Set hed = Nothing
    Set msg = Nothing
End Sub

Eventually I found a reference that WordEditor returns a Document object. From there it was 2 hrs of going over MSDN's very slow web-help to find out that to get the selected text i needed to go up one level to the Application. Important note - changing rng.Style.Font did not do what i wanted it to do, it changed the entire document, when i started using the with rng.font my problem was solved (Thanks to Excel's marco recording abilities for showing me the correct syntax)

نصائح أخرى

Annotations are in German

Option Explicit
'Sub EmphesizeSelectedText(color As Long)
Sub EmphesizeSelectedText()
    Dim om_msg As Outlook.MailItem
    Dim oi_insp As Outlook.Inspector
    Dim ws_selec As Word.Selection

    Dim wd_Document As Word.Document
    Dim str_test As String

    Dim lng_color As Long
    lng_color = 255

    'Zugriff auf aktive E-Mail
    Set oi_insp = Application.ActiveInspector()
    'Überprüft ob es sich wirklich um eine E-Mail handelt
    If oi_insp.CurrentItem.Class = olMail Then
        Set om_msg = oi_insp.CurrentItem
        If oi_insp.EditorType = olEditorWord Then
            ' es gibt noch "olEditorHTML", "olEditorRTF", "olEditorText" und "olEditorWord"
            ' ist bei mir aber immer "olEditorWord" (= 4) - egal was ich im E-Mail Editor auswähle

            ' Set wd_Document = om_msg.Getinspector.WordEditor ' macht das gleiche wie nächste Zeile
            Set wd_Document = oi_insp.WordEditor
            Set ws_selec = wd_Document.Application.Selection
            str_test = ws_selec.Text
            Debug.Print ws_selec.Text
            ws_selec.Text = "foo bar"
            If om_msg.BodyFormat <> olFormatPlain Then
                ' auch wenn om_msg.BodyFormat = olFormatPlain ist, kann oi_insp.EditorType = olEditorWord sein
                ' doch dann gehen Formatierungen nicht -> Error !!!
                With ws_selec.Font
                    .Bold = True
                    .color = lng_color ' = 255 = red
                    .color = wdColorBlue
                End With
            End If
            ws_selec.Text = str_test
        End If
    End If

    Set oi_insp = Nothing
    Set ws_selec = Nothing
    Set om_msg = Nothing
    Set wd_Document = Nothing
End Sub

Verweise: (I do not know how it is called in the english version)

  • Visual Basic for Applications
  • Microsoft Outlook 15.0 Object Library
  • OLE Automation
  • Microsoft Office 15.0 Object Library
  • Microsoft Word 15.0 Object Library

Gruz $3v|\|

an other example:

Option Explicit
Private Sub Test_It()
    Dim om_Item As Outlook.MailItem
    Dim oi_Inspector As Outlook.Inspector
    Dim wd_Doc As Word.Document
    Dim wd_Selection As Word.Selection
    Dim wr_Range As Word.Range

    Dim b_return As Boolean
    Dim str_Text As String
    str_Text = "Hello World"

    'Zugriff auf aktive E-Mail
    Set oi_Inspector = Application.ActiveInspector()
    Set om_Item = oi_Inspector.CurrentItem
    Set wd_Doc = oi_Inspector.WordEditor

    'Zugriff auf Textmarkierung in E-Mail
    Set wd_Selection = wd_Doc.Application.Selection
    wd_Selection.InsertBefore str_Text

    'Zugriff auf 'virtuelle' Markierung
    'wr_Range muss auf das ganze Dokument gesetzt werden !
    Set wr_Range = wd_Doc.Content
    'Suche in E-Mail Text
    With wr_Range.Find
        .Forward = True
        .ClearFormatting
        .MatchWholeWord = True
        .MatchCase = False
        .Wrap = wdFindStop
        .MatchWildcards = True
        .Text = "#%*%#"
    End With
    b_return = True
    Do While b_return
        b_return = wr_Range.Find.Execute
        If b_return Then
            ' Es wurde gefunden
            str_Text = wr_Range.Text
            'schneide den Anfangstext und das Ende ab
            'str_TextID = Mid$(str_TextID, 11, Len(str_TextID) - 12)
            MsgBox ("Es wurde noch folgender Schlüssel gefunden:" & vbCrLf & str_Text)
        End If
    Loop
    'aktiv Range ändern
    'wr_Range muss auf das ganze Dokument gesetzt werden !
    Set wr_Range = wd_Doc.Content
    wr_Range.Start = wr_Range.Start + 20
    wr_Range.End = wr_Range.End - 20
    'Text formatieren
    With wr_Range.Font
        .ColorIndex = wdBlue
        .Bold = True
        .Italic = True
        .Underline = wdUnderlineDotDashHeavy
    End With

    'Freigeben der verwendeten Variablen
    Set oi_Inspector = Nothing
    Set om_Item = Nothing
    Set wd_Doc = Nothing
    Set wd_Selection = Nothing
    Set wr_Range = Nothing
End Sub

Gruz $3v|\|

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top