2016-07-20 13 views
0

私は、各クライアントの個人情報を使用して、クライアントに電子メールのバッチを送信するためのマクロを構築しました。それはうまくいっていますが、マクロを実行すると、Outlookでポピュレートする第67回のドラフトの後にマクロが電子メールを作成しないようになっています。私は研究しようとしましたが、Outlookがあなたに一度に開いてもらえる電子メールドラフトの数に制限がありませんでした。私は誤って制限を設定しているかどうか誰にでも分かるように、私のコードを以下に掲載しました。Excel電子メールのマクロサイズの制限

マクロの仕組み:従業員には、約500件のアカウントのリストがあり、毎月電子メールで連絡を取り合い、契約を更新します。すべての情報はExcelファイル内にあり、このマクロは各クライアントのメールアドレス、顧客名、顧客の連絡先、更新日などを取得し、個々の電子メールにその情報を使用してよりパーソナライズされた電子メールを作成します。従業員がマクロを実行するためにボタンを押すと、Outlookの各アカウントの電子メールが作成されます。従業員がクライアントに応じて電子メールに追加情報を編集または追加したい場合に備えて、自動的に送信するのではなく、Outlookに電子メールを入力します。ほとんどの場合、彼らはそのまま電子メールを送信しますが、従業員はいくつかの電子メールを編集します。だから、一度にたくさんの草案がOutlookに投入されているのは難しいようですが、従業員が個々に個別に入力するのではなく、このように電子メールを送信する方がはるかに高速です。

マクロが情報の最後の行を実行する必要があるときに私は67以上の電子メールを一度に送信できないというアドバイスや洞察を私に教えてください。もしそうでなければ、従業員には60のバッチでマクロを使用するように伝える必要があります。

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

67件のメールの後にはどうなりますか?コードがエラーなしで停止するか、コード内の特定の行にエラーがありますか?さらに詳しく説明してください。 –

+0

'strbody ="

"&Cells(r、" J ")の段落にコンパイラエラー - 構文エラーがあるようです。Text&"、

"&_ .....'。マスターコードからコードを再確認してください。 – skkakkar

+0

'On Error Resume Next'ステートメントを削除して、何がどこで失敗するのかを見ることができます。 – Dave

答えて

0

ここに2つの方法で問題を処理できるコードがあります。 1つはバッチ量を制限することです...もう1つは、forループ内のmy documentsフォルダにmailオブジェクトを保存し、メールオブジェクトを何も設定しないことです。これにより、ユーザーは一度にすべてのアカウントを実行することができますが、送信して編集する前に編集しておくと、実際の解決方法がわかります。

これらのユーザーが電子メールを編集しているシナリオを見つけて、それらをコードします。また、ユーザーが手動で各電子メールを見てから送信される場合もあります。おそらくループを完全に取り除き、スプレッドシート上で次の利用可能なアカウントが必要なときにボタンをクリックさせるようにしてください。これは、「送信ステータス」の列を持つことで実現できます。

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 

また、これはあなたとあなたのビジネスニーズに完全に従います。 strbodyをハードコードから新しいシート/テキストファイルまたはスプレッドシートの使用可能なセルに移動することを検討します。サポートを非常に簡単にします。

上記のメモリについてのコメントを読んだ後、問題はそれらの開いている電子メールメッセージのすべてです。上記のsaveメソッドを使用して、そのディレクトリから変更された最も古い日付のファイルを開く新しいマクロを作成し、クリックした後にファイルの削除またはアーカイブを行うことができます。

0

私は同様のバッチツールを構築して同じ問題にぶつかりましたが、予測できないことが判明しました。解決策を探して、私はスクリプトがメールを生成するスピードを抑えるために解決しました。メールあたり約500ミリ秒です。私のメールは複数の添付ファイルを持っているので、小さなメールは抑制する必要はありません。

200Mbから300Mbの範囲の合計サイズ(すべてのメールを組み合わせたもの)で、> 100個のメールを作成できるようになりました。

私はExcel/VBAとOutlookの間のインターフェイスで技術者の問題であるという印象を持っています。

関連する問題