2016-07-20 3 views
0

Ich habe ein Makro, das ich erstellt habe, um E-Mails an Kunden zu senden, mit personalisierten Informationen für jeden Kunden. Es hat gut funktioniert, aber es wurde gerade darauf aufmerksam gemacht, dass das Makro nach dem 67. Entwurf, der in Outlook beim Ausführen des Makros ausgefüllt wird, keine E-Mails erstellt. Ich habe versucht zu recherchieren und habe keine Einschränkungsrestriktion gefunden, wie viele E-Mail-Entwürfe Sie in Outlook öffnen können. Ich habe meinen Code unten veröffentlicht, für den Fall, dass jemand sehen kann, ob ich versehentlich ein Limit eingerichtet habe.Excel Email Makro Größenbeschränkungen

So funktioniert das Makro: Mitarbeiter haben eine Liste mit ungefähr 500 Konten, die sie jeden Monat per E-Mail kontaktieren müssen, um ihren Vertrag mit uns zu verlängern. Alle Informationen befinden sich in einer Excel-Datei, und dieses Makro ruft die E-Mail-Adresse, den Kundennamen, den Kundenkontakt, das Erneuerungsdatum usw. des Kunden ab und verwendet diese Informationen in jeder E-Mail für eine personalisierte E-Mail. Sobald der Mitarbeiter die Schaltfläche zum Ausführen des Makros betätigt, wird für jedes Konto in der Liste eine E-Mail erstellt, die in Outlook ausgefüllt wird. Ich habe die E-Mails in Outlook ausgefüllt, anstatt automatisch zu senden, falls der Mitarbeiter je nach Client weitere Informationen bearbeiten oder einer E-Mail hinzufügen möchte. In den meisten Fällen senden sie die E-Mail wie sie sind, aber die Mitarbeiter bearbeiten ein paar E-Mails. Obwohl es so entmutigend erscheint, so viele Entwürfe in Outlook auf einmal zu erstellen, ist es für die Mitarbeiter viel schneller, E-Mails auf diese Weise zu versenden, anstatt sie einzeln einzugeben.

Also jede Beratung oder Einsicht, warum ich nicht mehr als 67 E-Mails gleichzeitig senden kann, wenn das Makro die letzte Reihe von Informationen durchlaufen sollte, lassen Sie es mich wissen. Wenn nicht, muss ich den Mitarbeitern nur sagen, dass sie das Makro nur in Gruppen von 60 verwenden.

Sub SendEMail() 


Dim Email As String 
Dim Subj As String 
Dim Msg As String 
Dim URL As String 
Dim r As Integer 
Dim x As Double 
Dim OApp As Object 
Dim OMail As Variant 
Dim Signature As String 
Dim strbody As String 

'for formatting reasons 
strbody = "<html><body>" 

'for looping 
With Sheets("List").Select 
lastrow = Cells(Rows.Count, "B").End(xlUp).Row 
End With 

For r = 2 To lastrow 


Set OApp = CreateObject("Outlook.Application") 
Set OMail = OApp.CreateItem(0) 


'  Get the email address 
Sheets("List").Select 
Email = Cells(r, "K") 

'  Message subject 
    Sheets("List").Select 
Subj = "Renewal for " & Cells(r, "B").Text & " Client # " & Cells(r, "A").Text & " Effective " & Cells(r, "D").Text 

'  Message body 
Sheets("List").Select 
strbody = "<p>Dear " & Cells(r, "J").Text & ", </p>" & _ 
"I am contacting you regarding the upcoming renewal for " & Cells(r, "B").Text & ", account number " & Cells(r, "A").Text & ", which is effective " & Cells(r, "D").Text & ". We have reviewed the account and determined that we have the information we need on file in order to offer renewal terms. & _ 
"Should you have any questions or if we can be of futher assistance, please don't hesitate to contact " & Cells(r, "O").Text & " at " & Cells(r, "M").Text &     " or " & Cells(r, "N").Text & _ 
" or respond to this email. If you are aware of changes to the contact on this account, please let us know, so we can be sure to get future correspondence to the proper person.<br><br>" & _ 
"As always, we would like to thank you for your business.<br><br>" & _ 
"Sincerely," 

On Error Resume Next 

Sheets("List").Select 
With OMail 
.Display 
.To = Email 
.Subject = Subj 
.HTMLBody = strbody & vbNewLine & .HTMLBody 
End With 
Next r 

On Error GoTo 0 


Set OMail = Nothing 
Set OApp = Nothing 

End Sub 
+0

Was passiert nach 67 E-Mails.Stoppt der Code ohne Fehler oder gibt es einen Fehler in einer bestimmten Zeile in Ihrem Code? Bitte erläutern Sie es genauer. –

+0

Es scheint einen Compilerfehler zu geben - Syntaxfehler im Absatz 'strbody ="

