|
初めて質問させて頂きます。
以前同じ職場にいた方がExcelで作成したメール配信ツールがあるのですが、
そのツールを改修して欲しいとの指示を受けました。
ExcelのVBAどころかプログラミングを行った経験はなく、何をどうやって良いか全く見当が付きません。
ただ理不尽な上司をギャフンと言わせてやりたいので、なんとかやり遂げたいと考えております。
Excelファイルの中でシートが3種類あり、「Format」「送信先リスト」「ログ」と分かれています。
1.「送信先リスト」の宛先(A列)にメールアドレスを入力し(アドレスはカンマを入れると複数入力が可能)
2.「Format」の宛先で”To””Cc””Bcc”のいずれかで送信するかを選択
3.「Format」の”メール送信”ボタンを押すとメールを送信
4.送信の結果が「ログ」に記載
上記の流れで送信できます。
今回改修を指示されたのは、現時点では”To””Cc””Bcc”いずれかしか選択できないのを、
”To””Cc””Bcc”それぞれメールアドレスを指定してメールを送れる様にしたいとの事でした。
Excelのプログラムの内容を添付しますので、なんとかお力を貸して頂けないでしょうか。
何卒宜しくお願い致します。
*************************************
標準モジュール(mdlGlobal)
' メールアドレス(カンマで複数併記可)の正規表現
Public Const gcszRegIPAddress As String = "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"
Public Const gcszRegAsciiCode As String = "[\x01-\x7f]"
Public Const gcszRegDomain As String = "([\w\-]+\.)+[a-z]+"
Public Const gcszRegMailAddress As String = _
gcszRegAsciiCode & "+@(" & gcszRegIPAddress & "|" & gcszRegDomain & ")"
Public Const gcszRegMultiMailAddress As String = _
"^" & gcszRegMailAddress & "(," & gcszRegMailAddress & ")*$"
**************************************
shtFormat(「Format」)
' メール送信
Private Sub cmdSendMail_Click()
Dim szSMTPServer As String
Dim szSubject As String, sztxtSubject As String
Dim szFrom As String, szReplyTo As String
Dim szTo As String, szCc As String, szBcc As String
Dim szAttachedFile As String, szAttachedPath As String
Dim szMessage As String, szMessageFormat As String
Dim rngAddress As Range
Dim szRet As String
Dim regReplaceCompany As RegExp, regReplacePost As RegExp
Dim regReplacePosition As RegExp, regReplaceName As RegExp
Dim regReplacePassword As RegExp, regMailAddress As RegExp
Dim regReplacePeriod As RegExp, regReplaceOthers_2 As RegExp
Dim regReplaceCompany_kenmei As RegExp
Dim iRet As Integer, lLogRow As Long
Application.EnableCancelKey = xlDisabled
' パラメータチェック
szRet = checkParameter
If szRet <> "" Then
' パラメータにエラーがあった場合、メッセージを表示して終了
MsgBox szRet, vbCritical, gcszValidateError
Exit Sub
End If
' 送信確認
If MsgBox(gcszSendMailCertify, vbOKCancel) <> vbOK Then
Exit Sub
End If
' 初期設定
szSMTPServer = txtSMTPServer.Value
sztxtSubject = txtSubject.Value
szFrom = txtFrom.Value
szReplyTo = txtReplyTo.Value
szTo = ""
szCc = ""
szBcc = ""
szAttachedFile = ""
If chkAttachedFile.Value = True Then
If optAttachedIndividual.Value = True Then
szAttachedPath = txtAttachedFileFolder.Value
If Right(szAttachedPath, 1) <> "\" Then
szAttachedPath = szAttachedPath & "\"
End If
ElseIf optAttachedCommon.Value = True Then
szAttachedFile = txtAttachedFileFolder.Value
End If
End If
szMessageFormat = txtMessage.Value
' 社名置換用正規表現
Set regReplaceCompany = New RegExp
regReplaceCompany.Pattern = "(^|[^" & gcszEscapeCharactor & "])(" & _
gcszReplaceCompany & ")"
regReplaceCompany.Global = True
' 部署置換用正規表現
省きます。
' 役職置換用正規表現
省きます。
' 名前置換用正規表現
省きます。
' パスワード置換用正規表現
省きます。
' その他1置換用正規表現
省きます。
' その他2置換用正規表現
省きます。
' メールアドレスチェック用正規表現
Set regMailAddress = New RegExp
regMailAddress.Pattern = gcszRegMultiMailAddress
' ログ出力開始行取得
lLogRow = shtLog.Cells(65536, 1).End(xlUp).Row + 1
Set rngAddress = shtSendList1.Cells(gciAddressStartRow, gciAddressColumn)
Do While rngAddress.Value <> ""
' 宛先リストが続く限り送信
' メールアドレスのチェック
If regMailAddress.Test(rngAddress.Value) = False Then
MsgBox gcszErrSendAddressWrong & rngAddress.Value, _
vbCritical, gcszValidateError
Exit Do
End If
' 送信先をオプションボタンに合わせて設定
If optAddressTo = True Then
szTo = rngAddress.Value
ElseIf optAddressCc = True Then
szCc = rngAddress.Value
ElseIf optAddressBcc = True Then
szBcc = rngAddress.Value
End If
' メッセージ置換(会社名、部署、役職、名前、パスワードを置換)
省きます。
' 二重エスケープを解決
szMessage = Replace(szMessage, _
gcszEscapeCharactor & gcszEscapeCharactor, gcszEscapeCharactor)
' 添付ファイルを設定
If chkAttachedFile.Value = True Then
If optAttachedIndividual.Value = True Then
szAttachedFile = szAttachedPath & _
shtSendList1.Cells(rngAddress.Row, gciFileNameColumn).Value
End If
' 添付ファイル有りメール送信
szRet = sendMailByCDO( _
szSMTPServer, szFrom, szTo, szCc, szBcc, _
szReplyTo, szSubject, szMessage, szAttachedFile)
Else
' 添付ファイル無しメール送信
szRet = sendMailByCDO( _
szSMTPServer, szFrom, szTo, szCc, szBcc, _
szReplyTo, szSubject, szMessage)
End If
' ログ出力
writeLog rngAddress.Value, _
shtSendList1.Cells(rngAddress.Row, gciNameColumn).Value, _
szRet, lLogRow
lLogRow = lLogRow + 1
If szRet <> "OK" Then
' 送信時エラー
' エラーメッセージを表示して終了
iRet = MsgBox(Mid(szRet, 3) + vbCr + gcszBeContinued, _
vbYesNo + vbCritical, gcszSendMailError)
If iRet = vbNo Then
Exit Do
End If
Else
End If
' 次のアドレスへ
Set rngAddress = rngAddress.Offset(1, 0)
Loop
If rngAddress.Value <> "" Then
' 送信失敗
MsgBox gcszMailSendFailed & vbCrLf & _
rngAddress.Row & "行目, " & rngAddress.Value & "にて失敗", _
vbExclamation, gcszMailSendFailed
Set rngAddress = Nothing
Else
' 送信成功
MsgBox gcszAllMailSendSuccessful, vbOKOnly, gcszAllMailSendSuccessful
End If
Application.EnableCancelKey = xlInterrupt
End Sub
'*******************************************************************************
' メール送信(CDO) ※参照設定:Microsoft CDO for Exchange 2000 Library
' Microsoft ActiveX Data Objects 2.x Library
'*******************************************************************************
' [引数]
'1.MailSmtpServer : SMTPサーバ名(又はIPアドレス)
'2.MailFrom : 送信元アドレス
'3.MailTo : 宛先アドレス(複数の場合はカンマで区切る)
'4.MailCc : CCアドレス(複数の場合はカンマで区切る)
'5.MailBcc : BCCアドレス(複数の場合はカンマで区切る)
'6.MailReplyTo : REPLY-TOアドレス
'7.MailSubject : 件名
'8.MailBody : 本文(改行はvbCrLf付加)
'9.MailAddFile : 添付ファイル(複数の場合はカンマで区切るか配列渡し) ※Option
'10.MailCharacter : 文字コード指定(デフォルトはShift-JIS) ※Option
' [戻り値]
'正常時:"OK", エラー時:"NG"+エラーメッセージ
'*******************************************************************************
Private Function sendMailByCDO(MailSmtpServer As String, _
MailFrom As String, _
MailTo As String, _
MailCc As String, _
MailBcc As String, _
MailReplyTo As String, _
MailSubject As String, _
MailBody As String, _
Optional MailAddFile As Variant, _
Optional MailCharacter As String) As String
Const cnsOK As String = "OK"
Const cnsNG As String = "NG"
Dim objCDO As New CDO.Message
Dim vntFILE As Variant
Dim IX As Long
Dim strCharacter As String, strBody As String, strChar As String
On Error GoTo SendMailByCDO_ERR
sendMailByCDO = cnsNG
' 文字コード指定の確認
If MailCharacter <> "" Then
' 指定ありの場合は指定値をセット
strCharacter = MailCharacter
Else
' 指定なしの場合はShift-JISとする
strCharacter = cdoShift_JIS
End If
' 本文の改行コードの確認
' Lfのみの場合Cr+Lfに変換
strBody = Replace(MailBody, vbLf, vbCrLf)
' 上記で元がCr+Lfの場合Cr+Cr+LfになるのでCr+Lfに戻す
MailBody = Replace(strBody, vbCr & vbCrLf, vbCrLf)
With objCDO
With .Configuration.Fields ' 設定項目
.Item(cdoSendUsingMethod) = cdoSendUsingPort ' 外部SMTP指定
.Item(cdoSMTPServer) = MailSmtpServer ' SMTPサーバ名
.Item(cdoSMTPServerPort) = 25 ' ポートNo.
.Item(cdoSMTPConnectionTimeout) = 60 ' タイムアウト
.Item(cdoSMTPAuthenticate) = cdoAnonymous ' 0
.Item(cdoLanguageCode) = strCharacter ' 文字セット指定
.Update ' 設定を更新
End With
.MimeFormatted = True
.Fields.Update
.From = MailFrom ' 送信者
If MailTo <> "" Then .To = MailTo ' 宛先
If MailCc <> "" Then .CC = MailCc ' CC
If MailBcc <> "" Then .BCC = MailBcc ' BCC
If MailReplyTo <> "" Then .ReplyTo = MailReplyTo ' Reply-to
.Subject = MailSubject ' 件名
.TextBody = MailBody ' 本文
.TextBodyPart.Charset = strCharacter ' 文字セット指定(本文)
' 添付ファイルの登録(複数対応)
If ((VarType(MailAddFile) <> vbError) And _
(VarType(MailAddFile) <> vbBoolean) And _
(VarType(MailAddFile) <> vbEmpty) And _
(VarType(MailAddFile) <> vbNull)) Then
If IsArray(MailAddFile) Then
For IX = LBound(MailAddFile) To UBound(MailAddFile)
.AddAttachment MailAddFile(IX)
Next IX
ElseIf MailAddFile <> "" Then
vntFILE = Split(CStr(MailAddFile), ",")
For IX = LBound(vntFILE) To UBound(vntFILE)
If Trim(vntFILE(IX)) <> "" Then
.AddAttachment Trim(vntFILE(IX))
End If
Next IX
End If
End If
.Send ' 送信
End With
Set objCDO = Nothing
sendMailByCDO = cnsOK
Exit Function
'-------------------------------------------------------------------------------
SendMailByCDO_ERR:
sendMailByCDO = cnsNG & Err.Number & " " & Err.Description
On Error GoTo 0
Set objCDO = Nothing
End Function
|
|