Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Email aus Formular heraus

Begonnen von dobby110, September 28, 2015, 13:22:46

⏪ vorheriges - nächstes ⏩

dobby110

Hallo zusammen,

ich erstelle gerade eine kleine Datenbank, in der Reklamationen gespeichert werden.
Hierfür habe ich ein Formular erstellt, über das neue Reklamationen erfasst werden.
Gibt es die Möglichkeit, dass eine Email aus dem Formular heraus gesendet wird, aber NUR mit dem neu erfassten Datensatz?

Ich habe schon eine Schaltfläche, über die der Eintrag gespeichert wird, hier könnte ich ja auch die Aktion "EMailDatenbankobjekt" ergänzen. Aber wie schaffe ich es, dass mir nur der neue Eintrag versendet wird?

DF6GL

Hallo,

wenn die Daten des neuen DS noch im Formular angezeigt werden,  kann die SendObject-Methode (siehe VBA-Hilfe) benutzt werden, um eine Email mit den Daten aus den Textfelder (oder auch anderen)  zu versenden.


Die E-Mailadresse, der Betreff und der Mail-Body (Message) muss halt passend per VBA zusammengesetzt werden



dobby110

sorry das ich Frage ... wo finde ich die VBA-Hilfe?
Habe mal SendObject-Methode über die Suche gesucht, aber keine VBA-Hilfe gefunden.
Auch im Access-Blog hab ich nichts gefunden.

MaggieMay

Hi,

an die VBA-Hilfe kommst du, wenn du die Access-Hilfe aus dem VBA-Editor heraus öffnest/aufrufst.
Freundliche Grüße
MaggieMay

dobby110

ahja ;-) Darauf wäre ich jetzt nicht gekommen.

Aber so ganz schlau werde ich daraus nicht. Bin auch ein Neuling was das angeht.

Ich habe folgenden Code gefunden

Public Function CreateEmailWithOutlook( _
    MessageTo As String, _
    Subject As String, _
    MessageBody As String)

    ' Define app variable and get Outlook using the "New" keyword
    Dim olApp As New Outlook.Application
    Dim olMailItem As Outlook.MailItem  ' An Outlook Mail item

    ' Create a new email object
    Set olMailItem = olApp.CreateItem(olMailItem)

    ' Add the To/Subject/Body to the message and display the message
    With olMailItem
        .To = MessageTo
        .Subject = Subject
        .Body = MessageBody
        .Display    ' To show the email message to the user
    End With

    ' Release all object variables
    Set olMailItem = Nothing
    Set olApp = Nothing

End Function


Wie schaffe ich es denn jetzt, dass dieser ausgeführt wird?
Habe es schon mit einer Extra Schaltfläche über Ereignisprozedur versucht aber bekomme ich eine Fehlermeldung.


MaggieMay

#5
Hi,
Zitatbekomme ich eine Fehlermeldung
dann solltest du sie auch nennen, um uns die Fehlersuche zu erleichtern.

Nicht gutgehen kann bspw. dies hier:
ZitatSet olMailItem = olApp.CreateItem(olMailItem)
weil du ein Objekt genau so benannt hast wie eine Outlook-Konstante.
Freundliche Grüße
MaggieMay

DF6GL

#6
Hallo,

wenn Du diese Outlook-Automation bevorzugst, dann kopiere den folgenden Programmtext in ein Standard-Modul


Public Function CreateEmailWithOutlook( _
    MessageTo As String, _
    Subject As String, _
    MessageBody As String)

    ' Define app variable and get Outlook using the "New" keyword
    Dim olApp As New Outlook.Application
    Dim olMail As Outlook.MailItem  ' An Outlook Mail item

    ' Create a new email object
    Set olMail = olApp.CreateItem(olMailItem)

    ' Add the To/Subject/Body to the message and display the message
    With olMail
        .To = MessageTo
        .Subject = Subject
        .Body = MessageBody
        .Display    ' To show the email message to the user
    End With

    ' Release all object variables
    Set olMail = Nothing
    Set olApp = Nothing

End Function



In der Ereignisprozedur "Beim Klicken" einer Schaltfläche rufst Du die Funktion auf, nachdem vorher der Text für Subject (Betreff) und den Body (Mail-Text) aus den vorhandenen Daten zusammengesetzt wurde.




Sub btnSendMail_Click()
CreateEmailWithOutlook  "EmailAdresse@Mail.com", "Dies ist der Betrefff",  "Sie erhalten eine Testmail"  '<edit> Klammern entfernt </edit>
End Sub


Zudem muss der Verweis auf die Outlook-Bibliothek gesetzt werden (VBA-Editor/Extras/Verweise)

dobby110

