Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Einbau von .SendUsingAccount in VBA Code

Forumthread: Einbau von .SendUsingAccount in VBA Code

Einbau von .SendUsingAccount in VBA Code
06.09.2018 23:30:30
Frank

Hallo,
ich habe mir aus Fundstücken und mit Hilfe hier im Forum einen VBA-Code zusammengebastet, der PDFs erzeugt, verschickt und druckt https://www.herber.de/forum/archiv/1640to1644/t1640252.htm. Nun möchte ich noch erreichen, dass die Mail von einem bestimmten Mailaccount aus verschickt wird. Deshalb wollte ich
Set .SendUsingAccount = .Session.Accounts.Item("info@domain.de")
in den Code einbauen. Ich habe natürlich sichergestellt, dass in Outlook ein Pop3 Account für info@domain.de existiert und auch darüber versendet werden kann. Ich nutze vermutlich die falsche Syntax oder platziere die Zeile falsch. Vor dem Send Befehl erhalte ich Fehler "5 Ungültiger Prozeduraufruf oder ungültiges Argument VBAProjekt", baue ich es danach ein, kommt Fehler "-2147221238 Das Element wurde verschoben oder gelöscht Microsoft Outlook.
Wie muss ich das einbauen?
Hier der Einbau in den zuletzt von Sepp verbesserten Code, wie es nicht funktioniert:


Sub PrintMailPDF()
Dim objOLOutlook As Object
Dim objOLMail As Object
Dim lngMailNr As Long
Dim lngZaehler As Long
On Error GoTo ErrorHandler
Set objOLOutlook = CreateObject("Outlook.Application")
lngMailNr = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row
For lngZaehler = 2 To lngMailNr
If Cells(lngZaehler, 2) <> "" Then
With Sheets("Verarbeitung")
.Range("d1") = lngZaehler
.Calculate
.ExportAsFixedFormat xlTypePDF, Sheets("Daten").Cells(lngZaehler, 2).Text
.PrintOut
Sleep 500
End With
Set objOLMail = objOLOutlook.CreateItem(olMailItem)
With Sheets("Mail")
With objOLMail
.To = Cells(lngZaehler, 1)
.CC = "testmai@makro.de"
.Subject = Cells(lngZaehler, 2) & " - " & Cells(lngZaehler, 4)
.BodyFormat = olFormatPlain
.Body = "Hallo " & Cells(lngZaehler, 3) & "," & vbCrLf
Dim strAttachmentPfad1 As String
strAttachmentPfad1 = ActiveSheet.Cells(lngZaehler, 6)
.Attachments.Add strAttachmentPfad1
Set .SendUsingAccount = .Session.Accounts.Item("info@domain.de")
.Send
'.Display
End With
End With
Sleep 500
Set objOLMail = Nothing
End If
Next lngZaehler
Set objOLOutlook = Nothing
Exit Sub
ErrorHandler:
MsgBox Err.Number & " " & Err.Description & " " & Err.Source, vbInformation
Exit Sub
End Sub

Viele Grüße
Frank

Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Du musst bei...
07.09.2018 07:40:17
Case
Hallo Frank, :-)
... ".SendUsingAccount = .Session.Accounts.Item("info@domain.de")" den Namen des Kontos (wie in Outlook angezeigt) in Hochkommata eintragen - nicht die Mailadresse. Dann sollte es eigentlich klappen. ;-)
Servus
Case

Anzeige
AW: Du musst bei...
07.09.2018 08:52:11
Frank
Hallo Case,
ich verwende in Outlook die Mailadresse auch als Kontoname. Gehe ich in OL (2016) auf Kontoeinstellungen, Tab E-Mail wird in den POP-Kontoeinstellungen bei Kontoname auch diese Mailaderesse angezeigt. Auf deinen Hinweis habe ich nun dem Konto einfach einen anderen Namen gegeben... und siehe da, es klappt! Vielen Dank!
Dafür habe ich nun aber ein viel schwerwiegenderes Problem mit dem Code: Ich habe ihn identisch aus der Testdatei (xlsm) in die eigentliche Arbeitsdatei (xlsb) kopiert. Dort erhalte ich nun die Fehlermeldung "Fehler beim Kompilieren: Variable nicht definiert". Hast du noch eine Idee, woran das liegen könnte?
Viele Grüße
Frank
Anzeige
Entweder Du setzt einen...
07.09.2018 09:11:39
Case
Hallo Frank, :-)
... Verweis auf die Outlookbibliothek, oder Du schreibst: ;-)
Set objOLMail = objOLOutlook.CreateItem(0)
Und:
.BodyFormat = 1
Du arbeitest mit "Late Binding" - da sind die Konstanten nicht bekannt. ;-)
Servus
Case

