exxist
Goto Top

Mails via VBA Makro aus Excel mit Anhang versenden

Hallo zusammen,

hoffe es kann mir jemand bei folgendem Problem helfen. Ich hänge hier nun schon seit Tagen fest und komme einfach nicht weiter...

Mit diesem Makro sollen Mails mit einer Excel Datei im Anhang versendet werden. Der Inhalt des Anhangs soll ein separates Tabellenblatt sein, in welches die Werte aus dem "Master"-Tabellenblatt kopiert werden, wenn folgende Bedingungen erfüllt sind:

1. Inhalte einer Zeile werden nur dann kopiert, wenn in Spalte U eine "versenden" steht
2. Es sollen, wenn diese Bedingung zutrifft, nur die Spalten A bis M sowie die Spalte R kopiert werden.

Der Mailversand funktioniert einwandfrei. Das Problem liegt wohl bei der Definition des Bereichs, der kopiert werden soll. (Ab Code Zeile 30)

Weiter unten werden die Mails dann noch nach "Mailadresse" zusammengefasst, sodass pro Mailadresse nur eine Mail rausgeht. Aber auch das funktioniert.

Folgend der Code.

Vielen Dank vorab und Grüße
Sascha

Sub Mails_versenden()
'  
'  
' Tastenkombination: Strg+b  
'  
If MsgBox("Sollen die Anschreiben nun versendet werden?", vbYesNo) <> vbYes Then Exit Sub  
 
         
 Dim ws As Worksheet, rngSource As Range, dic As Object, c As Range, firstAddress As String, cell As Range
    'Dictionary Objekt erzeugen indem wir die bereits bearbeiteten Zeilen hinterlegen  
    Dim MyMessage As Object, MyOutApp As Object
    Dim SavePath As String
    Dim AWS As String
    Dim Rng2Copy As Range, Rng2Paste As Range
    Dim aWerte()
    Dim i As Long
    Dim x As Integer
    
    Application.ScreenUpdating = False
    
    
    
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 1 Step -1
    
    'Spalte U=versenden  
    
    If Cells(i, 21) = "versenden" Then  
        
    
       'Bereich Aus Mastertabellenblatt in neues Tabellenblatt  

    Rng2Copy = Sheets("Master").Range(Cells(i, 1), Cells(i, 13))  
    Set Rng2Paste = Sheets("Überfüllte_versendet").Range(Cells(i, 1), Cells(i, 13))  
        aWerte() = Rng2Copy
        Rng2Paste = aWerte()
    Set Rng2Copy = Sheets("Master").Cells(i, 18)  
    Set Rng2Paste = Sheets("Überfüllte_versendet").Cells(i, 18)  
        aWerte() = Rng2Copy
        Rng2Paste = aWerte()
     


    
    End If
   Next i
     
    Application.ScreenUpdating = True
     
   

    SavePath = "H:\" '"E:\Eigene Dateien"  
    'Kopiert Sheet "Überfüllte_versendet" in eine neue Mappe  
    'welche nur diese Tabelle enthält  
    Sheets("Überfüllte_versendet").Copy  
    'Speichert die Datei unter dem Tabellennamen und einem Zeitstempel  
    ActiveWorkbook.SaveAs SavePath & "\" & ActiveSheet.Name & "_" & Format(Now, "ddmmyyyy_hhmm") & ".xlsx"  
    'Mappenname wird an Variable übergeben  
    'und anschliessend gleich geschlossen  
    With ActiveWorkbook
        AWS = .FullName
        .Close
    End With
    
              
    Set dic = CreateObject("Scripting.Dictionary")  
    'Outlook-Objekt erzeugen  
    Set objOL = CreateObject("Outlook.Application")  
    'Tabellenblatt referenzieren  
    Set ws = Worksheets("Master")  
    
    'belegter Range der Zeilen ermnitteln  
    Set rngSource = ws.Range("A1", ws.Cells(Rows.Count, 1).End(xlUp))  
    
    'Für jede Zeile im Range  
    For Each cell In rngSource
        ' wenn die Zeile noch nicht bearbeitet wurde und in Spalte U eine "versenden" steht (20 = Spalte U)  
        If Not dic.Exists(cell.Row) And cell.Offset(0, 20).Value = "versenden" Then  
            Dim strMailBody
            'Mail erzeugen  
            Set objMail = objOL.CreateItem(0)
            'Eigenschaften der Mail zuweisen  
            objMail.Subject = "Bitte bereinigen. Danke"  
            objMail.To = cell.Offset(0, 32).Value
            'Mailbody erzeugen aber noch nicht endgültig der Mail zuweisen  
            objMailBody = cell.Offset(0, 33) & vbNewLine & vbNewLine & cell.Offset(0, 34).Value & vbNewLine
                         
            'In Spalte "Mail" nach dem aktuellen Zellwert in Spalte Mail suchen  
            With rngSource.Offset(cell.Row, 32)
                Set c = .Find(cell.Offset(0, 32).Value, LookIn:=xlValues, lookAt:=xlWhole)
                If Not c Is Nothing Then
                    firstAddress = c.Address
                    Do
                         ' Nur wenn in Spalte U "versenden" steht  
                        If ws.Cells(c.Row, 21).Value = "versenden" Then  
                            'bearbeitete Zeile zum Dictionary hinzufügen, so dass sie später nicht nochmal verwendet wird  
                            If Not dic.Exists(c.Row) Then dic.Add c.Row, ""  
                            'dem Mailbody den Inhalt von Spalte Z hinzufügen  
                            strMailBody = strMailBody & c.Offset(0, 2) & vbNewLine
                            'nächste Fundstelle suchen  
                    End If
                           Set c = .FindNext(c)
                    Loop While Not c Is Nothing And c.Address <> firstAddress
                     

                End If
                
           
            
            End With
            
           
             
            'Mail zum testen nur anzeigen  
            objMail.Display
         
   objMail.Attachments.Add AWS
       
            
        End If
        
    Next

ActiveWorkbook.Save

Kill AWS
'MsgBox "Anschreiben erfolgreich an Outlook übertragen!"  


Sheets("Überfüllte_versendet").Cells.Clear  
  
End Sub

Content-Key: 252606

Url: https://administrator.de/contentid/252606

Printed on: April 25, 2024 at 18:04 o'clock

Mitglied: 116301
Solution 116301 Oct 21, 2014 updated at 08:36:17 (UTC)
Goto Top
Hallo Sascha!

Das Kopieren der Versenden-Zeilen vom Sheet(Master) in das Sheets(Überfüllte_versendet) in etwa so:
Private Sub test()
    Dim oWks As Worksheet
    
    Set oWks = Sheets("Überfüllte_versendet")  
    
    oWks.UsedRange.Clear
    
    With Sheets("Master")  
        .AutoFilterMode = False
        .Columns("U:U").AutoFilter Field:=1, Criteria1:="=versenden", Operator:=xlAnd  
        .Range(Replace("A1:M#,R1:R#", "#", .UsedRange.Rows.Count)).Copy oWks.Range("A1")  
        .AutoFilterMode = False
    End With
End Sub
Wobei die Überschriftzeile(1) ebenfalls kopiert wird...

Grüße Dieter
Member: ExxiSt
ExxiSt Oct 21, 2014 at 08:36:12 (UTC)
Goto Top
Wahnsinn, funktioniert! Vielen Dank für die schnelle Hilfestellung!

Beste Grüße
Sascha