Access-o-Mania

Access-Forum (Deutsch/German) => Access-Hilfe => Thema gestartet von: dobby110 am September 28, 2015, 13:22:46

Titel: Email aus Formular heraus
Beitrag von: dobby110 am September 28, 2015, 13:22:46
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?
Titel: Re: Email aus Formular heraus
Beitrag von: DF6GL am September 28, 2015, 13:29:29
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


Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 28, 2015, 13:43:47
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.
Titel: Re: Email aus Formular heraus
Beitrag von: MaggieMay am September 28, 2015, 14:08:34
Hi,

an die VBA-Hilfe kommst du, wenn du die Access-Hilfe aus dem VBA-Editor heraus öffnest/aufrufst.
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 28, 2015, 14:47:24
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.

Titel: Re: Email aus Formular heraus
Beitrag von: MaggieMay am September 28, 2015, 16:04:59
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.
Titel: Re: Email aus Formular heraus
Beitrag von: DF6GL am September 28, 2015, 16:24:35
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)
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 29, 2015, 12:18:40
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?
Titel: Re: Email aus Formular heraus
Beitrag von: DF6GL am September 29, 2015, 12:55:42
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.

Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 29, 2015, 13:20:18
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)
Titel: Re: Email aus Formular heraus
Beitrag von: DF6GL am September 29, 2015, 13:39:52
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
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 30, 2015, 09:20:19
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?
Titel: Re: Email aus Formular heraus
Beitrag von: MaggieMay am September 30, 2015, 10:04:59
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.
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 30, 2015, 10:09:42
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?
Titel: Re: Email aus Formular heraus
Beitrag von: MaggieMay am September 30, 2015, 11:06:36
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.
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 30, 2015, 11:28:32
Formulareigenschaften - Vor Aktualisierung finde ich noch.
Der Rest sagt mir gar nichts.
Ich arbeite komplett mit den Generatoren und habe leider keine VBA Kenntnisse.
Daher weiß ich jetzt nicht genau was du damit meinst oder was ich da rein schreiben muss.
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am September 30, 2015, 11:44:15
Ich habe mal das Internet durchsucht und folgenden Code gefunden. Hilft der mir weiter?

Ich muss aber nur vier Felder prüfen und natürlich beginnen die nicht alle mit "txt" :-(

Depot
Nummer
Bezeichnung
und
Grund Reklamation
heissen die vier Felder


   Dim ctl As Control
    Dim check as boolean

    check = true
   
    For Each ctl In Me.Controls
   
        If Left(ctl.Name, 3) = "txt" Then
            If IsNull(ctl) Then
                MsgBox "nicht befüllt"
                check = false
            End If
        End If
    Next

    'Prüfen auf Vollständigkeit und Reaktion
    If check = False Then
       
        MsgBox "Es wurden nicht alle benötigten Informationen erfasst ....", vbExclamation,"Datenspeicherung"
        Exit Sub

    Else

         'Code fürs Speichern ausführen   

    End If
Titel: Re: Email aus Formular heraus
Beitrag von: DF6GL am September 30, 2015, 11:49:57
Hallo,

bei "Formulareigenschaften - Vor Aktualisierung "   klick auf die rechts stehenden 3 Pünktchen, wähle anschliessend "Code-Generator" aus, falls das Fenster erscheint und schreibe in die vorbereitete Prozedur im aufpopenden VBA-Editor den entspr. Code hinein...

etwa so:

Sub Form_BeforeUpdate (Cancel as Integer)  '  Prozedurrumpf schon generiert

If IsNull(Me!Depot) Then
Msgbox " Feld Depot nicht ausgefüllt"
Cancel = True
End if

If IsNull(Me!Nummer) Then
Msgbox " Feld Nummer nicht ausgefüllt"
Cancel = True
End if

'usw..

End Sub
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am November 05, 2015, 16:19:42
Hallo,

also es funktioniert alles prima. Habe allerdings noch eine weitere Frage.
Hier mal ein Teil von meinem VBA Code

Dim strBody As String, strBetreff As String
strBetreff = "Neue Reklamation"

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


Wie kann ich denn noch einen Empfänger in CC einfügen?
Sollte doch sicher auch kein Problem sein, oder?
Titel: Re: Email aus Formular heraus
Beitrag von: MaggieMay am November 05, 2015, 17:50:14
Hallo,
ZitatWie kann ich denn noch einen Empfänger in CC einfügen?
dazu musst du die Prozedur um einen entsprechende Parameter erweitern und diesen im Code berücksichtigen.
Titel: Re: Email aus Formular heraus
Beitrag von: dobby110 am November 06, 2015, 09:31:24
Verstehe ich jetzt leider nicht ...

also so wie ich den Betreff und die Felder die ich per Mail mitschicken möchte, führe ich noch in einer Zeile den "CC-Empfänger" auf?

strBetreff = "Neue Reklamation"

Das würde dann so aussehen?

strCC = "BB_Empfaenger@test.de"

und in dem Code führe ich dann noch "strCC" hinzu?

CreateEmailWithOutlook "DB_Test@test.de", strBetreff, strCC, strBody

Wenn dem so ist, wäre nur noch die Frage, ob ich das CC Feld auch mit "strCC" richtig anspreche?

Der komplette Code sieht dann so aus?

Dim strBody As String, strCC As String, strBetreff As String

strCC = "BB_Empfaenger@test.de"
strBetreff = "Neue Reklamation"

CreateEmailWithOutlook "DB_Test@test.de", strBetreff, strCC, strBody
Titel: Re: Email aus Formular heraus
Beitrag von: MaggieMay am November 06, 2015, 10:19:02
Hi,

soweit OK, nur musst du die Prozedur "CreateEmailWithOutlook" noch insoweit anpassen, dass sie den zusätzlichen Parameter aufnehmen kann und bestimmungsgemäß verwendet.

Wenn man bereits eingesetzte Funktionen nachträglich erweitert, fügt man die zusätzlichen Parameter sinnvollerweise als optional hinzu, damit der bestehende Code weiterhin unverändert laufen kann. Andernfalls muss der Funktionsaufruf überall angepasst werden.

Beispiel:
Public Function CreateEmailWithOutlook( _
    MessageTo As String, _
    Subject As String, _
    MessageBody As String, _
    Optional strCC As String = "")


und dann im Code:
        .CC = strCC

Der Aufruf sähe dann so aus:
CreateEmailWithOutlook "DB_Test@test.de", strBetreff, strBody, strCC