Anzeige
AW: Entweder Du setzt einen...
07.09.2018 10:35:31
Frank
Hallo Case,
es bleibt mir ein Rätsel, warum der identische VBA-Code in der einen Datei funktioniert und in der anderen bei der Zeile
Set objOLMail = objOLOutlook.CreateItem(olMailItem)
die genannte Fehlermeldung herausgibt. Der Code täuscht sicherlich auch bezüglich meines VBA-Niveaus: Alles relevante ist gefunden und mit Hilfe freundlicher Helfer wie dir modifiziert. Aber wie dem auch sei, mit deinem Tipp funktioniert es nun. Herzlichen Dank!
Jetzt habe ich den Code noch einmal "entschlackt" und auf die aktuelle Datei angepasst. Wenn du noch Lust hast, könntest du noch schauen, ob das so "stabil" aussieht:
Sub PrintMailPDF_neuRG()
Dim objOLOutlook As Object 'Steht für die Anwendung Outlook
Dim objOLMail As Object 'Steht für die einzelnen E-Mails
On Error GoTo ErrorHandler
Set objOLOutlook = CreateObject("Outlook.Application")
With Sheets("Rg")
.ExportAsFixedFormat xlTypePDF, .Cells(16, 13).Text
.PrintOut
Sleep 500
End With
Set objOLMail = objOLOutlook.CreateItem(0)
With Sheets("Rg")
With objOLMail
.To = Cells(16, 8).Text 'Empfänger AN
.CC = "testmai@makro.de" 'Empfänger CC
.BCC = ""
.Subject = Cells(16, 10) & " - " & Cells(16, 11) 'Betreff
.BodyFormat = 1
.Body = "Hallo " & Cells(16, 14).Text & "," & vbCrLf & _
Cells(16, 11).Value & " ist die Zahl des Tages." & vbCrLf
Dim strAttachmentPfad1 As String
strAttachmentPfad1 = ActiveSheet.Cells(16, 13)
.Attachments.Add strAttachmentPfad1 'Die Anhänge
Set .SendUsingAccount = .Session.Accounts.Item("Info")
.Send 'Versand der Mail
End With
End With
Sleep 500
Set objOLMail = Nothing 'E-Mail-Objekt wird beendet
Set objOLOutlook = Nothing 'Anwendung Outlook beendet
Exit Sub
ErrorHandler:
MsgBox Err.Number & " " & Err.Description & " " & Err.Source, _
vbInformation, "Ein Fehler ist aufgetreten, aber Fabi ist nicht schuld! =)"
Exit Sub
End Sub
Viele Grüße
Frank
Anzeige
Das muss kein Rätsel...
08.09.2018 03:34:04
Case
Hallo Frank, :-)
... bleiben. In einer Datei hast du einen Verweis auf die Bibliothek von Outlook. In der anderen Datei nicht. Nimm einfach mal eine Suchmaschine deiner Wahl und schau nach "Late Binding" und "Early Binding" die frühe und späte Bindung - und schon ist es kein Geheimnis mehr.
Servus
Case

Anzeige
AW: Das muss kein Rätsel...
10.09.2018 09:27:26
Frank
Hallo Case,
vielen Dank für deinen Hinweis. Jetzt suche ich noch einen Weg, die Mail mit meiner Standard-HTML Mailvorlage herauszuschicken. Wenn ich in Outlook unter "Start" auf "Neue Elemente", "E-Mail-Nachricht mit" gehe und dort HTML auswähle, wird die Standardvorlage geöffnet und damit versandt. Kann ich diese Vorlage auch per VBA ansprechen?
Viele Grüße
Frank