Danke für die Hilfe. Ich bin jetzt wie folgt vorgegangen:

Ich habe ein neues Modul erstellt. (Modul1, welches ich umbenannt habe in Email_senden)

In dieses Modul habe ich die Function reinkopiert:

Public Function CreateEmailWithOutlook( _
    MessageTo As String, _
    Subject As String, _
    MessageBody As String)

    ' Define app variable and get Outlook using the "New" keyword
    Dim olApp As New Outlook.Application
    Dim olMail As Outlook.MailItem  ' An Outlook Mail item

    ' Create a new email object
    Set olMail = olApp.CreateItem(olMailItem)

    ' Add the To/Subject/Body to the message and display the message
    With olMail
        .To = MessageTo
        .Subject = Subject
        .Body = MessageBody
        .Display    ' To show the email message to the user
    End With

    ' Release all object variables
    Set olMail = Nothing
    Set olApp = Nothing

End Function


Im gleichen Modul darunter habe ich

Sub btnSendMail_Click()

CreateEmailWithOutlook ("EmailAdresse@Mail.com", "Dies ist der Betrefff",  "Sie erhalten eine Testmail")

End Sub


eingefügt.

Aber die Zeile CreateEmailWithOutlook .... wird mir rot angezeigt. Da scheint was falsch zu sein.

Den Verweis auf die Bibliothek habe ich glaube ich hinbekommen.
Häkchen bei Microsoft Outlook 14.0 Object Library gesetzt.

Wo liegt jetzt noch der Fehler?

DF6GL

Hallo,


die CreateEmailWithOutlook_funktion muss in einem Standard-Modul stehen.
Die Sub btnSendMail_Click()-Prozedur muss im Klassenmodul des Formualres stehen, in dem sich die Schaltfläche befindet. Zudem muss in der Eigenschaft "Beim Klicken" dieser Schaltfläche [Ereignisprozedur] eingetragen sein, d. h. die Ereignisprozedur muss korrekt erstellt worden sein.

Zudem dürfen bei (sorry, mein Fehler):

CreateEmailWithOutlook "EmailAdresse@Mail.com", "Dies ist der Betrefff",  "Sie erhalten eine Testmail"

keine Klammern stehen. Natürlich muss auch eine gültige E-Mailadresse anstelle der Beispiel-Adresse eingesetzt werden, damit das Ding richtig versendet werden kann und auch ankommt.


dobby110

#9
Wir kommen der Sache näher. Sorry das es immer noch nicht funktioniert:

Folgender Stand:

In das Klassenobjekt des Formulars habe ich diesen Befehl eingetragen:


Private Sub btnSendMail_Click()

CreateEmailWithOutlook "DB_Service@test.de", "neue Dividendenreklamation", "Es wurde soeben eine neue Reklamation erfasst"

End Sub


In ein Standart-Modul, welches ich "Email_senden" genannt habe

steht das hier:

Public Function CreateEmailWithOutlook( _
    MessageTo As String, _
    Subject As String, _
    MessageBody As String)

    ' Define app variable and get Outlook using the "New" keyword
    Dim olApp As New Outlook.Application
    Dim olMail As Outlook.MailItem  ' An Outlook Mail item

    ' Create a new email object
    Set olMail = olApp.CreateItem(olMailItem)

    ' Add the To/Subject/Body to the message and display the message
    With olMail
        .To = MessageTo
        .Subject = Subject
        .Body = MessageBody
        .Display    ' To show the email message to the user
    End With

    ' Release all object variables
    Set olMail = Nothing
    Set olApp = Nothing

End Function


Über die Schaltfläche, welche ich "btnSendMail" genannt habe, hab ich die Ereignisprozedur ausgewählt.

Bei Klick öffnet sich dann auch eine Email mit dem Empfänger, Betreff und dem Text.
Aber meine Daten, die ich in das Formular vorher eingetragen haben, werden nicht übernommen. Hab ich jetzt noch was falsch gemacht?

Um auch noch vorweg zu greifen. Ich habe eine Schaltfläche die den Datensatz speichert und das Formular schliessen soll. Kann ich nicht die gleiche Schaltfläche dafür nutzen? Oder muss ich die beiden Aktionen in den VBA einbauen, damit es zusammen läuft?

Mal aber noch eine ganz andere Frage. Kann ich einen Zeitstempel bei dem Eintrag in die Tabelle generieren lassen?
Dann könnte ich ich eine Abfrage auf Einträge der letzten 2 Minuten machen und so sollte in der Abfrage ja auch nur der eine Eintrag stehen, den ich dann per Email als Anhang senden kann. Wäre doch eine Möglichkeit, oder?

