PDA

Vollständige Version anzeigen : Email aus Excel via Outlook versenden


VerenaK
08.11.2011, 08:52
Hi ihr Helfer,

ich arbeite mit einer Excel Tabelle aus der ich automatisiert Emails über Outlook versenden will. Mit dem Code den ich gebastelt habe funktioniert das auch zum Teil. Dh die meisten Emails werden autmatisch verschickt, es bleiben aber immer nch ein paar übrig bei denen man dann noch auf "senden" klicken muss.
Außerdem zeigt mir der Editor den Laufzeitfehler 13 "Typen unverträglich" an der Stelle
If Cells(I, 26) <= 7 Then
an.
Weiß jemand vielleicht was ich da falsch gemacht habe?

Hier mal der Code:


Sub Excel_Serienmail_via_Outlook_Senden()
Dim OutApp As Object, Mail As Object
Dim I As Integer
Dim Nachricht

For I = 22 To 3000

If Cells(I, 26) <= 7 Then

Set OutApp = CreateObject("Outlook.Application")
Set Nachricht = OutApp.CreateItem(0)

With Nachricht
.To = Cells(I, 10)
.Subject = "Reminder: Kaizen Zeitung "
.Body = "Guten Tag Herr " & Cells(I, 10) & vbCrLf & vbCrLf & _
"Diese Benachrichtigung soll Sie daran erinnern, dass Sie für folgenden _
Kaizenpunkt:" & vbCrLf & vbCrLf & _
Cells(I, 5) & vbCrLf & vbCrLf & _
"mit der fortlaufenden Projektnummer:" & vbCrLf & vbCrLf & _
Cells(I, 1) & vbCrLf & vbCrLf & _
"verantwortlich sind." & vbCrLf & vbCrLf & _
" Der Termin zur geplanten Realisierung" & vbCrLf & vbCrLf & _
Cells(I, 7) & vbCrLf & vbCrLf & _
"ist in weniger als 7 Tagen erreicht." & vbCrLf & vbCrLf & _
"Falls es zu einer Verlagerung dieses Termines nach hinten gekommen, oder _
das Projekt bereits realisiert ist, aktualisieren sie bitte den entsprechenden Eintrag in der Kaizen Zeitung!" & vbCrLf & vbCrLf & _
"Mit freundlichen Grüßen," & vbCrLf & vbCrLf & _
"Mark Wolter"

.Display
SendKeys "%s", True
End With

Set OutApp = Nothing 'CreateObject("Outlook.Application")
Set Nachricht = Nothing 'OutApp.CreateItem(0)
End If
Next I
End Sub


Vielen Dank für eure Hilfe!!!
Gruß,
Verena

EarlFred
08.11.2011, 10:32
Hallo Verena,

Sendkeys ist höchst unzuverlässig (wie Du merkst) und sollte daher nur verwendet werden, wenn alle anderen Mittel versagen - diese gibt es aber an dieser Stelle:
Nutze einfach die Methode "Send"

With Nachricht
[...]
.Send
End With

Zudem würde ich dringend dazu raten, die Erstellung der Outlook-Instanz VOR die Schleife zu ziehen (man kann aus einer Instanz auch mehrere Mails versenden;)), da Du andernfalls bis zu ca. 3000 Outlook-Instanzen offen hast, was neben Speicher auch elend Zeit beansprucht...
Instanzen von Applikationen gehören am Ende nicht nur auf "Nothing" gesetzt, sondern auch wieder geschlossen / beendet.
For I = 22 To 3000

If Cells(I, 26) <= 7 Then

Set OutApp = CreateObject("Outlook.Application")
Set Nachricht = OutApp.CreateItem(0)


Set OutApp = Nothing 'CreateObject("Outlook.Application")
Set Nachricht = Nothing 'OutApp.CreateItem(0)
Die Reihenfolge würde ich ändern: Die Objekte in der umgekehrten Hierarchie ihrer Zugehörigkeit freigeben: Also erst das MailItem, dann die Applikation ("von unten nach oben").

Theoretisch könntest Du auch das MailItem "recyclen" - ob Du da die Performance rauskitzeln willst, weiß ich aber nicht.

Grüße
EarlFred

VerenaK
08.11.2011, 10:59
Hi EarlFred,

Erstmal danke für deine Antwort!
ich weiß, dass das Sendkeys recht unelegant ist, aber nur mit dem .Send muss ich jedesmal eine Outlook Sicherheitsabfrage bestätigen und das habe ich versucht zu umgehen.
Ich bin nur mittel fit in VBA die einzige Art eine Instanz zu beenden, die ich kenne wäre:
Nachricht.Terminate
OutApp.Terminate
Das scheint aber falsch zu sein. gibt es da noch etwas anderes?

Gruß, Verena

EarlFred
08.11.2011, 11:04
Hallo Verena,

OutApp.Quit

Grüße
EarlFred

mumpel
08.11.2011, 11:04
Hallo!

Siehe auch http://www.herber.de/forum/messages/1237041.html
Um mich nicht kopieren zu müssen nur ein Link.

Gruß, René

VerenaK
08.11.2011, 11:53
Hi EarlFred,

.Quit wird akzeptiert.
zum verständnis: wieso muss ich das denn überhaupt machen? prinzipiell lief der code ja auch mit Set ... = Nothing.

Ich dachte es müsste für jede Mail quasi eine neue Instanz erstellt werden, deswegen hab ich

Set OutApp = CreateObject("Outlook.Application")
Set Nachricht = OutApp.CreateItem(0)



in die Schleife geschrieben.
Wenn ich das wie du sagtest nach vorne ziehe erscheint Laufzeitfehler 91 "objektvariable oder Withblockvariable nicht festgelegt" bei
.To = Cells(I, 10) 'Adresse

Könntest du mir vielleicht sagen wo hier mein Fehler liegt?
Vielen Dank schonmal!
Gruß,
Verena