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?
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
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.
Hi,
an die VBA-Hilfe kommst du, wenn du die Access-Hilfe aus dem VBA-Editor heraus öffnest/aufrufst.
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.
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.
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)
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?
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.
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)
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
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?
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.
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?
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.
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.
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
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
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?
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.
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
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