Anzeige
;
Anzeige

Infobox / Tutorial

Einbau von .SendUsingAccount in VBA Code


Schritt-für-Schritt-Anleitung

Um den Befehl .SendUsingAccount in deinem VBA-Code zu verwenden, gehe wie folgt vor:

  1. Outlook-Referenz prüfen: Stelle sicher, dass der gewünschte E-Mail-Account in Outlook eingerichtet ist und überprüfe die Schreibweise des Kontonamens.
  2. Syntax anpassen: Verwende den Namen des Kontos in Hochkommata, nicht die E-Mail-Adresse. Beispiel:
    Set .SendUsingAccount = .Session.Accounts.Item("DeinKontoname")
  3. Position im Code: Platziere den Befehl .SendUsingAccount vor dem .Send Befehl:
    .SendUsingAccount = .Session.Accounts.Item("DeinKontoname")
    .Send

Häufige Fehler und Lösungen

  1. Fehler "5 Ungültiger Prozeduraufruf": Dieser Fehler tritt häufig auf, wenn die Syntax nicht korrekt ist. Überprüfe, ob der Kontoname richtig in Hochkommata gesetzt ist.

  2. Fehler "-2147221238": Dieser Fehler kann auftreten, wenn das Element verschoben oder gelöscht wurde. Stelle sicher, dass der Account existiert und aktiv ist.

  3. Variable nicht definiert: Stelle sicher, dass du die richtigen Variablen deklariert hast und ggf. einen Verweis auf die Outlook-Bibliothek gesetzt hast, um die Konstanten wie olMailItem zu verwenden. Andernfalls kannst du die Konstanten durch ihre numerischen Werte ersetzen.


Alternative Methoden

Falls du Schwierigkeiten mit .SendUsingAccount hast, kannst du auch die Methode CreateItem verwenden, um eine neue E-Mail zu generieren:

Set objOLMail = objOLOutlook.CreateItem(0) ' 0 steht für olMailItem

Zusätzlich kannst du den Befehl .BodyFormat auf 1 setzen, um das Format korrekt zu definieren:

.BodyFormat = 1 ' 1 steht für olFormatHTML

Praktische Beispiele

Hier ist ein einfaches Beispiel zur Verwendung von .SendUsingAccount:

Sub SendEmail()
    Dim objOLOutlook As Object
    Dim objOLMail As Object
    Set objOLOutlook = CreateObject("Outlook.Application")
    Set objOLMail = objOLOutlook.CreateItem(0) ' olMailItem

    With objOLMail
        .To = "empfaenger@domain.de"
        .Subject = "Test E-Mail"
        .Body = "Hier ist der Inhalt der E-Mail."
        Set .SendUsingAccount = .Session.Accounts.Item("DeinKontoname")
        .Send
    End With

    Set objOLMail = Nothing
    Set objOLOutlook = Nothing
End Sub

Tipps für Profis

  • Debugging: Verwende Debug.Print vor dem .Send Befehl, um die Werte von Variablen zu überprüfen.
  • Verzögerung einfügen: Nutze Sleep zwischen den E-Mail-Versendungen, um sicherzustellen, dass alle E-Mails korrekt gesendet werden.
  • Fehlerbehandlung: Implementiere eine umfassende Fehlerbehandlung, um unerwartete Probleme abzufangen.

FAQ: Häufige Fragen

1. Warum funktioniert .SendUsingAccount nicht? Überprüfe, ob der Kontoname korrekt eingegeben ist und ob der Account in Outlook vorhanden und aktiv ist.

2. Wie kann ich eine Standard-HTML-Vorlage für meine E-Mail verwenden? Du kannst die Vorlage in Outlook manuell erstellen und dann mit VBA auf die E-Mail zugreifen, indem du die CreateItem Methode nutzt und die HTML-Inhalte in .Body einfügst.

3. Was ist der Unterschied zwischen Late Binding und Early Binding? Late Binding bedeutet, dass du keine Referenz auf die Objektbibliothek setzt, während Early Binding dies tut. Bei Late Binding musst du die Konstanten durch numerische Werte ersetzen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige