Hallo,
wie kann ich über ein VBA Script eine Mail inklusive einer Excel Datei im Anhang versenden?
Hallo,
Wenn du auf der Seite mit deinem Beitrag nach unten scrollst kommt folgendes zum Vorschein ... ;)
http://www.access-o-mania.de/forum/index.php?topic=4167.0 (http://www.access-o-mania.de/forum/index.php?topic=4167.0)
HTH
Hallo,
erst einmal Danke für den Hinweis. Leider kriege ich in der Zeile:
Dim ool As Outlook.Application
den Fehler "Benutzerdefinierter Typ nicht definiert". Was muss ich ändern?
Hallo,
du musst im VB-Editor unter Extras Verweise einen Verweis auf die 'Microsoft Outlook xx.0 Object Library' setzen
xx steht für deine Verwendetet Office-Version (10, 11, 12, 14)
HTH
Aah Danke. der Fehler ist weg. Ein kleines Problem noch: Die Mail wird geöffnet aber nicht versandt. Wie kriege ich die noch automatisch versendet?
Public Function SendMail(Empfaenger, Anhang, Betreff As String)
Dim ool As Outlook.Application
Dim oMail As Outlook.MailItem
'Anhang
Dim myattachments As Variant
' Verweis zu Outlook + neue Nachricht
Set ool = CreateObject("Outlook.Application")
Set oMail = ool.CreateItem(olMailItem)
Set myattachments = oMail.Attachments
' Befreff-Zeile
oMail.Subject = Betreff
' An-Zeile (Empfänger)
oMail.To = Empfaenger
oMail.Display
' Texteingabe (Nachricht selbst)
oMail.Body = "Hallo, anbei finden Sie die Kundendaten zu den Ihnen aktuell übersandten Lizenzbestellungen."
myattachments.Add Anhang
End Function
Hallo versuch es mal hiermit:
SendKeys "%s"
am Ende der Function.
Gruß
Johann
Hallo,
im Code steht ja auch, dass sie angezeigt werden soll ---> oMail.Display
Von Senden ist da nix ... ;)
versuch mal so:
Public Function SendMail(Empfaenger, Anhang, Betreff As String)
Dim ool As Outlook.Application
Dim oMail As Outlook.MailItem
'Anhang
Dim myattachments As Variant
' Verweis zu Outlook + neue Nachricht
Set ool = CreateObject("Outlook.Application")
Set oMail = ool.CreateItem(olMailItem)
Set myattachments = oMail.Attachments
' Befreff-Zeile
oMail.Subject = Betreff
' An-Zeile (Empfänger)
oMail.To = Empfaenger
' Texteingabe (Nachricht selbst)
oMail.Body = "Hallo, anbei finden Sie die Kundendaten zu den Ihnen aktuell übersandten Lizenzbestellungen."
myattachments.Add Anhang
'-------- Mail versenden -----
oMail.Send
'----------------------------------
End Function
HTH
Hallo zusammen,
ich hänge bei dieser Sache. Der Code funktioniert soweit außer dass es mit den Anhang aus dem Datensatz nicht anfügt, sondern einen Fehler produziert.
ZitatLaufzeitfeler '440' Die Dateianlage kann nicht hinzugefügt werden. Es wurde keine Datenquelle bereitgestellt.
Wenn ich im Code eine Datei direkt angebe "C:\temp\xxx.pdf" funktioniert es. Also stimmt wohl irgendwas mit dem Verweis auf das Feld "Anlage" nicht. Ich habe es auch schon mit anlage.Value, Anlage.FileData und Anlage.FileName versucht, aber das funktioniert auch nicht.
Mein Code als Sub (bin zu blöd eine public function aufzurufen) ;)
Private Sub Befehl19_Click()
Dim Empfaenger, Anlage, Betreff As String
Dim ool As Outlook.Application
Dim oMail As Outlook.MailItem
'Anhang
Dim myattachments As Variant
' Verweis zu Outlook + neue Nachricht
Set ool = CreateObject("Outlook.Application")
Set oMail = ool.CreateItem(olMailItem)
Set myattachments = oMail.Attachments
' Befreff-Zeile
oMail.Subject = Betreff
' An-Zeile (Empfänger)
oMail.To = Empfaenger
oMail.Display
' Texteingabe (Nachricht selbst)
oMail.Body = "Hallo, anbei finden Sie die Kundendaten zu den Ihnen aktuell übersandten Lizenzbestellungen."
myattachments.Add Anlage
End SubBin ratlos!
Gruß
Klaus
Hallo,
"Anlage" ist eine Variant-Variable und nirgends initialisiert/gesetzt... Was soll da angehängt werden?
Außerdem wäre es besser "Empfaenger" und "Anlage" als vom Datentyp TEXT zu deklarieren.
Wenn der Dateiname für die EMail-Anlage aus einem Anlage-Feld in einer Tabelle stammt, dann muss mit z. B. der Recordset-Eigenschaft des Anlage-Feldes der eigentliche Dateiname extrahiert und einer String-Variablen zugewiesen werden, die wiederum bei der .Add-Methode benutzt wird.
Wenn "Betref"f und "Empfaenger" (evtl. gebundene) Form-Textfelder sind , dann wäre syntaktischer eher so zuschreiben:
oMail.Subject = nz(Me!Betreff,"kein Betreff")
Hallo,
jetzt offenbahrt sich, dass ich von VBA keine Ahnung habe.
Ich dachte "...as String" ist gleich mit "Text" (gibt übrigens eine Fehlermeldung).
Ich habe das Feld mal umbenannt in Anhang (um es deutlich vom Typ zu unterscheiden) und dem Feld den Dateinamen zugewiesen (das klappt auch), aber ich bekomme trotzdem einen Fehler.
Zitat(Die Datein kann nicht gefunden werden. Überprüfen sie den Pfad und Dateinamen.)
Private Sub Befehl19_Click()
Dim Empfaenger, Betreff, Anhang As String
Dim ool As Outlook.Application
Dim oMail As Outlook.MailItem
'Anhang
Dim myattachments As Variant
...
Anhang = Me.Anlage.FileName
myattachments.Add Anhang
End Sub...das mit dem Recordset habe ich nicht verstanden.
Gruß
KLaus
Hallo,
irgendwie geht es aneinander vorbei..
Private Sub Befehl19_Click()
Dim txtEmpfaenger As String, txtBetreff as String, txtAnhang As String
Dim ool As Outlook.Application
Dim oMail As Outlook.MailItem
'Anhang
Dim myattachments As Object...
Dim rs as Dao.Recordset
set rs = Me!Anlage.Value
txtAnhang = rs(0)!FileName 'evtl. noch Filetype berücksichtigen
.
.
.
myattachments.Add txtAnhang
End Sub
HAllo Franz,
habe jetzt Deinen Code versucht.
Allerding bleibt er bei
"Set rs = Me!Anlage.Value" hängen mit der Fehlermeldung: "Objekt unterstützt diese Eigenschaft oder Methode nicht"
???
Gruß
Klaus
Hallo,
sollte bei nur einem Eintrag im Anlagefeld auch so gehen:
Private Sub Befehl19_Click()
Dim txtEmpfaenger As String, txtBetreff as String, txtAnhang As String
Dim ool As Outlook.Application
Dim oMail As Outlook.MailItem
'Anhang
Dim myattachments As Object...
.
.
txtAnhang = Me!Anlage.Filename
.
.
myattachments.Add txtAnhang
End Sub
Hallo Franz,
funktioniert leider auch nicht.
Die Variabel hat den korrekten Wert "xyz.pdf", aber die Prozedur bleibt bei
myattachments.Add txtAnhang mit der Fehlermeldung "(Die Datein kann nicht gefunden werden. Überprüfen sie den Pfad und Dateinamen.)" hängen.
Der Dateiname stimmt ja mal, aber ich habe ja keinen Pfad (ist ja im Datensatz gespreichert).
Gruß
KLaus
Hallo,
ja, da gibt es tatsächlich das Problem, das das Attachment aus einer real gespeicherten Datei bestehen muss. Insofern muss, wenn die Anlage das Datei-Objekt (Dateiinhalt) enthält und nicht (auch) als Datei in irgendeinem Verzeichnis der Festplatte liegt , dieses Datenabbild erst in eine Festplatten-Datei geschrieben (exportiert) werden.
Google mal nach
Function Restoreblob
Hallo zusammen,
habe eine Idee für einen Workaround. Ich lasse die Dateien wo sie hingehören: im Dateisystem und speichere im DS nur den Ort.
Jetzt könnte ich ganz einfach den Anhang definieren, WENN ich den Namen der Datei auslesen könnte.
Hab' mich schon wundgesucht, aber nix passendes gefunden.
Der Pfad is kein Problem, aber wie lese ich den(die) Dateinamen incl. Dateiwereiterung für einen bestimmten Pfad aus.
Bei objekt.getfilename bin ich an der Definition des "Objekt" gescheitert.
Wäre echt happy über einen Tipp.
Gruß
Klaus
Hallo,
Zitatund speichere im DS nur den Ort
und wenn du ALLES speicherst - Pfad und Dateiname ... z.B. D:\Ordner1\Ordner2\Anhang.pdf
ersparst du dir das ganze Gewürge mit Auslesen, konvertieren usw.
Die elegantere Methode ist es aber die Files aus einem Dialog auszuwählen ...
sieh dazu:
http://www.dbwiki.net/images/f/fb/AccSampleFileDialogs.zip (http://www.dbwiki.net/images/f/fb/AccSampleFileDialogs.zip)
HTH
Hab hier mal nen Standard Modul was du anpassen könntest. Beschreibungen sind dazu ja vorhanden. Und wenn ich als Newbee das geschafft habe schaffst du das bestimmt das anzupassen :)
'<pre>
'Funktion des Codes:
'Email mit Dateianhängen erstellen (in diesem Fall zwei exportierte Berichte)
'und einem Bericht direkt im Bodybereich des Mails.
'Falls Du nur diesen Code hast, mußt Du folgendermaßen vorgehen um ihn ausprobieren zu können (OL98/A97)
'
'1) Diesen Code komplett in ein neues Modul einfügen.
'2) In einer Datenbank eine Tabelle mit Namen "Verteiler" erstellen, die ein Feld namens "Name" enthält
' (dort werden die Empfängeradressen eingegeben).
'3) drei Berichte "Bericht1" + "Bericht2", die als Attachments erscheinen sollen und einen "Bericht3",
' der später im Bodybereich angezeigt wird.
' Die Formatierungen (Schriftart, Breite, Farbe) des Berichts bleiben erhalten, Linien, Diagramme etc. nicht !
'4) zum Schluß muß noch ein Verweis auf Outlook eingerichtet werden (Extras->Verweise)
'5) Die Funktion "Senden_Html()" ausführen.
Function Senden_Html()
Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Dim objOutlookRecip As Outlook.Recipient
Dim Betreff As String: Betreff = "Ihr Monatlicher Bericht"
Dim Nachricht As String, an As String, ATT1
Dim db As Database, rs As Recordset
'DoCmd.Echo False, "Visual Basic-Code wird ausgeführt."
'Verzeichnis erstellen und Berichte reinschieben
'Berichte ausgeben
'Der dritte Bericht wird im HTML- Format als Textdatei gespeichert
'Es müssen keine Berichte sein, wenn was anderes gewünscht wird, in die Hilfe vom "OutputTo" schauen.
'DoCmd.OutputTo acOutputQuery, "Abfrage1", "CSV(*.csv)", "C:\temp\Ber_verz\Bericht1.csv", False, ""
'DoCmd.OutputTo acReport, "Bericht2", "RichTextFormat(*.rtf)", "C:\temp\Ber_verz\Bericht2.rtf", False, ""
'DoCmd.OutputTo acReport, "Bericht3", "HTML(*.html)", "C:\temp\Beispiel.txt", False, ""
ATT1 = "C:\test1.csv"
'ATT2 = "C:\temp\Ber_verz\Bericht2.rtf"
'Quelltext vom dritten Bericht einlesen.
'Nachricht = readTxtFile("C:\temp\beispiel.txt")
'Mailobjekt erstellen
Set objOutlook = CreateObject("Outlook.Application")
Set objOutlookMsg = objOutlook.CreateItem(0)
'Tabelle "Verteiler" auslesen.
Set db = CurrentDb
Set rs = db.OpenRecordset("Verteiler", dbOpenDynaset)
DoCmd.Echo True
If rs.EOF Then MsgBox "Keine Empfänger im Verteiler", vbExclamation: GoTo Ex
With objOutlookMsg
'Durch alle Empfänger
Do While Not rs.EOF
an = Nz(rs!Name, "")
If an <> "" Then .Recipients.Add an
rs.MoveNext
Loop
'Inhalt des Mails festlegen
.Importance = 0 ' niedrige priorität
.Subject = Betreff
.HTMLBody = Nachricht 'HTML-Format
.Attachments.Add ATT1 'Berichte anhängen
'.Attachments.Add ATT2
For Each objOutlookRecip In .Recipients
objOutlookRecip.Resolve 'Namen überprüfen
Next
'.Display 'Nachricht wird angezeigt
.Send 'Nachricht wird sofort gesendet
End With
Ex:
On Error Resume Next
rs.Close
Set objOutlook = Nothing
'Verzeichnis und Dateien werden gelöscht
Kill "C:\temp\Ber_verz\*.*"
Kill "C:\temp\Beispiel.txt"
RmDir "C:\temp\Ber_verz"
Exit Function
Er:
MsgBox Err.Description
Resume Ex
End Function
Function readTxtFile(ByVal strFile As String) As String
'Dieses Modul liest den Quelltext des exportierten Bericht3 in einen String ein.
'Dim strLineBuffer As String
'Open strFile For Input Access Read As #1
' Do While Not EOF(1)
'Line Input #1, strLineBuffer
'readTxtFile = readTxtFile & vbCrLf & strLineBuffer
'Loop
'readTxtFile = Mid(readTxtFile, 3)
'Close #1
'Ex:
'Exit Function
'Er:
'MsgBox Err.Description
'Resume Ex
End Function
'</pre>
Gruß Diskus
Hallo Peter,
wenn das einfacher ist lese ich gerne auch den ganzen Pfad mit aus. Wie geht das?
Also zur Anwendung: Ich habe im Formular ein Webbrowersteuerelement, welches auf ein Verzeichnis verweist, das mit einem definierten Namen (Projektnummer_Einsatznummer) beim Anlegen eines Datensatzes erstellt wird.
In dieses verzeichis kann man per Drag und Drop Dateien und Anhänge aus MAils speichern.
Wird später durch einen Button ein (Einsatz-)Bericht erstellt und per Mail verschickt, sollen die Dateien im entsprechenden Verzeichnis angehängt werden.
D.h. es soll automatisch ablaufen, ohne Auswahl der Dateien, sondern einfach alles was im Verzeichnins ist; ich kenne die Dateinamen nicht und es kann natürlich sein, dass es gar keine Datei in diesem Verzeichnins gibt.
Aus diesen Gründen ist der (sehr komfortable) Auswahldialog hier ungeeignet.
Gruß
Klaus
HAllo Diskus,
vielen Dank.
Wenn ich Deinen Code richtig verstanden habe, "kennst" Du den Dateinamen und den Pfad der Dateien, die Du anhängen willst.
In meinem Fall kenne ich nur den Pfad, weiß aber nicht wie die Datei(en) heiß(t)en.
Das muss ich zur automatischen Veraberitung aber wissen.
Gruß
Klaus
Hallo,
warum durchläufst Du nicht in einer Schleife das (bekannte) Verzeichnis , z. B. mit der Dir()-Funktion oder den FileScripting-Objekt-Methoden und liest die darin vorhandenen Dateinamen aus, die dann als Attachment an die Email angehängt werden ?
HAllo Franz,
das mit dem DIR() war der Tipp, der mir gefehlt hat.
Super, vielen Dank!
Jetzt bastele ich mal an der Schleife. ;D
Gruß
KLaus