axel62
Goto Top

Automatischer Versand von PDF aus einem Dateiordner

Hallo allerseits,
ich Programmmiere VBA für Access und muss nun VBA für Outlook programmieren. Letzteres leider zum ersten Mal und benötige etwas Hilfe.

In einem Verzeichnis liegen jeweils zwei zusammegehörende Dateipaare. Z. B. Rechnung_1234.pfd und Rechnung_1234.otl. Zuerst genannte Datei soll aus einem Outlookmakro (2003 und höher) automatisch an eine neu zu erstellende E-Mail angehängt und verschickt werden. Dieses Makro gilt es zu Erstellen.

In der Rechnung_1234.otl finden sich durch '~' getrennt, E-Mailempfänger, Betreff und der E-Mailtext.

Nach dem Versand können beide Dateien gelöscht werden und es soll das nächste Dateiepärchen ausgelesen und versendet werden, bis alle Dateipaare abgearbeitet, d. h. alle PDF-Dateien an die entsprechenden Emailempfänger versendet wurden.

Kann mir jemand einen groben Plan geben, wie ich das anstelle?

Vielen Dank im voraus und viele Grüße

Axel

Content-Key: 180107

Url: https://administrator.de/contentid/180107

Printed on: April 19, 2024 at 20:04 o'clock

Member: Pjordorf
Pjordorf Feb 06, 2012 at 20:20:30 (UTC)
Goto Top
Hallo,

Zitat von @Axel62:
Kann mir jemand einen groben Plan geben, wie ich das anstelle?
Warum? Den groben Plan hast du doch selbst schon erstellt. Steht doch oben drin. Wenn du gezielt Probleme hast frage (evtl. mit zugeöhrigem Quellcodeschnippsel) und dir wird bestimmt geholfen.

Gruß,
Peter
Member: Axel62
Axel62 Feb 07, 2012 at 07:13:17 (UTC)
Goto Top
Guten Morgen Peter,

ja, wie gesagt ich habe noch nie im Outlook programmiert.

Wenn ich die Dateien in einer Schleifde eingelesen habe und die *.otl in die einzelnen Bestandteile zerlegt habe, weiß ich nicht, wie ich eine neue E-Mail anlege, d. h. wie ich die Felder Empfänger, Betreff, E-Mailtext anspreche und wie ich die entsprechende PDF-Datei anhänge und verschicke. Was ist mit einer im Outlook vorbelegten Signatur? Wird die automatisch übernommen? Kann ich die unterdrücken?

Das sind Fragen über die ich mir bei Access keine Gedanken machen musste.

Viele Grüße

Axel
Member: Pjordorf
Pjordorf Feb 07, 2012 at 08:21:22 (UTC)
Goto Top
Hallo,

Zitat von @Axel62:
ja, wie gesagt ich habe noch nie im Outlook programmiert.
Das ist doch kein problemface-smile

weiß ich nicht, wie ich eine neue E-Mail anlege, d. h. wie ich die Felder Empfänger, Betreff, E-Mailtext anspreche und wie ich die entsprechende PDF-Datei anhänge und verschicke.
Im VBA Editor mal die F1 benutzt? Oder mal hier geschaut http://support.microsoft.com/kb/161088 Weiterhin gibt es noch Lektüre in Buchform. Sogar MS selbst hat da einiges.an Hilfe anzubieten http://msdn.microsoft.com/en-us/library/ee814736.aspx

Gruß,
Peter
Member: Axel62
Axel62 Feb 07, 2012 at 14:47:30 (UTC)
Goto Top
Hallo Peter,

hier nun der VBCode.

Private Sub cmdStart_Click()

Dim olApp As Outlook.Application
Dim olInspector As Outlook.Inspector
Dim objMail As Outlook.MailItem

Dim DateiMuster As String
DateiMuster = strFolder & "*.otl"

Dim DateiInhalt As String
Dim EMail(3) As String
Dim Vergleichsmuster As String

Dim DateiNr As Integer
Dim AnzMail As Long
Dim BLaenge As Long
Dim I As Long

Dim myattachments As Variant

If strFolder <> "" Then
Set olApp = CreateObject("Outlook.Application")
Set objMail = olApp.CreateItem(olMailItem)
Set myattachments = objMail.Attachments

