Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

individueller Mailversand mit Dateianhang

Begonnen von Tom75, Oktober 24, 2024, 09:28:06

⏪ vorheriges - nächstes ⏩

Tom75

Vielen Dank für die ergänzenden Kommentare, Tipps und Hinweise mein lieber Ulrich, doch ist mir das in der Kürze der Zeit die ich dafür als Laie habe leider zu "hoch" und zu kompliziert zu verstehen. Bitte nicht falsch verstehen, aber ich muss das dann wohl leider lassen. Trotzdem DANKE noch mal.

Tom75

#16
Ich hab es doch mit meinem Code probiert und es zumindest geschafft, dass die korrekte Baustellennummer sowie die zugehörige Mailadresse übergeben und eine neue Mail samt korrektem Anhang erstellt wird.

Problem nun ist nur, das die Schleife nicht ausgeführt wird. Wie müssen die beiden roten Stellen richtig eingearbeitet werden ?


Private Sub Befehl2819_Click()

    Dim rst As DAO.Recordset
    Dim dbe As DAO.Database
    Set dbe = CurrentDb
   
  Set rst = CurrentDb.OpenRecordset("@Mailing", dbOpenForwardOnly, dbReadOnly)

' Do Until rst.EOF
 
    ' Ausgabe der beiden Feldinhalte im Direktfenster
    Debug.Print rst!bstneu; " -> "; rst!Mailadresse
   
    With rst

Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
With objMail
    .To = rst!Mailadresse  ' GetLeistungserfassungMailTo
    .Subject = rst!bstneu & " - Leistungserfassung Sub " & Forms!Start!Text2681 & "  -  gemäß Export vom: " & Forms!Start!DateiZeitpunkt
    .HTMLBody = "<HTML><font size=3> Hallo und guten Tag, ...</BODY></HTML>"
    .Attachments.Add "C:\Exporte\VWStunden\AVS-WV-Stunden - " & rst!bstneu & ".xlsm"
    .Display
End With
    rst.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
Set dbe = Nothing

End Sub

Knobbi38

Das sieht doch schon mal nicht schlecht aus, nur solltest du dich an die Vorgaben halten.

Weder habe ich ein Variable dbe definiert, noch WITH verwendet. Dann fehlen die Definition für die Instanz von Outlook und dem Mailitem, was du neu erzeugen möchtest. So könnte das nicht kompiliert werden.

Dann solltest du dir nochmal anschauen, welche Teile in den Schleifenkörper hineingehören und welche Teil des Codes außerhalb der Schleife stehen.

Auch mußt du zwingend die Referenz zum Outlook.Application Objekt wieder löschen, sonst gibst es früher oder später damit Probleme.

Tom75

Ich hab's zwischenzeitlich auch hinbekommen, mit dem Code funktioniert's

Wie löscht man den die "Referenz zum Outlook.Application Objekt" ?


Private Sub Befehl2819_Click()

    Dim rst As DAO.Recordset
    Dim dbe As DAO.Database
    Set dbe = CurrentDb

  ' Erstelle ein Recorset mit den Baustellnummern und den zughörigen Maildressen
  Set rst = CurrentDb.OpenRecordset("@Mailing", dbOpenForwardOnly, dbReadOnly)
 
  ' Schleife über alle gefunden DS
  Do Until rst.EOF

Set objOutlook = CreateObject("Outlook.Application")
Set objMail = objOutlook.CreateItem(0)
With objMail
    .To = rst!Mailadresse
    .Subject = rst!bstneu & " - Leistungserfassung Sub " & Forms!Start!Text2681 & "  -  gemäß Export vom: " & Forms!Start!DateiZeitpunkt
    .HTMLBody = "<HTML><font size=3> Hallo und guten Tag, ...</BODY></HTML>"
    .Attachments.Add "C:\Exporte\VWStunden\AVS-WV-Stunden - " & rst!bstneu & ".xlsm"
    .Display
End With
    rst.MoveNext
  Loop
rst.Close
Set rst = Nothing
Set dbe = Nothing

End Sub

Tom75

Zitat von: knobbi38 am Oktober 25, 2024, 15:52:11Auch mußt du zwingend die Referenz zum Outlook.Application Objekt wieder löschen, sonst gibst es früher oder später damit Probleme.

Ist das dann so gemeint ?

Set objOutlook = Nothing
Set objMail = Nothing

Knobbi38

Hallo Sebastian,

wird doch immer besser, aber du solltest schon auf die Details achten. In der Schleife jedes mal Outlook neu starten zu wollen, gibt nicht viel Sinn. Hier mal der bereinigt Code:
Private Sub Befehl2819_Click()
  Dim objOutlook as Object
  Dim objMail as Object
  Dim rst As DAO.Recordset

  Set objOutlook = CreateObject("Outlook.Application")

  ' Erstelle ein Recorset mit den Baustellnummern und den zughörigen Maildressen
  Set rst = CurrentDb.OpenRecordset("@Mailing", dbOpenForwardOnly, dbReadOnly)

  ' Schleife über alle gefunden DS
  Do Until rst.EOF
    Set objMail = objOutlook.CreateItem(0)

    With objMail
      .To = rst!Mailadresse
      .Subject = rst!bstneu & " - Leistungserfassung Sub " _
                    & Forms!Start!Text2681 & "  -  gemäß Export vom: " _
                    & Forms!Start!DateiZeitpunkt
      .HTMLBody = "<HTML><font size=3> Hallo und guten Tag, ...</BODY></HTML>"
      .Attachments.Add "C:\Exporte\VWStunden\AVS-WV-Stunden - " _
                    & rst!bstneu & ".xlsm"
      .Display
    End With

    rst.MoveNext
  Loop

  ' Cleanup
  if rst is not nothing then rst.Close
  Set rst = Nothing

  Set objMail = nothing
  Set objOutlook = nothing
End Sub

Vielleicht noch ein paar ergänzende Anmerkungen:
- Warum fängt deine Query mit einem "@" an? Mehrere Helfer haben dir glaube ich schon geraten, auf solche Sonderzeichen besser zu verzichten.
- Dein Button sollte einen "sprechenden" Bezeichner mit einem Präfix haben, z.B. "cmdCreateMails"
- In jeder Klasse/Modul sollte "Option Compare Database" und "Option Explicit" verwendet werden.

Gruß
Ulrich

Tom75

Guten Morgen lieber Ulrich,

DANKE noch mal für den optimierten Code. Warum ich das mit den Sonderzeichen doch erst mal gelassen hatte, hatte den schon zuvor schon beschriebenen Grund, erst mal zu schauen ob und wie es funktioniert, um dann diese Korrekturen nachdem man es verstandet hat durchzuführen.
Deine anderen wertvollen Hinweise habe ich natürlich dankend aufgenommen und werde sie versuchen mit zu implementieren.

Das mit der Schleife und innerhalb dieser jedes Mal Outlook neu zu starten, macht natürlich wirklich keinen Sinn und habe es daher, wie von Dir beschrieben, vor die Schleife gesetzt.

Ein großes DANKE an der Stelle noch mal für Eure Unterstützung und für Euch nun auch ein erholsames Wochenende.

Beste Grüße
Tom