Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1736to1740
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

manchmal funktioniert es

manchmal funktioniert es
02.02.2020 13:54:47
Itryit
Hallo zusammen,
ich habe für die Arbeit mehrere Makros erstellt, die alle sehr ähnlich aussehen und mir und meinen Kollegen die Arbeit etwas vereinfachen sollen. Ich finde leider keine zufrieden stellende Lösung und bitte daher um Rat.
Ich habe ein VBA-Makro geschrieben, welches eine E-Mail erstellt mit gewissen Parametern. Leider funktioniert es nicht zuverlässig. Manchmal fehlen Inhalte, manchmal führt er nicht die exakte Reihenfolge aus und machmal gibt er ne Fehlermeldung aus. Aber nach mehrfachen ausführen des Makros funktioniert es irgendwann, aber ich verstehe nicht warum?
Ich habe mal ein paar Kommentare hinzugefügt, damit man nachvollziehen kann, was ich da vor habe.

Sub Test()
'Screenshot erstellen
ThisWorkbook.Worksheets("Test").Range("A1:G33").CopyPicture xlScreen, xlBitmap
' Variablen erstellen
Dim oApp As Object
Dim Signatur As Object
Set oApp = CreateObject("Outlook.Application")
Set Signatur = CreateObject("Outlook.Application")
On Error Resume Next
'E-Mail erstellen
With oApp.CreateItem(0)
Application.Wait (Now + TimeValue("0:00:01"))
.To = ThisWorkbook.Worksheets("Seite_1").Range("D45").Value
.Subject = ThisWorkbook.Worksheets("Seite_1").Range("D44").Value
.CC = ThisWorkbook.Worksheets("Seite_1").Range("D46").Value
.Body = ThisWorkbook.Worksheets("Seite_1").Range("C49").Value
.Display
SendKeys "^{END}", True '
SendKeys "~", True      '
SendKeys "^v", True     ' Bild einfügen
SendKeys "~", True      '
.Recipients.ResolveAll
Application.Wait (Now + TimeValue("0:00:01"))
With Signatur.CreateItem(0) 'Signatur kopieren aus einer leeren E-Mail
Application.Wait (Now + TimeValue("0:00:01"))
.Display
SendKeys "{TAB}", True
SendKeys "{TAB}", True
SendKeys "{TAB}", True
SendKeys "^a", True
SendKeys "^c", True
SendKeys "%{F4}"
End With
SendKeys "^v", True
SendKeys "{PGUP}", True
SendKeys "{PGUP}", True
Application.Wait (Now + TimeValue("0:00:01"))
End With
On Error GoTo 0
Set oApp = Nothing
Set Signatur = Nothing
End Sub

Wäre nice, wenn mir jemand weiterhelfen könnte.
@Signatur. Wäre schön wenn mir jemand eine elegantere und alternative Lösung mitteilen könnte.
MfG Itryit

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: manchmal funktioniert es
02.02.2020 14:58:41
volti
Hallo Itryit,
mit SendKeys solltest Du möglichst nicht arbeiten.
Und für die eigene Signatur (hoffe die willst Du auch) gibt es 'ne einfache Methode.
Lade doch einfach mal Deine Mappe hoch (oder zumindest eine mit dem Sheet_1 drin), dann überarbeite ich Dir das gerne...
PS: Der Bereich soll dann als Excelbereich oder als Bild darein?
viele Grüße
Karl-Heinz
AW: manchmal funktioniert es
02.02.2020 15:17:39
volti
Hallo Itryit,
probiere mal, ob Dir dieses hier vielleicht schon reicht und funkioniert.
Falls nicht, oder Anlagen dran sollen, der body-Text formatiert werden soll usw. kannst Du Dich ja wieder melden.
Option Explicit
Option COMPARE TEXT
Sub Mail_Senden_Formatierung()
'Sendet eine formatierte Mail mit Signatur
 Dim WSh As Worksheet, sMailText As String
 
 Set WSh = ThisWorkbook.Sheets("Seite_1")
 
 With CreateObject("Outlook.Application").CreateItem(0)
  .BodyFormat = 3          'HTML-Format, Angabe optional
  .To = WSh.Range("D45").Value
  .CC = WSh.Range("D46").Value
'  .Bcc = wsh.Range("D46").Value
  .Subject = WSh.Range("D44").Value
  sMailText = WSh.Range("C49").Value
  .GetInspector
  .HTMLBody = Replace(sMailText, vbLf, "<br>") _
   & Range2Html(ThisWorkbook.Sheets("Test").Range("A1:G33")) & .HTMLBody
  .Display
'  .Recipients.ResolveAll
 End With
End Sub
Private Function Range2Html(oBereich As Range) As String
'Gibt den angegebenen Bereich als HTML zurück
 Dim sTmpFile As String, iFF As Integer
 sTmpFile = Environ$("temp") & "\" & Format(Now, "ddmmyyhhmmss") & ".htm"
 With oBereich.Parent.Parent.PublishObjects.Add( _
      SourceType:=xlSourceRange, _
      Filename:=sTmpFile, _
      Sheet:=oBereich.Parent.Name, _
      Source:=oBereich.Address, _
      HtmlType:=xlHtmlStatic)
  .Publish Create:=True
 End With
 iFF = FreeFile
 Open sTmpFile For Input As iFF
 Range2Html = Replace(Input(LOF(iFF), iFF), "align=center x:publishsource=", _
              "align=left x:publishsource=")
 Close iFF
 Kill sTmpFile
End Function

viele Grüße
Karl-Heinz

Anzeige
AW: manchmal funktioniert es
02.02.2020 18:19:44
Itryit
Hallo Karl-Heinz,
das ist echt Top. Ich hätte nie mit einer so schnellen Antwort gerechnet. Scheint wirklich nie eine Fehlermeldung zu kommen. Jetzt werde ich mich da mal durchbeißen, damit ich das verstehe und das nächstes mal selbst hinzubekommen. :)
So wie in deiner Nachricht davor bräuchte ich den Bereich als Bild und nicht den Excelbereich, da sonst die bedingte Formatierung dabei verschwindet. Hast du dafür auch noch eine Lösung?
Vielen Dank Schonmal Itryit
AW: manchmal funktioniert es
02.02.2020 18:40:51
volti
Hallo Itryit,
gerne schaue ich noch mal nach Einfügung als Bild und melde mich dann wieder.
Aber vorab: Die bedingte Formatierung wird hier auch mitgenommen; habe es grad noch mal probiert. Die aufgrund der bedingten Formatierung gerade aktive Hintergrundfarbe erscheint auch in der Mail.
viele Grüße
Karl-Heinz
Anzeige
AW: manchmal funktioniert es
02.02.2020 19:13:45
volti
Hier noch mal mit eingebettetem Bild.
Guck mal, ob es funktioniert:
Option Explicit
Option COMPARE TEXT
Sub Mail_Senden_Formatierung_Bild()
'Sendet eine formatierte Mail mit Signatur
 Dim WSh As Worksheet
 Dim sMailText As String, sDatei As String
 
 Set WSh = ThisWorkbook.Sheets("Seite_1")
 sDatei = RangeExport(ThisWorkbook.Sheets("Test").Range("A1:G33"))
 
 With CreateObject("Outlook.Application").CreateItem(0)
  .BodyFormat = 3          'HTML-Format, Angabe optional
  .To = WSh.Range("D45").Value
  .CC = WSh.Range("D46").Value
'  .Bcc = wsh.Range("D46").Value
  .Subject = WSh.Range("D44").Value
  sMailText = WSh.Range("C49").Value
  .GetInspector
  .HTMLBody = Replace(sMailText, vbLf, "<br>") _
            & "<br><img src='" & sDatei _
            & "'><br>" & .HTMLBody
  .display
'  .Recipients.ResolveAll
 End With
 Kill sDatei
End Sub
Function RangeExport(oRng As Range, Optional sErw As String = "jpg") As String
'Excelbereich als Bilddatei
 RangeExport = Environ$("temp") & "\" & Format(Now, "ddmmyyhhmmss") & Replace(CStr(Timer), ",", "") & "." & sErw
 On Error GoTo Fehler
 With oRng
   .CopyPicture Appearance:=xlScreen, Format:=xlPicture 'xlBitmap 'xlPicture
    With ActiveSheet.ChartObjects.Add(.Left, .Top, .Width, .Height)
      .Activate
      .Chart.Paste
      .Border.LineStyle = -4142           'Ohne Rahmen
      .Chart.Export RangeExport
    End With
    ActiveSheet.ChartObjects(ActiveSheet.ChartObjects.Count).Delete
 End With
 Exit Function
