Makros - Mail mit Anhang und Pflichtfeld kombinieren
#1
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.  16

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? :)
Antworten Top
#2
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
Antworten Top
#3
Hmm, das wäre dann wohl eine Notlösung. Angel

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. Undecided
Antworten Top
#4
Ich versteh nicht.....was passiert wenn du die zweite Sub am Ende der ersten aufrufst?

Code:
Call Excel_Workbook_via_Outlook_Senden
Antworten Top
#5
(15.09.2021, 11: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.
Antworten Top
#6
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 Smile

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 Smile

Geht meine Analyse soweit in die richtige Richtung, oder brauchst du doch was anderes?
Antworten Top
#7
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... Huh

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. 16
Antworten Top
#8
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 Smile

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.
Antworten Top
#9
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! :)  Angel
Antworten Top
#10
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 Smile

Edit: Da ist noch ein Fehler drin. SaveCopy funktioniert nicht mit einem anderen Datentyp Sad ich schau nochmal nach nem WorkAround
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 2 Gast/Gäste