Excel, automatisch Outlook öffnen und E-Mail generieren.

  • Excel

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von volti.

    Excel, automatisch Outlook öffnen und E-Mail generieren.

    Hallo Zusammen,


    wenn das Makro ausgeführt wird, wird die entsprechende Zeile durch die Artikelnummer gefunden und aus dieser Tabelle in ein anderes Tabellenblatt übertragen.

    Ich möchte das Outlook geöffnet wird und ein paar konstante aber auch variable Werte in die Betreffzeile als auch in die E-Mail geschrieben werden.
    Beispiel Betreffzeile: Artikel C3 C6 C8 wurde fertiggestellt

    Bei den C3,6,8 handelt sich es um die variablen die ja nicht immer in C stehen sondern entsprechend der richtigen Zeile über das Makro oben zugewiesen werden müssen.
    Des weiteren würde ich gerne noch einen E-Mail Text vorgeben, die E-Mail kann durch den Anwender noch kontrolliert werden und muss anschließend manuelle versendet werden.

    Wie kann ich das ganze am besten lösen?

    Visual Basic-Quellcode

    1. Sub AuftragFertigBuchen()
    2. Dim Eingabe As Variant
    3. Dim finden As Range
    4. Dim SpalteErledigtAm As Integer
    5. SpalteErledigtAm = 6
    6. Set wbDatenÜbersicht = ThisWorkbook.Worksheets("Daten-Übersicht")
    7. Set wbBearbAufträge = ThisWorkbook.Worksheets("bearbeitete Aufträge")
    8. AnzahlSpaltenOV = 22 'Anzahl genutzter Spalten bei "Daten-Übersicht" (OverView/OV)
    9. 'Eingabe des Auftrages. Vorauswahl abhängig von der aktiven/ausgewählten Zelle
    10. Eingabe = InputBox("Welcher Auftrag soll fertig gebucht werden?", "Auftrag buchen", ActiveCell.Value)
    11. If Eingabe <> "" Then
    12. Set finden = wbDatenÜbersicht.Range("C3:C13000").Find(what:=Eingabe, LookAt:=xlWhole) 'in welcher zelle steht die Auftragsnummer?
    13. If Cells(finden.Row, SpalteErledigtAm) <> "" Then
    14. If Not finden Is Nothing And IsEmpty(finden) = False Then 'Überprüfung, ob zu dem eingegebenen Wert eine Zeile gefunden wurde
    15. wbBearbAufträge.Rows(2).Insert 'neue 3.Zeile einfügen
    16. wbDatenÜbersicht.Rows(finden.Row).Copy Destination:=wbBearbAufträge.Range("A2") 'Kopieren der Zeile in "bearbeitete Aufträge"
    17. wbDatenÜbersicht.Rows(finden.Row).Delete 'Löschen der Zeile aus "Daten-Übersicht"
    18. Else
    19. MsgBox "Der eingegebene Auftrag ist nicht in der Liste enthalten. Bitte erneut eingeben."
    20. End If
    21. Else
    22. MsgBox "Der Auftrag kann ohne Enddatum nicht fertig gebucht werden"
    23. End If
    24. End If
    25. Application.ScreenUpdating = True
    26. End Sub
    Für das Versenden eine E-Mail mit Outlook kannst Du dieses Modul nutzen.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Option Private Module
    3. Public olApp As Outlook.Application
    4. ' Der Verweis auf Outlook muss gesetzt sein
    5. ' strTo - Empfängeradresse ggf. durch Semikolon getrennt
    6. ' Subject - Betreff
    7. ' Body - Der Text der E-Mail, falls HTML mit HTML-Formatierung für day Layout
    8. ' CC - Empfängeradresse in CC ggf. durch Semikolon getrennt
    9. ' BCC - Empfängeradresse in BCC ggf. durch Semikolon getrennt
    10. ' Importance - Wichtigkeit 1- normal, 2 - hoch
    11. ' HTML - True E-Mail mit Outlook-Signatur, False E-Mail mit Nur Text
    12. ' Display - True zeigt die E-Mail an, False versendet die E-Mail direkt
    13. ' Attachements - Array mit für Anlagen, die Datei muss mit dem kompletten Pfad angegebnen werden
    14. Public Sub SendEmail(ByVal strTo As String, ByVal Subject As String, ByVal Body As String, _
    15. Optional ByVal CC As String = "", Optional ByVal Bcc As String = "", Optional ByVal Importance As Integer = 1, _
    16. Optional HTML As Boolean = False, Optional Display As Boolean = False, Optional ByVal Attachments As Variant)
    17. On Error GoTo ErrHandling
    18. Dim olMail As Outlook.MailItem
    19. Dim olOldbody As String
    20. If olApp Is Nothing Then
    21. Set olApp = GetObject(, "Outlook.Application")
    22. End If
    23. Set olMail = olApp.CreateItem(olMailItem)
    24. With olMail
    25. .To = strTo
    26. .CC = CC
    27. .Bcc = Bcc
    28. .Subject = Subject
    29. .Importance = Importance
    30. If isArrayEmpty(Attachments) = False Then
    31. Dim strFile As Variant
    32. For Each strFile In Attachments
    33. If FileExists(strFile) = True Then
    34. .Attachments.Add strFile
    35. Else
    36. Dim intPos As Integer
    37. Dim part() As String
    38. str = Replace(strFile, "/", "\")
    39. part = Split(strFile, "\")
    40. MsgBox "Die Datei '" & part(UBound(part)) & "' konnte nicht gefunden werden."
    41. End If
    42. Next
    43. End If
    44. 'HTML ergibt eine E-Mail mit Outlook-Signatur
    45. If HTML Then
    46. olOldbody = .HTMLBody
    47. .HTMLBody = "<html><body>" & Body & olOldbody
    48. Else
    49. .Body = Body
    50. End If
    51. If Display Then
    52. .Display
    53. .GetInspector.Display
    54. Else
    55. .Send
    56. End If
    57. End With
    58. Set olMail = Nothing
    59. Exit Sub
    60. ErrHandling:
    61. Select Case Err.Number
    62. Case 429
    63. Set olApp = CreateObject("Outlook.Application")
    64. Resume Next
    65. Case Else
    66. MsgBox "Fehler bein E-Mail versenden" & vbNewLine & Err.Number & " " & Err.Description
    67. On Error GoTo -1
    68. End Select
    69. End Sub
    70. Public Function FileExists(ByVal strFilePath As String) As Boolean
    71. FileExists = False
    72. On Error Resume Next
    73. If Not Dir(strFilePath) = vbNullString And Not strFilePath = vbNullString Then
    74. FileExists = True
    75. End If
    76. End Function


    Die Prozedur SendEmail benötigt mindestens den Empfänge, den Betreff und den E-Mail-Text.
    Es wird geprüft, ob Outlook geöffnet ist, ansonsten wird Outlook gestartet.
    Ich habe daraus ein Tutorial gemacht: E-Mail über Outlook versenden
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „INOPIAE“ ()

    Schon mal danke dafür, aber dies löst mein Problem die Betreffzeile variabel zu füllen nicht.

    Ich möchte doch wie oben beschrieben, verschiedene Zellen in die Betreffzeile schreiben, je nachdem welche Auftragsnummer gewählt wurde.
    Wie kann ich dies umsetzen?



    So kann ich die entsprechende Zeile in der die Auftragsnummer steht finden.

    Wie kann ich jetzt die entsprechenden Zellen z.B. 6,7,10 ansprechen und in die Betreffzeile der E-Mail schreiben?

    Visual Basic-Quellcode

    1. Set finden = wbDatenÜbersicht.Range("C3:C13000").Find(what:=Eingabe, LookAt:=xlWhole) 'in welcher zelle steht die Auftragsnummer?


    Beiträge zusammengefügt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Versuchs mal so, wenn Dein Code den Auftrag gefunden hat:

    Visual Basic-Quellcode

    1. Dim zeile As Long
    2. zeile = finden.row
    3. Dim Subject As String
    4. Subject = "Hier die Daten zu " & wbDatenÜbersicht.cells(zeile,6) &" " & wbDatenÜbersicht.cells(zeile,7) &" " & wbDatenÜbersicht.cells(zeile,10)
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).

    INOPIAE schrieb:


    Public olApp As Outlook.Application

    ' Der Verweis auf Outlook muss gesetzt sein

    Ich würde auf Early-Binding verzichten. Stattdessen Late-Binding nutzen.

    VB.NET-Quellcode

    1. Sub Test()
    2. Dim olApp as Object
    3. Set olApp = CreateObject("Outlook.Application")
    4. With olApp.CreateItem(0)
    5. End With
    6. End Sub

    Super danke für eure Hilfe! Es hat funktionier und das Tutorial ist mega.

    Eine laienhafte Frage müsst Ihr mir noch zugestehen. :)
    Was spricht dagegen, den E-Mail Versand mit so einem simplen Code umzusetzen?

    Visual Basic-Quellcode

    1. Set MyOutApp = CreateObject("Outlook.Application")
    2. Set MyMessage = MyOutApp.CreateItem(0)
    3. With MyMessage
    4. .To = Range("A1")
    5. .Subject = (Subject)
    6. .body = "Hallo," & vbCrLf & vbCrLf & "anbei der Link zu dem im Betreff genannten Artikeln."
    7. .Display
    8. End With
    9. Set MyOutApp = Nothing
    10. Set MyMessage = Nothing

    Thepinky schrieb:

    .body = "Hallo," & vbCrLf & vbCrLf & "anbei der Link zu dem im Betreff genannten Artikeln."


    Ich sehe hier keinen Link, auf den Du verweist.

    Die Funktion, die ich Dir gegeben habe, kann in einem größeren Projekt immer wieder aufgerufen werden, ohne das man den Code noch einmal anpassen muss. Die Funktion deckt auch alle Möglichkeiten beim Versand einer E-Mail mit ab.
    Da ich faul bin, habe ich diesen Code in einem Modul, dass ich bei Bedarf, dann einfach in das Projekt importiere. Dann brauche ich nur noch die Funktion SendEmail mit den notwendigen Parametern aufrufen und ich bin fertig.

    Wenn Dir Dein Code reicht, ist ja alles in Ordnung.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallo zusammen,

    mir reicht's auch so incl. Signatur

    VB.NET-Quellcode

    1. Sub Mail()
    2. With CreateObject("Outlook.Application").CreateItem(0)
    3. .Getinspector.Display
    4. .To = Range("A1")
    5. .Subject = (Subject)
    6. .body = "Hallo," & vbCrLf & vbCrLf & "anbei der Link zu dem im Betreff genannten Artikeln." _
    7. & vbCrLf & .body ' Optional mit Signatur
    8. End With
    9. End Sub

    Gruß KH