Problem mit Outlook VBA .BodyFormat olFormatHTML olFormatRic

Moderator: ModerationP

Problem mit Outlook VBA .BodyFormat olFormatHTML olFormatRic

Beitragvon $3v|\| » 18. Sep 2018, 12:42

Hallo zusammen
verwendetes System: Windows 7, Outlook 2013
Ich habe nur grundlegende Erfahrung in VBA, HTML und CSS (Gelegenheitsprogrammierer)

ich habe folgendes Problem:

Ich möchte beim E-Mail schreiben (auch beim Antworten und Weiterleiten) mit VBA einen bestimmten Text (mit Sonderzeichen %,:,= und #) durch einen anderen Text ersetzen.
Die Formatierung sollte erhalten bleiben. Dadurch kommt nur RichText und HTML E-Mail in Frage.
Da ich keinerlei Erfahrung mit Rich-Text Bearbeitung habe und dies nicht wirklich trivial ist bleib nur noch HTML E-Mail übrig.

Da das VBA-Script auch für Weiterleiten und Antworten funktionieren soll, kann ich den myItem.HTMLBody auch nicht einfach mit neuem Code überschreiben.

Wenn ich die E-Mail als HTML E-Mail bearbeite, dann erhalte ich erstens einen wahnsinnig großen Overhead im HTML-HEAD ( so groß, dass myItem.HTMLBody nicht einmal mehr in den Direktbereich passt) und zweitens zerhackt es mir meinen Text im HTML-BODY mit unnötig vielen HTML-Tags (z.B. <body lang=DE link="#0563C1" vlink="#954F72" style='tab-interval:35.4pt'><div class=WordSection1><p class=MsoNormal>#%das%#ist#%Text%#<o:p></o:p></p><p class=MsoNormal>#%DAS%#IST#%MEHR%#TEXT#%<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>#%DAS%#IST#% VIEL#%MEHR%#TEXT#%<o:p></o:p></p><p class=MsoNormal><o:p>&nbsp;</o:p></p></div></body></html>)
Es werden sogar einzelne Worte durch Tags zerteilt. (z.B. <p class=MsoNormal><span lang=EN-US style='mso-ansi-language:EN-US'>#%<span class=SpellE>ein:Text</span>%#<o:p></o:p></span></p>). Dies macht die Suche im Text unmöglich.

Ich könnte in myItem.Body suchen ob der Text vorkommt, aber wie bekomme ich dann wieder den Bezug zu der Stelle im myItem.HTMLBody?

Wenn ich im E-Mail-Editor das Format auf RichText umstelle, dann wird der HTMLBody deutlich besser lesbar und aufgeräumter. :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META NAME="Generator" CONTENT="MS Exchange Server version rmj.rmm.rup.rpr">
<TITLE></TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">das</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">%#</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">ist</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">#%Text%#</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">DAS</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">%#</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">IST</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">MEHR</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">%#</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">TEXT</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"></SPAN></P>

<P DIR=LTR><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">DAS</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">%#</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">IST</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri"></FONT></SPAN><SPAN LANG="de"> <FONT FACE="Calibri">VIEL</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">MEHR</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">%#</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">TEXT</FONT></SPAN><SPAN LANG="de"><FONT FACE="Calibri">#%</FONT></SPAN><SPAN LANG="de"></SPAN></P>

<P DIR=LTR><SPAN LANG="de"></SPAN></P>

</BODY>
</HTML>


Das Problem ist hier aber, dass dies nur eine Ausgabekonvertierung ist und dass nicht alle Formatierungen der E-Mail enthalten sind. Ebenso sind hier keinerlei Bilder enthalten, die in der Original E-Mail eingefügt wurden.

Ein ähnliches Problem habe ich, wenn ich per VBA eine HTML E-Mail auf RichText setze und anschließend wieder zurück nach HTML:
Code: Alles auswählen
myItem.BodyFormat = olFormatRichText
myItem.BodyFormat = olFormatHTML

Dann ist zwar der HTML Code bereinigt (zwar nur bis ich im E-Mail Editor wieder eine Änderung mache) aber alle Bilder in der E-Mail sind verschwunden. Unter myItem.Attachments sind sie noch vorhanden, doch der Bezug in der E-Mail fehlt.
Ausserdem verliert der Text meistens die Formatierung, da nach der Umstellung erstens eine andere Textart gewählt ist und zweitens in den meisten HTML-Tags zu viele Anführungszeichen sind:
<BR><SPAN LANG="de"><FONT FACE=""Calibri"">Calibri</FONT></SPAN>
<BR><SPAN LANG="de"><FONT FACE=""Tahoma"">Tahoma</FONT></SPAN>
<BR><SPAN LANG="de"><FONT FACE=""Arial"">Arial</FONT></SPAN>

Diese kann ich zwar per VBA ersetzen aber dann darf auch sonst niergends im Text ein doppeltes Anführungszeichen sein, was ich nicht garantieren kann.

Mein Code zum testen:
Code: Alles auswählen
Option Explicit
Public Sub Analysiere_EMail()
    Dim myItem As Outlook.MailItem
    Dim MyInspector As Outlook.Inspector
    Dim str_plainText As String
    Dim strRTF As String
    Dim strHTML As String
    Dim strSearch As String
    Dim strReplace As String

    Set MyInspector = Application.ActiveInspector()
    Set myItem = MyInspector.CurrentItem
    Debug.Print "-------------------------------------------"
    Select Case myItem.BodyFormat
        Case olFormatHTML
            Debug.Print "Format = HTML"
        Case olFormatPlain
            Debug.Print "Format = Plain"
        Case olFormatRichText
            Debug.Print "Format = Rich-Text"
        Case olFormatUnspecified
            Debug.Print "Format = Unspecified"
        Case Else
            ' Nicht unterstützt
            Debug.Print "Format = Fehlerhaft"
    End Select
    Debug.Print myItem.Attachments.Count
    Stop
    Debug.Print "-------------------------------------------"
    str_plainText = myItem.Body
    Debug.Print str_plainText
    Stop
    Debug.Print "-------------------------------------------"
    strRTF = StrConv(myItem.RTFBody, vbUnicode)
    Debug.Print strRTF
    Stop
    Debug.Print "-------------------------------------------"
    strHTML = myItem.HTMLBody
    Debug.Print strHTML
    Stop
    Debug.Print "-------------------------------------------"
Stop
'######################################
myItem.BodyFormat = olFormatRichText

Stop
    Debug.Print "-------------------------------------------"
    strRTF = StrConv(myItem.RTFBody, vbUnicode)
    Debug.Print strRTF
    Stop
    Debug.Print "-------------------------------------------"
    strHTML = myItem.HTMLBody
    Debug.Print strHTML
    Stop

    '---------------------------------------------------------
    ' Enthält die Nachricht zuviele Anführungszeichen?
    '---------------------------------------------------------
    strSearch = """""" ' = ""
    strReplace = """"   ' = "

    If InStr(myItem.HTMLBody, strSearch) Then
        Debug.Print "#### zu viele Anführungszeichen ###"
        Stop
        '-----------------------------------------------------
        ' HTML-Nachricht ersetzen, damit Formatierung wieder passt
        '-----------------------------------------------------
        myItem.HTMLBody = Replace(myItem.HTMLBody, strSearch, strReplace)
    End If
    Debug.Print "-------------------------------------------"
Stop
'######################################
myItem.BodyFormat = olFormatHTML
    Stop
    Debug.Print "-------------------------------------------"
    strRTF = StrConv(myItem.RTFBody, vbUnicode)
    Debug.Print strRTF
    Stop
    Debug.Print "-------------------------------------------"
    strHTML = myItem.HTMLBody
    Debug.Print strHTML
    Stop
    Debug.Print "-------------------------------------------"
Stop
End Sub

Das war jetzt sehr viel Text aber ich hoffe, dass jemand versteht was mein Problem ist und dass er/sie mir helfen kann.
Vielleicht kann auch jemand überprüfen, ob das Problem bei anderen Versionen weiterhin besteht.



Danke.
$3v|\|
 

Re: Problem mit Outlook VBA .BodyFormat olFormatHTML olForma

Beitragvon Michael Bauer » 19. Sep 2018, 06:04

Hallo,

Du kannst die Word-Bibliothek nutzen, um Text zu ersetzen.
Michael Bauer
Add-Ins für Microsoft Outlook
Benutzeravatar
Michael Bauer
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 6346
Registriert: 03. Feb 2005, 15:07
Wohnort: Vollersode

Re: Problem mit Outlook VBA .BodyFormat olFormatHTML olForma

Beitragvon $3v|\| » 21. Sep 2018, 16:28

Danke für den Hinweis

Hab inzwischen schon ein bisschen gegoogled aber ich habe kein vernünftiges Tutorial dafür gefunden.
Hat jemand vielleicht einen Tip für mich?

mein aktueller Wissensstand (vielleicht hilft das auch jemandem anderen):
man benötigt folgende Verweise (unter Extras -> Verweise)
' Visual Basic for Applications
' Microsoft Outlook 15.0 Object Library
' OLE Automation
' Microsoft Office 15.0 Object Library
' Microsoft Word 15.0 Object Library

Code: Alles auswählen
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


Mehr kann ich nicht bzw. hab ich nichts gefunden.
Wenn ich versuche z.B. ein wd_Range im Debugger zu öffnen um zu schauen was es sonst noch für Attribute gibt, dann stürzt mir immer Outlook komplett ab und alle meine nicht gespeicherten Änderungen sind über dem Jordan :(

Ich hab auch nicht wirklich Ahnung was der Unterschied zwischen einem ActiveInspector, CurrentItem und dem WordEditor ist. :?:

Eine Unterscheidung von oi_insp.EditorType bringt bei mir nichts - es kommt immer "olEditorWord" (= 4) - egal was ich im E-Mail Editor auswähle:

Code: Alles auswählen
 
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


Kann mir jemand sagen wo ich weitere Informationen finde?
Mit Office 2003 hatte ich noch eine gute offline Doku (und einen guten Macro-Recorder) - Mit Office 2013 finde ich in der online Doku gar nichts mehr. Meistens komme ich nur noch auf eine Microsoft "default" Seite.
Gruz $3v|\|
$3v|\|
 

Re: Problem mit Outlook VBA .BodyFormat olFormatHTML olForma

Beitragvon mmarkus » 22. Sep 2018, 12:34

$3v|\| hat geschrieben:Mehr kann ich nicht bzw. hab ich nichts gefunden.

Ich hab auch nicht wirklich Ahnung was der Unterschied zwischen einem ActiveInspector, CurrentItem und dem WordEditor ist. :?:

Eine Unterscheidung von oi_insp.EditorType bringt bei mir nichts - es kommt immer "olEditorWord" (= 4) - egal was ich im E-Mail Editor auswähle:



Anscheinend schaust du alles außer der onlinehilfe an.

Zum Punkt warum immer olEditorWord:
Since Microsoft Office Outlook 2007, the EditorType property always returns olEditorWord .


WordEditor

Returns the Microsoft Word Document Object Model of the message being displayed. Read-only.


Das weiter Kopieren erspare ich mir mal, da du einfach nur den Begriff im Code markieren und F1 drücken musst um zu der genauen Erklärung zu kommen.
Meine Erfahrung - da ich auch kaum in Outlook programmiere:
Zuerst der Objektkatalog - dann die OnlineHilfe und dann noch die Beispiele in der Hilfe oder im Web.
Wenn dann Punkte unklar sind, oder die OnlineHilfe nicht ausreicht kommt die Hilfe hier im Forum.

Der Zugriff auf den Word Editor erschöpft sich also in einer Anweisung.
Alles weitere ist der Zugriff auf das Word Objektmodell - Hilfe zu Word solltest du aber im Word Forum suchen.

LG Markus
ms access what else
mmarkus
Im Profil kannst Du frei den Rang ändern
 
Beiträge: 1122
Registriert: 16. Apr 2012, 16:07
Wohnort: Vienna

Re: Problem mit Outlook VBA .BodyFormat olFormatHTML olForma

Beitragvon $3v|\| » 24. Sep 2018, 09:33

Danke für die "Einstiegspunkte" in die Online-Hilfe.

Wie ich ja schon geschrieben habe, funktioniert bei mir die Online-Hilfe nicht wirklich.
Aber wie ich es auf die schnelle überrissen habe, hat die Hilfe seit 2003 dennoch deutlich nachgelassen.
Ausserdem: als wirkliches Tutorial für API-Programmierung kann man die Hilfe auch nicht betrachten!

Das Problem kann aber Dank Eurer Hilfe als vorerst gelöst betrachtet werden :D

Gruz $3v|\|
$3v|\|
 


Zurück zu Outlook Forum (provisorisch)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste