Hallo zusammen :)
ich bin im Moment dabei ein etwas komplexeres Formular zu erstellen. Soweit so gut.
Mit Makros habe ich allerdings noch nie wirklich gearbeitet und es ergibt sich folgendes Problem:
Am Ende des Formulars soll es einen Button mit der Funktion geben, eine neue E-Mail mit dem Formular im Anhang zu öffnen aber nur, wenn auch die Pflichtfeleder ausgefüllt sind.
Die Makros für die Funktion "Speichern wenn Pflichtfelder ausgefüllt" und "neue E-Mail mit Anhang öffnen" habe ich. Diese klappen einzeln auch wunderbar.
Ich bekomme sie nur nicht so abgeändert und kombiniert, dass es im Endeffekt auch klappt.
Code:
Private Sub CommandButton1_Click()
Dim rngPflicht As Range, rngBereich As Range
Dim intLeere As Integer
Set rngPflicht = [B3,B9,E9,B11,B12,B13]
For Each rngBereich In rngPflicht.Areas
intLeere = intLeere + Application.WorksheetFunction.CountBlank(rngBereich)
Next
If intLeere > 0 Then
MsgBox "Bitte Pflichtfelder ausfüllen!"
Else
On Error Resume Next 'Falls Speichern abgebrochen wurde
If ActiveWorkbook.Saved Then
ActiveWorkbook.Save
Else
Application.Dialogs(xlDialogSaveAs).Show
End If
End If
End Sub
Code:
Sub Excel_Workbook_via_Outlook_Senden()
Dim Nachricht As Object, OutApp As Object
Set OutApp = CreateObject("Outlook.Application")
Dim AWS As String
'Aktive Arbeitsmappe wird als Mail gesendet
AWS = ThisWorkbook.FullName
InitializeOutlook = True
Set Nachricht = OutApp.CreateItem(0)
With Nachricht
.To = xxx@xxx.de
.Subject = "Bl. xxxx, Kurztext"
.attachments.Add AWS
.Body = "Hallo zusammen," & vbCrLf & "bitte laut Anhang tätig werden." & vbCrLf & "Danke und liebe Grüße,"
'Hier wird die Mail nochmals angezeigt
.Display
'Hier wird die Mail gleich in den Postausgang gelegt
'Mail.Send
End With
End Sub
Die Mailadresse habe ich aus Datenschutzgründen mal "geixt" ;)
Kann mir hier evtl. jemand weiterhelfen? :)
Hallo,
wie wäre es jeden der beiden Makros mit einem Button zu starten.
Am Beginne ist nur der erste sichtbar, nach Ausfüllen wirde der erste Code ausgeführt und, falls erfolgreich, der zweite Button auf "visible = true" gesetzt. Damit kann dann die Mail verschickt werden.
mfg
Hmm, das wäre dann wohl eine Notlösung.
Schön wäre es, wenn es über einen Button geht. Ich denke wenn das so gar nicht machbar ist, bleibe ich lieber bei dem reinen "Abspeicher"-Butto.
Ich versteh nicht.....was passiert wenn du die zweite Sub am Ende der ersten aufrufst?
Code:
Call Excel_Workbook_via_Outlook_Senden
(15.09.2021, 10:48)Janush schrieb: [ -> ]Ich versteh nicht.....was passiert wenn du die zweite Sub am Ende der ersten aufrufst?
Code:
Call Excel_Workbook_via_Outlook_Senden
Wie meinst du?
Das zweite Makro ans erste dranhöngen?
Würde ja so schon keinen Sinn machen, da sich das erste ja auf's Abspeichern bezieht.
Das Abspeichern würde ja durch die E-Mail entfallen.
OK hatte nur 30 Sekunden zum Lesen und Antworten. Allerdings ist mir auch nach längerem lesen nicht ganz klar was du machen willst.
Ich beschreibe mal was ich denke worum es geht
Du hast ein Formular in Form einer einfachen Exceltabelle (also kein UserForm)
Du willst sicherstellen, dass bevor jemand dieses Formular automatisch als Mail versendet die Pflichtfelder ausgefüllt sind
Wenn das alles gegeben ist, soll eine vorgefertigete EMail aufgehen und eben dieses Excelformular im Anhang anhängen
Die Speichern-Option soll es irgendwie noch extra geben?!
Soweit so gut:
Du hast ein Makro welches die Pflichtfelder prüft...check
Du hast ein Makro welches die EMail erstellt....check
Also ist doch erst Makro eins und dann Makro zwei doch gar nicht so verkehrt?!
OK, aber hier mal noch eine Frage. Wäre es nicht besser, wenn das Formular nur als .xlsx ohne Makro verschickt würde?
Also erst Tabelle zwischenspeichern, eventuell in einen Tempordner, diesen Dateinamen nehmen und als anhang in die Mail einfügen.
Wie man es auch dreht, erst speichern dann senden scheint mir korrekt.
Den Code müsste man dann vielleicht noch etwas anpassen, damit genau das auch rauskommt
Geht meine Analyse soweit in die richtige Richtung, oder brauchst du doch was anderes?
Jein - also die E-Mail soll vorher noch veränderbar sein durch den Nutzer des Formular.
Hier sind noch die ein oder anderen Sachen in die Mail einzutragen, die sich aber in jeder Mail unterscheiden.
Daher ist es wichtig, dass man in die Mail noch 1-2 Sachen reinscheiben kann, wenn das Formular ausgefüllt ist.
Aber ansonsten ja, es soll sich erst ein Mail-Fenster öffnen, wenn alle Pflichtfelder ausgefüllt sind.
Die Speicher Funktion werde ich evtl. als zweiten Button einfügen - das funktioniert aber einwandfrei :)
Wenn ich beide Makros stupf einfüge passiert nichts, was mir auch soweit einleuchtet.
Ich habe von Makros allerdings weniger als keine Ahnung, daher habe ich keine Ahnung wie ich beide verbunden bekomme, so dass eben ein Mailfenster mit dem Formular als Anhang aufgeht aber eben erst wenn alle Pflichtfelder ausgefüllt sind...
Hmm...wieso wäre es denn besser wenn das Formular ohne Makro wäre?
Kurz zum Hintergrund: das Formular liegt an einem zentralen Ort wo mehrere Leute Zugriff drauf haben. Jeder trägt hier für jeden Vorgang andere Sachen ein. Demnach muss das Formular also pro Vorgang neu ausgefüllt werden und wird daher auch nur einmal pro Vorgang genutzt.
Für den Anwender soll es so einfach wie möglich sein. Ansonsten könnte ich ja auch sagen "speichert die Excel-Datei bitte ab und schickt sie mir dann als Mail".
Wäre an sich auch nicht das Problem aber ich fände die Lösung über einen Button einfacherer (und so würde die Datei auch beim richtigen Mailempfänger ankommen...)
Das Formular direkt in eine Mail packen klappt ja auch super aber eben auch, wenn die Pflichtfelder leer sind.
Zitat:Hmm...wieso wäre es denn besser wenn das Formular ohne Makro wäre?
Na weil ihr sonst immer den Code mitschickt und je nachdem wer der Empfänger ist diese Mail sehr wahrscheinlich durch keinen einzigen Spam/Vierenfilter geht. .xlsm sind heutzutage gaaaaanz böse
Also sollte der Anhang nur eine reine .xlsx sein...sieht gegenüber Kunden auch professioneller aus. Ich weiß ja nicht um was es sich hier handelt, aber am Ende wärs vielleicht noch besser das Ausgefüllte Formular als PDF zu verschicken. Dann kann der Empfänger da auch nichts ausversehen umschreiben.
Ist ja aber auch kein Problem, ich schau mal ob ich was besorgen kann.
Ist lediglich für den internen Gebrauch :)
Wird also auch nicht irgendwo hin verschickt.
Liegt zentral ab, wird von meinen Kollegen ausgefüllt und wir dann auch nur an ein internes Postfach geschickt, wo das Formular dann unter anderem von mir bearbeitet wird.
PDF kommt definitiv nicht in Frage, darauf haben wir uns bereits geeinigt.
Danke schon mal für deine Hilfe! :)
Ok, ich habe mal deinen Code ein bisschen erweitert und nur auf die eigentliche Mailfunktion angepasst.
An der Pflichtfeldprüfung habe ich nichts geändert.
Code:
Private Sub CommandButton1_Click()
Dim rngPflicht As Range
Dim rngBereich As Range
Dim intLeere As Integer
Set rngPflicht = [B3,B9,E9,B11,B12,B13]
For Each rngBereich In rngPflicht.Areas
intLeere = intLeere + Application.WorksheetFunction.CountBlank(rngBereich)
Next
If intLeere > 0 Then
MsgBox "Bitte Pflichtfelder ausfüllen!", vbOKOnly + vbExclamation, "Eingabefehler!"
Else
'Hier gehts weiter wenn alles richtig ausgefüllt wurde
Dim Nachricht As Object
Dim OutApp As Object
Set OutApp = CreateObject("Outlook.Application")
Dim AWS As String
'Aktive Arbeitsmappe wird als Mail gesendet
AWS = SaveTempFile(ThisWorkbook.Name)
Set Nachricht = OutApp.CreateItem(0)
With Nachricht
.To = "xxx@xxx.de"
.Subject = "Bl. xxxx, Kurztext"
.attachments.Add AWS
.HTMLBody = "Hallo zusammen,<br><br>bitte laut Anhang tätig werden.<br><br>Danke und liebe Grüße,<br>"
'Hier wird die Mail nochmals angezeigt
.Display
End With
End If
End Sub
Wie du siehst, hat sich nicht viel geändert, nur dass das Workbook als XLSX zwischengespeichert wird und dann an die Mail angehängt. Hier noch die Speicherfunktion.
Code:
Public Function SaveTempFile(ByVal strName As String) As String
Dim strFileName As String
strFileName = GetTempFolder & "\" & strName & ".xlsx"
With ThisWorkbook
.SaveCopyAs strFileName
End With
SaveTempFile = strFileName
End Function
Und hier noch die GetTempFolder Funktion.
Code:
Public Function GetTempFolder() As String
GetTempFolder = Environ("Temp")
End Function
Also wie du siehst, doch schon sehr änlich zu deinem Code.
Probiers einfach mal aus
Edit: Da ist noch ein Fehler drin. SaveCopy funktioniert nicht mit einem anderen Datentyp
ich schau nochmal nach nem WorkAround