Anzeige
Archiv - Navigation
1692to1696
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

Sammelemail / Serienemail

Sammelemail / Serienemail
15.05.2019 21:57:33
Florian
Hallo zusammen,
ich möchte ein Makro erstellen welches eine Tabelle auswertet. Diese Tabelle enthält je Zeile ein Material, welches für den Auftrag benötigt wird. In einer Spalte steht der jeweilige Hersteller. Nun sollen alle Materialien eines Hersteller gefiltert werden und als gefilterte Tabelle in Email eingefügt werden. Die Angaben für Emailadresse, Betreff und Text der Email soll aus einer weiteren Tabelle dem entsprechenden Lieferanten/ Hersteller zugeteilt werden (wie ein S- Verweis). Es soll in einem Wisch für alle Hersteller/Lieferanten eine Bestellungsemail erzeugt werden. Die Emails soll aber nicht versendet werden, da Stückzahlen und dergleichen noch Manuel (nach Ablauf des Makros) angepasst werden müssen. Nach Ablauf des Makros habe ich dann z.B. zehn geöffnete Emails für meine Lieferanten. In jeder Email ist die Tabelle im Textbereich eingefügt mit den jeweiligen Materialien.
Grundsätzlich ist mir klar das ich hier mit einer Schleife arbeiten sollte. Wie ich aber alle meine Anforderungen in Makro verpack weiß ich leider nicht.
So ich hoffe ich habe mich richtig und verständlich ausgedrückt. Wenn es für euch einfacher zu verstehen ist, kann ich gerne eine Vorgabe- Datei erstellen.

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sammelemail / Serienemail
16.05.2019 07:00:36
MCO
Guten Morgen!
Fang mal langsam an:
Erstmal die Bereiche filtern, die angeschrieben werden sollen und auslesen der Lieferanten.
Da wieder mal keine Tabelle / Muster mitgeliefert ist, musst du den code selbst anpassen.
Die Zeilen hab ich jeweils kommmentiert.
Sub Erinnerungsfunktion()
Dim bis As Date
Dim lz As Long
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData 'filter löschen
bis = Date - 14 'Datum-Grenze setzen
Range("A3:P3").AutoFilter 4, "=nein" 'Filter für Bereich, 4te spalte
Range("A3").AutoFilter 5, "
Das Mail-verfassen mach erstmal später.
Gruß, MCO
Anzeige
AW: Sammelemail / Serienemail
16.05.2019 21:58:00
Florian
Hallo MCO, vielen Dank für deine schnelle Antwort.
Ich sehe aber schon das ich mir mit meiner Faulheit keinen gefallen tue. Deswegen habe ich eine Beispieldatei erstellt, das du dir mal ein Bild von den Gegebenheiten machen kannst.
Ich verstehe das mit dem Datumsbereich nicht. Was hat das mit meiner Sache zu tun?
Gruß Flo
AW: Sammelemail / Serienemail
17.05.2019 13:53:59
peterk
Hallo Florian
Nachfolgender Code sollte Deine "Wünsche" erfüllen

Sub Erinnerungsfunktion()

    Dim lz As Long
    Dim objDic As Object
    Dim i As Long
    Dim k As Variant

    If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData    'Filter löschen 
    lz = Range("A" & Rows.Count).End(xlUp).Row                'letzte Zeile 

    With Worksheets("Zwischenablage")    'Tabellenname anpassen 

        'eindeutige Lieferanten holen 
        Set objDic = CreateObject(Class:="Scripting.Dictionary")
        For i = 2 To lz
            If Not objDic.Exists(Key:=.Cells(i, 4).Text) Then

                objDic.Add Key:=.Cells(i, 4).Text, Item:=0
            End If
        Next i
    End With
    
    For Each k In objDic.keys
      Debug.Print k
      ActiveSheet.Range("A:H").AutoFilter Field:=4, Criteria1:=k
      Send_Email
    Next k
    Set objDic = Nothing
    
End Sub

