2

最大 500 人の受信者に個別の電子メールを作成する Excel UserForm を作成しています。

ワークシートには、名前 (列 A)、電子メール (列 B)、値 1 (列 C) の 4 つの列があります。

このコードでは、For および Next ループ スタイルを使用します。ここで、r は整数 (r = 2 To 500) として宣言され、MailItem オブジェクト .To =Cells(r,2) とともに宣言されます。

私が抱えている問題は、電子メールの本文を作成するために使用されるテキスト ボックスに配置された特殊文字を置き換える範囲 (列 C) から値を取り込もうとしていることです。

したがってHello, There were ^&^ transactions that failed yesterday.、入力して「送信」に使用するコマンド ボタンを押すと、列 B にリストされている各電子メール アドレスに電子メールが送信され^&^、列 C の値が個々の電子メール アドレス (各行) に置き換えられます。

以下は、例としての VBA コードです。もちろん、この問い合わせをできるだけ短くするために言及しなかった、宣言された変数が他にもたくさんあります。

Dim Signature As String, EmailSensitivity As String, EmailImportance As String
Dim Greeting As String, Punctuation As String, Security As String

Sub SendButton1_Click()
If SubjectText = vbNullString Then
If EmailBody1 = vbNullString Then
    MsgBox "Form Incomplete:" & vbCrLf & vbCrLf & _
    "No Subject or Email Text.", vbOKOnly
    Exit Sub
End If
End If

If SubjectText = vbNullString Then
    MsgBox "Form Incomplete:" & vbCrLf & vbCrLf & _
    "Please enter Subject.", vbOKOnly
    Exit Sub
End If

If EmailBody1 = vbNullString Then
    MsgBox "Form Incomplete:" & vbCrLf & vbCrLf & _
    "Please enter Email Text."
    Exit Sub
End If

If SignatureText1 = vbNullString Then
    Continue = MsgBox("Your email contains no signature." & vbCrLf & vbCrLf & _
    "Are you sure you wish to proceed?", vbYesNo)
        If Continue = vbNo Then
            Exit Sub
        End If
End If



Dim OutApp As Object, OutMail As Object
Dim r As Integer

Application.ScreenUpdating = False

For r = 2 To 501

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(olMailItem)

On Error Resume Next
With OutMail
    .Subject = Security & SubjectText.Value
    .Body = EmailBody1.Value & vbCrLf & vbCrLf & _
     SignatureText1.Value
    .To = Cells(r, 2)
    .Attachements.Add AttachmentText1.Value
    .Importance = EmailImportance
    .Sensitivity = EmailSensitivity
    .Send
End With

Next r

Set OutApp = Nothing
Application.ScreenUpdating = True

Sheet1.Range("A2:B501").Clear

Continue = MsgBox("You have successfully generated a mass email!" & vbCrLf & vbCrLf & _
"Would you like to generate another email?", vbYesNo)
    If Continue = vbNo Then
        Application.Quit
    End If

End Sub

私はまだ素人なので、不要なコードの多くを掃除する作業を行っていますが、この問い合わせは主に、特殊文字を各行に記載されている値に置き換えることです。

実際にフォーラムに問い合わせを投稿するのはこれが初めてなので、正しい手順に従っていない場合はお知らせください。よろしくお願いします。

4

1 に答える 1

1

Replace関数を使用すると、次のように簡単になります。

...
With OutMail
    .Subject = Security & SubjectText.Value
    .Body = Replace(EmailBody1.Value,"^&^",Cells(r, 3)) & _
            vbCrLf & vbCrLf & SignatureText1.Value
...

これとは関係ありませんが、importat:On Error Resume Nextは、送信 (およびその後の操作) が暗黙のうちに失敗することを意味します。これにより、将来のデバッグがより困難になり、イライラし、費用がかかります。少なくとも、どのエラーが発生したか、シートのどの行に関連する詳細をログに記録する必要があります。on error goto 0また、予期せず失敗する可能性のあるプログラムの部分の後で、または同様のエラーチェックを再度有効にしてください。

于 2012-11-10T06:13:21.340 に答える