Forum des VBA-Tutorials

Emails nach Lieferant versenden (VBA)

DRO1989, Dienstag, 05. Dezember 2017, 11:43 (vor 10 Tagen)

Hallo Zusammen,

ich habe eine Access Datenbank in der ich nach Lieferant eine "temporäre Abfrage" generiere und diese dann in einem Zielpfad ablege.

Nun möchte ich jedoch noch zusätzlich, dass er zu den einzelnen Abfragen, jeweils den Email - Explorer aufruft, sodass ich diese dann per Email direkt an den Lieferanten raussenden kann. Ich stehe nur auf dem Schlauch, wie ich das Ganze machen soll. Perfekt wäre noch, wenn man noch eine Anlage ("Anschreiben zur Ausschreibung") an die Mail hängen kann. Das Anschreiben befindet sich dann auf einem frei wählbaren Laufwerk.

Hier mal mein Code, der momentan nur ablegt:

[Sub ExcelExport()
If IsNull(Me!txt_Pfad) Then
MsgBox "Bitte füllen Sie einen Pfad für den Export aus", vbOKOnly

Else

Dim ExcelZielName As String
ExcelZielName = Me!txt_Pfad & "\"
' Const ExcelZielName = [Me!txt_Pfad] ' + Lieferant + xls
' Abfrage wird automatisch erzeugt und gelöscht
Const tmpAbfrage = "qrytemp_original"
Dim sSQL As String, gSQL As String
Dim qdf As DAO.QueryDef
Dim Grs As DAO.Recordset


' Gruppierung um alle ID's zu ermitteln
Set Grs = CurrentDb.OpenRecordset("SELECT [Lieferant] " & _
"FROM [Filter_Ausschreibung_original] " & _
"GROUP BY [Lieferant];")

Grs.MoveFirst
While Not Grs.EOF
' Generierung und Speicherung einer (temporären) gefilterten Abfrage
sSQL = "SELECT * " & _
"FROM [Filter_Ausschreibung_original] " & _
"WHERE [Lieferant]='" & Grs![Lieferant] & "'"
Debug.Print sSQL
' evtl. alte Abfrage löschen
On Error Resume Next
DoCmd.DeleteObject acQuery, tmpAbfrage
On Error GoTo 0
Set qdf = CurrentDb.CreateQueryDef(tmpAbfrage, sSQL)
'Debug.Print "Export :" & ExcelZielName & Grs![Vendor-Nr] & ".xls"
DoCmd.TransferSpreadsheet acExport, , tmpAbfrage, _
ExcelZielName & " " & Grs![Lieferant] & ".xls", True


Grs.MoveNext
Wend

End If
End Sub]

Danke schon Mal für eure Hilfe!!!

Emails nach Lieferant versenden

PhilS ⌂, Dienstag, 05. Dezember 2017, 13:08 (vor 10 Tagen) @ DRO1989

Nun möchte ich jedoch noch zusätzlich, dass er zu den einzelnen Abfragen, jeweils den Email - Explorer aufruft, sodass ich diese dann per Email direkt an den Lieferanten raussenden kann. Ich stehe nur auf dem Schlauch, wie ich das Ganze machen soll. Perfekt wäre noch, wenn man noch eine Anlage ("Anschreiben zur Ausschreibung") an die Mail hängen kann. Das Anschreiben befindet sich dann auf einem frei wählbaren Laufwerk.

Die zentrale Frage ist, wie versendest du die Emails bzw. wie möchtest du sie versenden?

Wenn du die Emails mit Outlook-Automation sendest, kannst du einfach pro Datensatz eine Email erzeugen und deine exportierte als Anlage anhängen.

Mit dem in Access eingebauten Docmd.Sendobject kannst unabhängig von dem jeweiligen Mail-Client Emails senden, aber du kannst nur jeweils ein bestimmtes Access-Objekt (als PDF oder Excel) automatisch an die Email anhängen.

Emails nach Lieferant versenden

DRO1989, Dienstag, 05. Dezember 2017, 13:38 (vor 10 Tagen) @ PhilS

Hallo PhilS,

danke für den Hinweis.

Die Richtung mit der Outlook - Automation entspricht dem was ich mir vorstelle.

Jedoch komme ich nicht weiter:

Ich muss ja irgendwie dem Code sagen; "Bitte nimm den Datensatz, welcher der aktuellen Lieferantennummer entspricht!"

Im TransferSpreadsheet definiere ich ja auch zunächst Grs!Lieferant. Danach ordne ich über einen Select die temporäre Abfrage dem Grs!Lieferant zu.

