🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

2948閲覧

access vba 行ごとにメール送信 宛先不明時の処理ルーチン

emplus

総合スコア17

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/02/12 01:02

2020/07に投稿した者です。

テーブルに複数行のレコードがあり、メールアドレスや他のカラムがあります。
必要なカラムを一時的に保持してメール本文に代入し、これをCDOでメール送信しています。

リリース前テストの段階でバグに気づきました。

メールアドレスが誤っていると,次のレコードにいかずエラーで終わってしまいます。
(Err_Exit:に移動させているので当たり前)

メールアドレスが誤っていたら送れなかったというログを取得し,次のレコードを
処理して欲しい
のですが,知見の浅さからどうにもなりません。

objCDO.Send でメールサーバーに問い合わせた結果がエラーなので
都度都度問い合わせ結果を取得しなくてはいけない所は理解するのですが。

こういった案件に長けている有識者からの提供をお待ちしております。

Public Function cdoSendMail() As Boolean

Dim objCDO Dim MSgw On Error GoTo Err_Exit '戻り値の初期化 cdoSendMail = True Set objCDO = CreateObject("CDO.Message") 'CDOのスキーマを定義 MSgw = "http://schemas.microsoft.com/cdo/configuration/" With objCDO.Configuration.Fields 'メール送信方法 .Item(MSgw & "sendusing") = 2 'SMTPサーバーのアドレス .Item(MSgw & "smtpserver") = "hoge.hoge.com" 'SMTPサーバーのポート .Item(MSgw & "smtpserverport") = 465 '差出人ユーザー名 .Item(MSgw & "sendusername") = "username" '認証コード .Item(MSgw & "sendpassword") = "userpassword" 'SSL認証要 .Item(MSgw & "smtpusessl") = True '認証方式(1) .Item(MSgw & "smtpauthenticate") = cdoBasic 'タイムアウト .Item(MSgw & "smtpconnectiontimeout") = 60 .Update End With '差出人メールアドレス objCDO.From = "sasidasinin@hoge.com" Dim dbo As DAO.Database 'DAO使用時定型 Dim rst As DAO.Recordset 'DAO使用時定型 Dim sSqlStr As String 'SQL文 Dim sTo As String 'sTO = "宛先のアドレス" sSqlStr = "SELECT * FROM 該当テーブル" Set dbo = CurrentDb Set rst = dbo.OpenRecordset(sSqlStr) Do Until rst.EOF 'あて先メールアドレス objCDO.To = rst.Fields("メールアドレス") sTo = rst.Fields("メールアドレス") '件名 objCDO.Subject = "件名"

'本文

objCDO.TextBody = " " _ & vbNewLine & "一行目"_ & vbNewLine & "二行目"_ '文字化け対応のため追加 objCDO.TextBodyPart.Charset = "ISO-2022-JP" objCDO.Send rst.MoveNext Loop cdoSendMail = True

rst.Close

dbo.Close

Exit Function

Err_Exit:

MsgBox Err.Number & ":" & Err.Description & vbCrLf, vbOKOnly + vbCritical + vbSystemModal, "メール送信エラー"

End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

objCDO.Send でエラーが出ているのですね。

ならば、その時のエラー番号を調べて、エラー処理でそのエラー番号の時は、Resume Next でエラー行の次の行から再開させればいいでしょう。

vba

1 2'前略 3 4Err_Exit: 5 Select Case Err.Number 6 Case 該当のエラー番号 7 Resume Next 8 Case Else 9 MsgBox Err.Number & ":" & Err.Description & vbCrLf, vbOKOnly + vbCritical + vbSystemModal, "メール送信エラー" 10 End Select 11 12End Function

投稿2021/02/12 02:09

編集2021/02/12 02:10
hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

emplus

2021/02/12 02:36

すごいです。実は一週間悩みました。そうか,エラー番号をつかんで,,,,。 このソースだとErr.Dscriptionした内容,「誤ったメールアドレス」を保管できないように 見えるのですが,保管する手立ては存在するのでしょうか。。。。
hatena19

2021/02/12 03:53

Resume Next の前に「誤ったメールアドレス」を保管するコードを挿入すればいいでしょう。
emplus

2021/02/12 04:58

Callで保管するmouleにして完成しました。 アドバイスを深く感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問