Fehler:
 RangeExport = ""
End Function

viele Grüße
Karl-Heinz

Anzeige
AW: manchmal funktioniert es
02.02.2020 20:11:16
Itryit
Vielen Dank nochmal.
Ich habe es gerade zuhause getestet und da bleibt er immer wieder dort hängen (zuhause habe ich bereits Office 2019):
With ActiveSheet.ChartObjects.Add(.Left, .Top, .Width, .Height)
Ich habe deine Schutzfunktion Fehler mal raus gemacht, da sonst immer nur ein Kommentar erscheint.
Dabei kommt immer folgende Fehlermeldung:
Laufzeitfehler '1004' Anwendungs- oder objektdefinierter Fehler.
Ich teste es morgen aber erstmal auf Office 2013 aus.
AW: manchmal funktioniert es
02.02.2020 22:08:53
Itryit
Nochmal als kleiner Zusatz.
Ich meine keine Farben bei bedingte Formatierungen sondern sowas wie Ampel oder Pfeile :)
Anzeige
AW: manchmal funktioniert es
03.02.2020 11:28:42
volti
Hallo Itryit,
hier noch 'ne Variante ohne Datei.
Je nach Outlook-Version scheint mal das eine, mal das andere nicht, anders oder auch unzuverlässig zu funktionieren.
Sub Mail_Senden_Formatierung_Bild2()
'Sendet eine formatierte Mail mit Signatur
 Dim WSh As Worksheet, wdRng As Object
 Dim sMailText As String, sBild As String, sSignatur As String
 
 ThisWorkbook.Sheets("Test").Range("A1:G25") _
   .CopyPicture Appearance:=xlScreen, Format:=xlPicture 'xlBitmap
 
 Set WSh = ThisWorkbook.Sheets("Seite_1")
 With CreateObject("Outlook.Application").CreateItem(0)
  .BodyFormat = 3          'HTML-Format, Angabe optional
  .To = WSh.Range("D45").Value
  .CC = WSh.Range("D46").Value
  .Subject = WSh.Range("D44").Value
  .GetInspector
  sSignatur = .htmlbody
  sMailText = WSh.Range("C49").Value & "<br>#Bild1#<br>"
  .htmlbody = sMailText
  .display
  Set wdRng = .GetInspector.WordEditor.Range
  wdRng.WholeStory
  wdRng.Paste
  sBild = .htmlbody
  If InStr(sBild, "<img ") > 0 Then
    sBild = Mid$(sBild, InStr(sBild, "<img "))
    sBild = Left(sBild & ">", InStr(sBild & ">", ">"))
    sMailText = Replace(sMailText, "#Bild1#", sBild)
  End If
  .htmlbody = Replace(sMailText, vbLf, "<br>") & sSignatur
 End With
 Set wdRng = Nothing
End Sub

viele Grüße
Karl-Heinz

Anzeige
AW: manchmal funktioniert es
03.02.2020 11:24:43
volti
Blatt ist aber nicht schreibgeschützt, oder?
AW: manchmal funktioniert es
04.02.2020 08:13:34
Itryit
Hallöchen,
ja es war schreibgeschützt. Das tut mir leid für den erhöhten Aufwand.
Vielen Dank, dass du dir meinen Fall angesehen hast und mir sehr weiter geholfen hast. Ich kann sicherlich einiges lernen von deinem Code.
Es funktioniert alles super. :)
AW: manchmal funktioniert es
04.02.2020 08:49:47
volti
Hallo Itryit,
danke für die Rückmeldung. :-)
Falls das Blatt schreibgeschützt sein soll, kannst Du ja, falls Du diesen Code verwendest, vor dem Paste das Blatt entschützen (Blatt.Unprotect) und danach den Schreibschutz wieder setzen (Blatt.Protect)
viele Grüße
Karl-Heinz
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige