Makros - Mail mit Anhang und Pflichtfeld kombinieren
#11
OK ich kann meine Nachricht nicht mehr anpassen. Hatte mich da etwas verrannt. Das passiert, wenn man immer husch husch macht. Also jetzt nochmal neu und diesmal auch funktionstüchtig und wahrscheinlich auch irgendwie so, wie du das gern wolltest...oh mann

Hier der Code für den Button. In diesem Fall, kann der Button beide Pfade beinhalten, denn der User wird vorher gefragt ob er die Tabelle als Mail versenden Möchte. Wenn er auf nein klickt, könnte man das WB auch speichern. Wie auch immer hier der Code Smile

Code:
Private Sub CommandButton1_Click()
   
    If AllePflichtfelderGefuellt Then
   
        If MsgBox("Wollen Sie die Tabelle als EMail verschicken?", vbYesNo + vbQuestion) = vbYes Then
       
            Call Excel_Workbook_via_Outlook_Senden
           
        Else
       
            'Hier kann irgendetwas anderes hin
       
        End If
   
    Else
   
        MsgBox "Bitte Pflichtfelder ausfüllen!", vbOKOnly + vbExclamation, "Eingabefehler!"
   
    End If

End Sub
Ich habe die Pflichtfeldprüfung ausgelagert, falls du die auch in einer anderen Prozedur brauchen solltest. Wie du siehst wird das hier oben gleich als erstes abgefragt und dann danach die MSGBOX. Die kann man aber auch wieder rausnehmen. Ist selbsterklärend denke ich. Wenn dann auf ja geklickt wurde, wird die Outlook Routine gestartet.

Code:
Private Function AllePflichtfelderGefuellt() As Boolean

    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

        AllePflichtfelderGefuellt = False

    Else

        AllePflichtfelderGefuellt = True
   
    End If

End Function
Hier kommt die Outlookroutine. Fast unverändert, nur dass diesmal die Datei tatsächlich als .xlsx zwischen gespeichert wird. Außerdem wird der Dateiname noch etwas erweitert. Dazu unten mehr.

Code:
Private Sub Excel_Workbook_via_Outlook_Senden()

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(GetTempFolder & "\" & ThisWorkbook.Name, GetFueller)

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><br>"

        'Hier wird die Mail nochmals angezeigt
        .Display

End With

End Sub
Wie du siehst gibt es zwei neue Funtionen. Einmal GetTempFolder und einmal GetFueller. Die erste gibt den Userspeziefischen Tempordner zurück und die zweite erweitert den Dateinamen um den Usernamen des Senders + dem aktuellen Datum. Das kann man aber beliebig in der Funktion anpassen. Sollte aber nicht leer sein, denn sonst funktioniert das Makro nicht mehr.

Code:
Public Function SaveTempFile(ByVal strName As String, Optional ByVal strFueller As String = "") As String

Application.ScreenUpdating = False

Dim strFileName As String
Dim strFileType As String
Dim wb          As Workbook

strFileType = Right(strName, 5)
strFileName = Left(strName, Len(strName) - 5) & strFueller

ThisWorkbook.SaveCopyAs strFileName & strFileType
   
Set wb = Application.Workbooks.Open(strFileName & strFileType)

Application.DisplayAlerts = False

wb.SaveAs strFileName & ".xlsx", xlOpenXMLWorkbook

Application.DisplayAlerts = True

wb.Close False

Kill strFileName & strFileType

SaveTempFile = strFileName & ".xlsx"

Application.ScreenUpdating = True

End Function
SaveTempFile arbeitet mit einem kleinen Workaround. Zuerst wird eine 1 zu 1 Kopie erstell, welche dann geöffnet wird um sie in eine .xlsx Datei umbenennen zu können. Die Kopie wird danach gelöscht. Das Ganze findet in dem Tempordner des Users statt. Ist nicht sehr schön, funktioniert aber.

Hier jetzt noch die beiden Hilfsfunktionen.

Code:
Private Function GetFueller() As String
    GetFueller = "_" & Environ("Username") & "_" & Format(Now, "ddmmyyyy")
End Function

Private Function GetTempFolder() As String
    GetTempFolder = Environ("Temp")
End Function

Wenn du jetzt all diese Funktionen in dein Userform kopierst, sollte es gehen.
Antworten Top
#12
Wow!
Erst mal ein riesen Dankeschön für die Mühe! 17

Hab den Code jetzt mal so eingefügt.
Sieht auf den ersten Blick auch gut aus....aaaaber wenn ich "Ja" wähle, prüft er die Pflichtfelder nicht.
Sprich er würde das Formular auch per Mail verschicken, wenn diese nicht ausgefüllt sind.
Klickt man auf "Nein" passiert nichts...

Oh man, ich dachte nicht, dass das doch so kompliziert zu sein scheint... Undecided
Antworten Top
#13
Doch, wenn die MsgBox mit der Frage auftaucht wurde die Prüfung schon durchgeführt, sonst kommt eine Meldung, dass nicht alle Felder gefüllt worden sind. Im Nein Zweig gibt es noch nichts. Da liegt es an dir etwas einzufügen.

In meiner Prüffunktion ist natürlich ein Fehler


Code:
If intLeere = 0 Then
muss natürlich

Code:
If intLeere > 0 Then
heißen.

Hatte ich zu Testzwecken auf = gestellt.
Antworten Top
#14
Jaaa jetzt klappt es!
Danke danke danke!  17 19

Ist es auch möglich, in der Betreffzeile der E-Mail einen Wert aus der Tabelle wiederzugeben? Huh
Antworten Top
#15
Ja na klar, jetzt wird es aber schon sehr basic.

aus .Subject = "Bl. xxxx, Kurztext" wird .Subject = "Bl. " & ThisWorkbook.Sheet1.Range("A1").Value & ", Kurztext"

Zwischen die beiden &-Zeichen kommt deine Referenz auf die jeweilige Zelle.
Antworten Top
#16
Wie gesagt, ich habe leider absolut gaaar keine Ahnung von Makros.
Habe ich bisher auch überhaupt nicht gebraucht und werde ich, Stand heute, auch zukünftig nicht wirklich brauchen.
Ansonsten muss ich mich damit definitiv beschäftigen  Blush 


Mit dem Anzeigen aus der Tabelle hat leider nicht geklappt, spuckt mir einen Fehler aus
[
Bild bitte so als Datei hochladen: Klick mich!
]

Ist aber nicht schlimm - war kein MustHave. Nur ein NiceToHave  19
Antworten Top
#17
Da ist irgendwie kein Bild da. Was hast du denn als Referenz eingetragen?
Antworten Top
#18
 .Subject = "Bl. " & ThisWorkbook.Banf.Range("B9").Value & ", Kurztext"

Habe es auch mit
.Subject = "Bl. " & ThisWorkbook.Sheet1.Range("B9").Value & ", Kurztext"

versucht. Vermute aber mal, dass ich da wieder irgendwas falsch mache  19 22
Antworten Top
#19
Du musst schon wissen wie dein SHeet heist, oder welche Nummer es hat.

.Subject = "Bl. " & ThisWorkbook.Sheet(" hier sheet namen eintragen ").Range("B9").Value & ", Kurztext"

Smile
Antworten Top
#20
Das Sheet heißt Banf.
Den Fehler zeigt er mir dennoch an... 22
Antworten Top


Gehe zu:


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