Label2.Visible = True
strFile.Visible = True
NeueDatei:
Vergleichsmuster = Dir(DateiMuster)

If Vergleichsmuster <> "" Then
strFile = Vergleichsmuster ' Dateinamen anzeigen
DateiNr = FreeFile
BLaenge = FileLen(strFolder & Vergleichsmuster)
Open strFolder & Vergleichsmuster For Binary As DateiNr
DateiInhalt = String(BLaenge, " ")
Get DateiNr, 1, DateiInhalt

BLaenge = 0 ' Felder trennen
BLaenge = InStr(1, DateiInhalt, "~", vbTextCompare)

If BLaenge > 0 Then
EMail(1) = Left(DateiInhalt, BLaenge - 1) ' E-Mailadresse
DateiInhalt = Right(DateiInhalt, Len(DateiInhalt) - BLaenge)

BLaenge = 0
BLaenge = InStr(1, DateiInhalt, "~", vbTextCompare)

If BLaenge > 0 Then
EMail(2) = Left(DateiInhalt, BLaenge - 1) ' E-Betreff
EMail(3) = Right(DateiInhalt, Len(DateiInhalt) - BLaenge) ' Mailinhalt
Else
MsgBox "Fehlerhafter Dateiinhalt! Bitte korrigieren Sie die Datei und starten die Verarbeitung erneut.", vbCritical, "Fehler"
Close DateiNr
End If
Else
MsgBox "Fehlerhafter Dateiinhalt! Bitte korrigieren Sie die Datei und starten die Verarbeitung erneut.", vbCritical, "Fehler"
Close DateiNr
End If

objMail.To = EMail(1)
objMail.Subject = EMail(2)
objMail.Body = EMail(3)
myattachments.Add strFolder & Left(Vergleichsmuster, Len(Vergleichsmuster) - 3) & "pdf"

Set olApp = Nothing
Set olInspector = Nothing
Set objMail = Nothing

Close DateiNr
' Kill Vergleichsmuster
' kill left(vergleichsmuster, len(vergleichsmuster)-3) & "pdf"
GoTo NeueDatei
Else
If AnzMail = 0 Then
MsgBox "Es wurden keine Dateien zur E-Mailversendung gefunden! ", vbInformation, "Hinweis"
Else
MsgBox "Fertig. Es wurden " & AnzMail & " E-Mails versendet. ", vbInformation, "Hinweis"
End If
End If
Else
MsgBox "Fehler bei der Initialisierung. Es wurde kein Pfad gefunden.", vbCritical, "Fehler"
End If

Ende:
frmStart.Hide

End Sub

Die Routine wird einmal durchlaufen, jedoch wird keine Email erzeug und versendet. Beim 2. Druchlauf tritt Fehler 91 auf. Vielleicht siehst Du was hier falsch läuft?

Gruß

Axel
Member: Pjordorf
Pjordorf Feb 07, 2012 at 15:59:04 (UTC)
Goto Top
Hallo,

Zitat von @Axel62:
hier nun der VBCode.
Setze den Code doch bitte in code tags. Siehe dazu die Formatierungshilfe!
Beispiel:
If AnzMail = 0 Then
     MsgBox "Es wurden keine Dateien zur E-Mailversendung gefunden! ", vbInformation, "Hinweis"  
Else
     MsgBox "Fertig. Es wurden " & AnzMail & " E-Mails versendet. ", vbInformation, "Hinweis"  
End If
Das kann dan wenigstens besser gelesen werden.

Die Routine wird einmal durchlaufen, jedoch wird keine Email erzeug und versendet
Haltepunkte und Variablen lässt du dir schon beim anzeigen, oder? Und was ist bei einzelschritt abarbeitung?

Beim 2. Druchlauf tritt Fehler 91 auf.
Da du dein Office nicht nennst noch auf welchem OS du das ganze machst, hilft vielleicht dies hier (Das ist in Access aber nicht anders und dort der gleiche Fehler inklusive des dazu gehörigen fehlertexts) http://support.microsoft.com/kb/146864

Vielleicht siehst Du was hier falsch läuft?
Äh, nein. Ich zähle noch deine ganzen If else then's auseinander. Hast du schonb mal was von Strukturierter Programmierung oder Einrücken gehört? Das kann doch keiner lesen.

Gruß,
Peter
Member: Axel62
Axel62 Feb 07, 2012 at 20:06:55 (UTC)
Goto Top
Guten Abend Peter,

sorry, aber wenn beim Copy & Paste die Formatierung flöten geht, ist das nicht unbedingt meine Schuld.
Member: Pjordorf
Pjordorf Feb 08, 2012 at 13:02:54 (UTC)
Goto Top
Hallo,

Zitat von @Axel62:
sorry, aber wenn beim Copy & Paste die Formatierung flöten geht
Deshalb gibt es ja auch die Code Tags. Schau mal in der Formatierungshilfe ren. Code Tags kannst du auch nachträglich noch hinzufügen.

Gruß,
Peter
Member: Pjordorf
Pjordorf Feb 08, 2012 at 15:04:31 (UTC)
Goto Top
Hallo,

Zitat von @Axel62:
Die Routine wird einmal durchlaufen, jedoch wird keine Email erzeug und versendet
Die Mail wird doch mit deinem Code unten erzeugt. Zum senden noch ein .Send hinzufügen. Siehe unten
            objMail.To = EMail(1)
            objMail.Subject = EMail(2)
            objMail.Body = EMail(3)
            myattachments.Add strFolder & Left(Vergleichsmuster, Len(Vergleichsmuster) - 3) & "pdf"  
            objMail.Send
Beim 2. Druchlauf tritt Fehler 91 auf
Klar. Du setzt ja deine Objeckte auf Nothing. Entweder lassen oder neu zuweisen.
            Set olApp = Nothing
            Set olInspector = Nothing
            Set objMail = Nothing
Anstelle von Sprungmarken (brrr) lieber Schleifen mit Bedingungen benutzen. Ist in deinem Code ganz leicht möglich.
            GoTo NeueDatei
Ist ein NoGo. Sowie das dazugehörige
NeueDatei:
Löschen. Und dazu noch innerhalb einer IF Anweisung!

Nutze lieber ein Do ... Loop
<code "type=plain">
Do...Loop-Anweisung

Wiederholt einen Block mit Anweisungen, solange eine Bedingung den Wert True hat oder bis eine Bedingung den Wert True erhält.

Syntax

Do [{While | Until} Bedingung]
[Anweisungen]
[Exit Do]
[Anweisungen]

Loop

Sie können auch die folgende, ebenfalls zulässige Syntax verwenden:

Do
[Anweisungen]
[Exit Do]
[Anweisungen]

Loop [{While | Until} Bedingung]

Die Syntax für die Do Loop-Anweisung besteht aus folgenden Teilen:

Teil Beschreibung
Bedingung Optional. Numerischer Ausdruck oder Zeichenfolgenausdruck, der entweder True oder False ergibt. Hat Bedingung den Wert Null, so wird Bedingung als False interpretiert.
Anweisungen Eine oder mehrere Anweisungen, die wiederholt werden, solange oder bis Bedingung True wird.

Bemerkungen

Innerhalb einer Do…Loop-Anweisung kann eine beliebige Anzahl von Exit Do-Anweisungen an beliebiger Stelle als Alternative zum Verlassen einer Do…Loop-Anweisung verwendet werden. Exit Do wird oft in Zusammenhang mit der Auswertung einer Bedingung (zum Beispiel If...Then) eingesetzt und hat zur Folge, daß die Ausführung mit der ersten Anweisung im Anschluß an Loop fortgesetzt wird.

In verschachtelten Do...Loop-Anweisungen übergibt Exit Do die Steuerung an die Schleife der nächsthöheren Verschachtelungsebene.

Gruß,
Peter
Member: Axel62
Axel62 Feb 09, 2012 at 07:31:51 (UTC)
Goto Top
Moin Peter,

vielen Dank für Deine Hilfe. Ich habe Deine Änderungen vorgenommen, ein Errorhandling eingefügt und nun gehen die Mails raus, das ist super.

Vielen Dank für Deine Hilfe.

Viele Grüße
Axel