Private Sub Send_Email()
    Dim objOL As Object
    Dim objMail As Object
    Dim sHtml As String

    On Error Resume Next
    Set objOL = GetObject(, "OUTLOOK.Application")
    If objOL Is Nothing Then
        Set objOL = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0

    If Not objOL Is Nothing Then
        Set objMail = objOL.CreateItem(0)

        With objMail
            ' --- Signatur retten --- 
            .BodyFormat = 2    'olFormatHTML 
            .GetInspector
            sHtml = .HtmlBody
            ' ----------------------- 
            .To = "test@info.de"
            .Subject = "Betreff"
            
            'Signatur dranhängen 
            .HtmlBody = "Hallo liebe Freunde" & "<br>" & _
                        "Hallo liebe Feinde" & "<br>" & _
                        "Hallo liebes Universum " & "<br>" & _
                        RangetoHTML() & "" & sHtml
            .Display
        End With
    Else
        MsgBox "Auf diesem PC/Notebook ist kein Outlook installiert!", _
               vbMsgBoxSetForeground + 16, "zur Information..."

    End If

    Set objOL = Nothing
    Set objMail = Nothing

End Sub

Function RangetoHTML() As String
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim PO As PublishObject

    TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

    For Each PO In ActiveWorkbook.PublishObjects
        PO.Delete
    Next PO

    Set PO = ActiveWorkbook.PublishObjects.Add(SourceType:=xlSourceAutoFilter, _
                                               Filename:=TempFile, _
                                               Sheet:="zwischenablage", _
                                               HtmlType:=xlHtmlStatic, _
                                               DivID:="Test")
    PO.AutoRepublish = False
    PO.Publish (True)

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.readall
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")

    Kill TempFile

    Set ts = Nothing
    Set fso = Nothing
    Set PO = Nothing
End Function


VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 15 - mit VBAHTML 12.6.0



Anzeige
AW: Sammelemail / Serienemail
19.05.2019 13:28:28
Florian
Hallo peterk,
vielen Dank für den tollen Code. Jedoch bleibt ein Wunsch noch offen. Vielleicht hast du ne Lösung.
Ich würde gerne für jeden Lieferanten die Passende Anrede, Emailadresse, Liefertermin und Schlußtext.
Sollte von schema wie in Sverweis ablaufen. In dem Arbeitsblatt "einstellung_anrede" Stehen die entsprechenden angaben zu dem Jeweiligen Lieferanten.
Wäre es mögich das du das noch berücsichtigt?
Schönen Sonntag noch.
AW: Sammelemail / Serienemail
20.05.2019 12:01:32
peterk
Hallo
Sub Erinnerungsfunktion()

    Dim lz As Long
    Dim objDic As Object
    Dim objDicEmail As Object
    Dim i As Long
    Dim k As Variant

    If Worksheets("Zwischenablage").FilterMode Then Worksheets("Zwischenablage").ShowAllData    'Filter löschen 


    With Worksheets("Zwischenablage")    'Tabellenname anpassen 
        lz = .Range("A" & .Rows.Count).End(xlUp).Row                'letzte Zeile 
        'eindeutige Lieferanten holen 
        Set objDic = CreateObject(Class:="Scripting.Dictionary")
        For i = 2 To lz
            If Not objDic.Exists(Key:=.Cells(i, 4).Text) Then

                objDic.Add Key:=.Cells(i, 4).Text, Item:=0
            End If
        Next i
    End With
    With Worksheets("Einstellung_Anrede")    'Tabellenname anpassen 
        lz = .Range("A" & .Rows.Count).End(xlUp).Row                'letzte Zeile 
        'eindeutige Lieferanten holen 
        Set objDicEmail = CreateObject(Class:="Scripting.Dictionary")
        For i = 2 To lz
            If Not objDicEmail.Exists(Key:=.Cells(i, 1).Text) Then

                objDicEmail.Add Key:=.Cells(i, 1).Text, Item:=i
            End If
        Next i
    End With

    For Each k In objDic.keys
        Worksheets("Zwischenablage").Range("A:H").AutoFilter Field:=4, Criteria1:=k
        Send_Email objDicEmail(k)
    Next k
    Set objDic = Nothing