Das müsste ja auch bei der Mail passieren. Nur daran scheitere ich kläglich :-(

Emails nach Lieferant versenden

PhilS ⌂, Dienstag, 05. Dezember 2017, 13:52 (vor 10 Tagen) @ DRO1989

Ich muss ja irgendwie dem Code sagen; "Bitte nimm den Datensatz, welcher der aktuellen Lieferantennummer entspricht!"

Für die Email selbst habe ich dazu noch einen ausführlichen Artikel zur Serienemailerstellung, den musst du nur noch um das Anhängen der Datei erweitern. Den Pfad dafür hast du ja in deinem Code.

Emails nach Lieferant versenden

DRO1989, Dienstag, 05. Dezember 2017, 14:00 (vor 10 Tagen) @ PhilS

Werde ich gleich mal versuchen! Danke für den Hinweis :-)

Emails nach Lieferant versenden

DRO1989, Dienstag, 05. Dezember 2017, 15:14 (vor 10 Tagen) @ DRO1989

Ich scheitere hier kläglich! Hast du evtl. ein Codebeispiel wie ich das einbette?:-(

Emails nach Lieferant versenden

PhilS ⌂, Dienstag, 05. Dezember 2017, 15:50 (vor 10 Tagen) @ DRO1989

Ich scheitere hier kläglich! Hast du evtl. ein Codebeispiel wie ich das einbette?:-(

Du hast ja bereits deine Code-Struktur für den Export der Dateien pro Lieferant. Die Struktur für den Serien-Emailversand ist analog dazu, eine Email pro Lieferant. Du musst jetzt in deiner Schleife nur Export und Emailversand kombinieren. D.h. erst Datei exportieren und dann die Email erstellen und die Datei anhängen.

Emails nach Lieferant versenden

DRO1989, Dienstag, 05. Dezember 2017, 16:15 (vor 10 Tagen) @ PhilS

D.h. ich verwende alles wie bisher nur die Mail - Applikation muss rein?

Kann ich das dann mit DoCmd.Send Object?

Sorry für die vielen Fragen

Emails nach Lieferant versenden

PhilS ⌂, Dienstag, 05. Dezember 2017, 21:19 (vor 9 Tagen) @ DRO1989

Kann ich das dann mit DoCmd.Send Object?

Mit DoCmd.SendObject kannst du nur ein einzelnes Dokument an die Datei hängen. Wenn ich dich richtig verstehe, hast du zwei (Excel-Export + Anschreiben). Du könntest dann die Email nicht direkt senden, sondern anzeigen lassen und eine Datei manuell anhängen.

Mit Outlook-Automation kannst du beliebig viele Dateien anhängen.

Emails nach Lieferant versenden

DRO1989, Mittwoch, 06. Dezember 2017, 08:16 (vor 9 Tagen) @ PhilS

Guten Morgen,

ich dachte der Morgen fängt besser an, aber irgendwie brauche ich eine Unterstützung sonst komm ich hier nicht weiter. :-(

Ich habe mir jetzt folgende Codes zusammengebastelt:

Outlook - Applikation

'Mail zusammenstellen und versenden
Private Sub Mailsenden(ByVal MailBody As String, ByVal oRecipient As String, ByVal oName As String, ByVal Subject As String)
 
    Const olFolderInbox = 6
    Const olFolderOutbox = 4
    Const olMailItem = 0
 
    Dim olApp       As Object 'Outlook.Application
    Dim olNamespace As Object 'Outlook.NameSpace
    Dim objMailItem As Object 'Outlook.MailItem
    Dim objFolder   As Object 'Outlook.mapiFolder

    Set olApp = CreateObject("Outlook.Application")
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set objFolder = olNamespace.GetDefaultFolder(olFolderInbox)
    Set objMailItem = objFolder.Items.Add(olMailItem)
    Dim oBody As String
    Dim Ablage As String
    Dim oSubject As String
 
    Ablage = "Q:\LU\Test\Bericht_Lieferant_Bewertung_11232017.pdf"
 
    Dim AttachmentFiles1 As String
 
    AttachmentFiles1 = Ablage
 
    oBody = "TEST"
 
    oSubject = "Anfrage"
 
 
    Set olApp = CreateObject("Outlook.Application")
    Set olNamespace = olApp.GetNamespace("MAPI")
    Set objFolder = olNamespace.GetDefaultFolder(olFolderInbox)
    Set objMailItem = objFolder.Items.Add(olMailItem)
 
    With objMailItem
        .To = " "
        .Subject = oSubject
        .Body = oBody
        .Attachments.Add AttachmentFiles1
        .Display
 
    End With
End Sub

und hier meinen Button, worüber ich versende!

Private Sub bt_versenden_Click()
 
'Mail vorbereiten

Dim RS As DAO.Recordset
Dim RT As DAO.Recordset
Dim MailBody As String
Dim email As String
Dim oRecipient As String
Dim oName As String
Dim Subject As String
 
 
'Daten auf Kriterium Filtern!!
Set RT = CurrentDb.OpenRecordset("SELECT Lieferant " & _
                        "From Filter_Ausschreibung_original " & _
                        "GROUP BY Lieferant " & _
                        "ORDER BY Lieferant;", dbOpenDynaset)
 
'MailBody zusammenstellen
RT.MoveFirst
Do Until RT.EOF
 
'Mail-Empfänger <= Hier muss das hin!!!
oRecipient = RT!Lieferant
'oName = RSA!Lieferanz

    'und mit diesem Filter die Daten eingrenzen:
    Set RS = CurrentDb.OpenRecordset("Select * FROM Filter_Ausschreibung_original WHERE Lieferant = '" & RT!Lieferant & "'", dbOpenDynaset)
    RS.MoveFirst
 
            Do Until RS.EOF
            MailBody = " "
            RS.MoveNext
            Loop
        'Verweise beenden
        RS.Close
        Set RS = Nothing
 
'Mail senden
Mailsenden MailBody, oRecipient, oName, Subject
 
RT.MoveNext
Loop
RT.Close
Set RT = Nothing
End Sub
 
 

So, die Mails werden nun generiert. Je Lieferant, macht er einen Maildialog auf. So wollte ich das auch. Wie bekomme ich nun meine temporäre Abfrage in den Code??? Und wie kann ich den Betreff "Anfrage" & Lieferant benennen???

Ich scheitere ständig am Anhang. Ich hab das noch nie mit einer temporären Abfrage gemacht...

Emails nach Lieferant versenden

PhilS ⌂, Sonntag, 10. Dezember 2017, 13:46 (vor 5 Tagen) @ DRO1989

Wie bekomme ich nun meine temporäre Abfrage in den Code??? Und wie kann ich den Betreff "Anfrage" & Lieferant benennen???

Du hattest du doch aber von vornherein deine temporäre Abfrage im Code der Schleife. Genauso baust du sie auch jetzt wieder ein. Wo ist denn das konkrete Problem dabei?


Den Betreff der Email kannst du über die Subject-Property des MailItems setzen.

Emails nach Lieferant versenden

Martin Asal, Dienstag, 05. Dezember 2017, 13:10 (vor 10 Tagen) @ DRO1989

Hallo,

zunächst mal verstehe ich nicht, warum du so kompliziert, mit vielen Zwischenschritten vorgehst: Erst eine Abfrage erstellen, dann deren Ergebnis als Tabelle speichern, dann diese Tabelle als Exceldatei speichern, dann nach und nach das alles wieder löschen.

Geht viel einfacher. Selbst wenn du nur berücksichtigst, dass TransferSpreadsheet auch mit einer Abfrage geht, sparst du schon Zwischenschritte.

Du solltest aus der Abfrage, die du jetzt mühsam im String sSQL bastelst, eine Parameterabfrage machen. Dann geht es noch einfacher.

Und ganz einfach wird es dann mit DoCmd.SendObject. Das löst auch dein Mailproblem ;-)

Martin

Emails nach Lieferant versenden

DRO1989, Dienstag, 05. Dezember 2017, 13:34 (vor 10 Tagen) @ Martin Asal

Hallo,

danke schon Mal für eure Ratschläge. Ich bin neu in Sachen VBA, wie man wohl merkt! :-)

Mein Problem ist, dass ich einmal die Abfrage an einen gewissen Pfad übergebe
(das mach ich über TransferSpreadsheet - und wüsste eigentlich auch keine andere Lösung) und andererseits die einzelnen Excel - Sheets an die Lieferanten schicken muss (im Besten Fall noch mit einer Datei - dem Anschreiben - aus einem gewissen Pfad).

Irgendwie steh ich gerade auf dem Schlauch, wie ich das mit einer normalen Parameterabfrage automatisieren soll...

Das was PhilS geschrieben hat, kommt dem ja sehr nahe, nur wie bekomme ich es hin, dass innerhalb der Schleife die Mail generiert wird?

RSS-Feed dieser Diskussion
powered by my little forum