ERGÄNZUNG: Zeitstempel habe ich jetzt in der Tabelle mit dem Standardwert Jetzt() hinterlegen können.
Wie kann ich denn jetzt in der Abfrage auf die Uhrzeit abfragen? Also alle Einträge von Jetzt(-2 Minuten)

DF6GL

Hallo,

ZitatAber meine Daten, die ich in das Formular vorher eingetragen haben, werden nicht übernommen.

und das wundert Dich ??

Zitat"Es wurde soeben eine neue Reklamation erfasst"

ist der Text , der im Mail-Body erscheint. Und der muss ersetzt werden durch die aktuell angezeigten Daten aus dem Formular... Das musst Du schon machen... 

Mein Beispiel(!) sollte nur zeigen, wie die Mail prinzipiell erzeugt werden kann. Für das richtige Einsetzen der benötigten Daten musst Du selber sorgen.

also etwa so (auch Beispiel! und  Namen korrekt anpassen):

Dim strBody as String, strBetreff as String
strBetreff= "Neue Dividendenreklamation"

strBody = "Meine Damen und Herren," & vbCrLf & vbCrLf 
strBody = strBody & "im Folgenden erhalten Sie die gewünschten Daten:" & vbCrLf
strBody = strBody & "Reklamationsnummer:    " & Me!ReklamNr
strBody = strBody & "ReklamationsDatum:    " & Me!ReklamDat
strBody = strBody & "AuftragsNummer:    " & Me!AuftragNr & vbCrLf & vbCrLf & vbCrLf
strBody = strBody & "Wir glauben, Ihnen hiermit gedient zu haben und hoffen, nie wieder etwas von Ihnen zu hören." & vbCrLf
strBody = strBody & "Mit freundlichen Grüßen" & vbCrLf & "Ihr Lieferant"

CreateEmailWithOutlook "DB_Service@test.de", strBetreff, strBody

dobby110

#11
mea culpa ...

Darauf hätte man echt kommen können. Tut mir leid.
Es funktioniert alles. Vielen Vielen Dank.

Ich hätte nur noch eine letzte Frage.
Kenne mich mit VBA leider nicht sehr gut aus. Kann den Code lesen und umschreiben, aber selbst schreiben leider nicht.

Wie kann ich jetzt noch folgende Funktionen in den Code einbauen:

- Datensatz soll gespeichert werden
- Formular schließen
- Und was auch prima wäre, wenn die Mail einfach versendet wird, ohne dass man  in Outlook nochmal auf senden klicken muss.

Dann habt ihr mich los ;-)
Aber vorab nochmals vielen vielen Dank.


Update:

Ich habe einen Befehl gefunden:

DoCmd.RunCommand acCmdSaveRecord
DoCmd.Close


Das verursacht nur ein Problem.
Ich habe bei 4 Feldern angegeben, dass eine Eingabe erforderlich ist. Wenn ich jetzt den VBA Code ausführe, schließt er das Formular, ohne den Datensatz zu speichern, wenn die Pflichtfelder nicht ausgefüllt sind. Gibts da noch einen anderen Code?

MaggieMay

Hallo,
Zitat von: dobby110 am September 30, 2015, 09:20:19- Datensatz soll gespeichert werden
- Formular schließen
Beim Schließen des Formulars wird der aktuelle Datensatz automatisch gespeichert, sofern das Formular an eine Tabelle oder Abfrage gebunden ist.

Der Befehl dazu ist:
DoCmd.Close acForm, Screen.ActiveForm.Name(aus einem allgemeinen Modul heraus)
Oder:
DoCmd.Close acForm, Me.Name(aus dem Formular selbst heraus)

Zitat- Und was auch prima wäre, wenn die Mail einfach versendet wird, ohne dass man  in Outlook nochmal auf senden klicken muss.
Dazu ersetzt du .Display durch .Send.
Freundliche Grüße
MaggieMay

dobby110

PRIMA ! DANKE

Aber auch bei dem Code besteht das Problem

Ich habe bei 4 Feldern angegeben, dass eine Eingabe erforderlich ist. Wenn ich jetzt den VBA Code ausführe, schließt er das Formular, ohne den Datensatz zu speichern, wenn die Pflichtfelder nicht ausgefüllt sind. Gibts da noch einen anderen Code?

MaggieMay

Hi,

du kannst das Formular-Ereignis "Vor Aktualisierung" nutzen, um die Vollständigkeitsprüfung per VBA vorzunehmen und ggfls. ein Fehlerkennzeichen (Bool'sche Variable) setzen und dieses im Unload-Ereignis abfragen, um das Schließen bei Bedarf zu verhindern.
Freundliche Grüße
MaggieMay