End Sub

Private Sub Send_Email(TextIdx As Long)

    Dim objOL As Object
    Dim objMail As Object
    Dim sHtml As String
    Dim StartText As String
    Dim EndText As String
    
    On Error Resume Next
    Set objOL = GetObject(, "OUTLOOK.Application")
    If objOL Is Nothing Then
        Set objOL = CreateObject("Outlook.Application")
    End If
    On Error GoTo 0

    If Not objOL Is Nothing Then
        Set objMail = objOL.CreateItem(0)

        With objMail
            ' --- Signatur retten --- 
            .BodyFormat = 2    'olFormatHTML 
            .GetInspector
            sHtml = .HtmlBody
            ' ----------------------- 
            .To = Worksheets("Einstellung_Anrede").Cells(TextIdx, 2).Text
            .Subject = "Betreff"
            
            StartText = "<html> <head> <style>  p  { font-size: 22px; } </style> </head> <body> <p>  " & _
                        Replace(Worksheets("Einstellung_Anrede").Cells(TextIdx, 3).Text, vbLf, "<br>") & _
                        "</p> </body> </html>"
                        
            EndText = "<html> <head> <style>  p  { font-size: 22px; } </style> </head> <body> <p>  " & _
                        Replace(Worksheets("Einstellung_Anrede").Cells(TextIdx, 4).Text, vbLf, "<br>") & _
                        "</p> </body> </html>"
                                   
            'Signatur dranhängen 
            .HtmlBody = StartText & _
                        RangetoHTML() & _
                        EndText & _
                        sHtml
            .Display
        End With
    Else
        MsgBox "Auf diesem PC/Notebook ist kein Outlook installiert!", _
               vbMsgBoxSetForeground + 16, "zur Information..."

    End If

    Set objOL = Nothing
    Set objMail = Nothing

End Sub

Function RangetoHTML() As String
    Dim fso As Object
    Dim ts As Object
    Dim TempFile As String
    Dim PO As PublishObject

    TempFile = Environ$("temp") & "\" & Format(Now, "dd-mm-yy h-mm-ss") & ".htm"

    For Each PO In ActiveWorkbook.PublishObjects
        PO.Delete
    Next PO

    Set PO = ActiveWorkbook.PublishObjects.Add(SourceType:=xlSourceAutoFilter, _
                                               Filename:=TempFile, _
                                               Sheet:="zwischenablage", _
                                               HtmlType:=xlHtmlStatic, _
                                               DivID:="Test")
    PO.AutoRepublish = False
    PO.Publish (True)

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.GetFile(TempFile).OpenAsTextStream(1, -2)
    RangetoHTML = ts.readall
    ts.Close
    RangetoHTML = Replace(RangetoHTML, "align=center x:publishsource=", _
                          "align=left x:publishsource=")

    Kill TempFile

    Set ts = Nothing
    Set fso = Nothing
    Set PO = Nothing
End Function




VBA/HTML-CodeConverter, AddIn für Office 2002-2016 - in VBA geschrieben von Lukas Mosimann. Projektbetreuung:RMH Software & Media

Code erstellt und getestet in Office 15 - mit VBAHTML 12.6.0


Anzeige
AW: Sammelemail / Serienemail
20.05.2019 13:08:13
Florian
Hallo peterk,
vielen lieben Dank für die geile Lösung. Da habe ich aller höchsten Respekt vor dir. Die Aufgabenstellung wäre für mich so nicht zu lösen gewense.
Gruß Flo
AW: Sammelemail / Serienemail
17.05.2019 12:49:00
MCO
Hallo Flo!
Das war nur aus meinem Code stehen geblieben den Filter mußt du selbst einstellen.
Bei mir war es an ein Datum gebunden.
Die Datei kann ich aktuell gerade nicht runterladen (Server blockt es :-(...)
Versuch es mal zu verwenden.
Gruß, MCO

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige