Neuigkeiten:

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

Mobiles Hauptmenü

Mail mit Anhang aus VBA

Begonnen von thorstens1304, August 05, 2011, 09:46:48

⏪ vorheriges - nächstes ⏩

Klaus S. aus B

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

database

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

HTH

Diskus

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

Klaus S. aus B

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

Klaus S. aus B

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

DF6GL

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 ?



Klaus S. aus B

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