Sehr geehrte "& Cells (r," J "). Text &",

"& _ .....'. Bitte überprüfen Sie den Code aus Ihrem Master-Code. – skkakkar

+0

Entfernen Sie die 'On Error Resume Next'-Anweisungen und lassen Sie es fehlschlagen, damit Sie sehen können, was und wo es fehlschlägt? – Dave

Antwort

0

Also hier ist ein Code, der Ihr Problem auf zwei Arten behandeln könnte. Eine ist es, die Batch-Menge zu begrenzen ... Die andere besteht darin, das Mail-Objekt im Ordner Eigene Dokumente in jeder for-Schleife zu speichern, die Mail-Objekte als nichts einzustellen. Dies sollte den Benutzern die Möglichkeit geben, alle Konten gleichzeitig auszuführen, aber zu öffnen und zu bearbeiten, bevor sie gesendet werden ... was mich zu meiner wirklichen Lösung bringt.

Finden Sie heraus, welche Szenarien diese Benutzer bearbeiten E-Mails, dann für sie codieren. Außerdem, wenn die Benutzer die einzelnen E-Mails vor dem Senden manuell überprüfen. Lösen Sie die Schleife möglicherweise vollständig und lassen Sie sie auf eine Schaltfläche klicken, wenn sie das nächste verfügbare Konto in der Tabelle verwenden möchten. Dies könnte erreicht werden, indem eine Spalte mit "send status" darauf gesetzt wird.

Option Explicit 

Sub SendEMail() 
Dim Email As String 
Dim Subj As String 
Dim Msg As String 
Dim URL As String 
Dim r As Integer 
Dim x As Double 
Dim OApp As Object 
Dim OMail As Variant 
Dim Signature As String 
Dim strbody As String 

'for formatting reasons 
strbody = "<html><body>" 

'for looping 
With Sheets("List").Select 
    lastrow = Cells(Rows.Count, "B").End(xlUp).Row 
End With 

For r = 2 To lastrow 


    Set OApp = CreateObject("Outlook.Application") 
    Set OMail = OApp.CreateItem(0) 


'  Get the email address 
    Sheets("List").Select 
    Email = Cells(r, "K") 

'  Message subject 
    Sheets("List").Select 
    Subj = "Renewal for " & Cells(r, "B").Text & " Client # " & Cells(r, "A").Text & " Effective " & Cells(r, "D").Text 

'  Message body 
    Sheets("List").Select 
    strbody = "This was a syntax error, changing for simplicity." 

    On Error Resume Next 

    Sheets("List").Select 
    With OMail 
     .display 
     .To = Email 
     .Subject = Subj 
     .HTMLBody = strbody & vbNewLine & .HTMLBody 
''New 
     .SaveAs ("C:\Users\" & Environ$("Username") & "\Documents\" &  Environ$("Username") & r & ".msg") 
    End With 
    Set OMail = Nothing 
    Set OApp = Nothing 

'''  'If you decide to limit your batches do it here 
'''  If r = 62 Then 
'''   MsgBox "Could do an assortment of things here...anyways, its  not a very good solution. " 
'''  End If 

    Next r 

    On Error GoTo 0 


    Set OMail = Nothing 
    Set OApp = Nothing 

End Sub 

Auch, und das liegt ganz bei Ihnen und Ihren geschäftlichen Anforderungen. Ich würde wirklich erwägen, den Strobody aus dem Hardcode und in eine neue Tabelle/Textdatei oder verfügbare Zelle in der Tabelle zu verschieben. Erleichtert die Unterstützung auf der ganzen Linie.

Nach dem Lesen Ihres Kommentars oben über Speicher .. das Problem ist all diese offenen E-Mail-Nachrichten. Vielleicht möchtest du die obige Speichermethode verwenden und dann ein neues Makro schreiben, das eine Datei mit dem ältesten Änderungsdatum aus diesem Verzeichnis öffnet, nachdem sie auf Senden geklickt haben, die Datei löschen oder archivieren ... So ähnlich.

0

Ich habe eine ähnliche Batch-Tool erstellt und traf das gleiche Problem, aber fand es unvorhersehbar. Auf der Suche nach einer Lösung beschloss ich, die Geschwindigkeit, mit der das Skript die E-Mails generiert, auf etwa 500 Millisekunden pro Mail zu beschränken - meine E-Mails enthalten mehrere Anhänge, sodass kleinere E-Mails möglicherweise weniger Drosselung benötigen.

Ich kann jetzt sehr Stabilität schaffen> 100 E-Mails mit Gesamtgröße (alle E-Mails kombiniert) im Bereich zwischen 200 MB und 300 MB.

Ich habe den Eindruck, es ist ein technisches Problem in der Schnittstelle zwischen Excel/VBA und Outlook.