質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

Q&A

解決済

2回答

3087閲覧

マクロを使って一斉送信メールを行う

ichigo15

総合スコア14

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Office 365

Office 365は、マイクロソフトが販売している企業向けクラウドベースのグループウエアサービス。電子メールや予定表、Webサイト構築、オンラインストレージ、ビデオ会議などビジネスで必要な機能を備えています。クラウドサービスのため、自社での専用サーバーの設置の必要がないことが特徴です。

0グッド

0クリップ

投稿2019/12/25 03:49

前提・実現したいこと

マクロを使って一斉送信できるようにしたいです。
作成の際に参照しておりますのは下記のサイトです。

https://excel-excel.com/letsmake8/step0.html

作成はサイトに従って行っております。
各人のデスクトップにファイルを保管し、実行できるようにしたいです。

発生している問題・エラーメッセージ

コードのFunctionの箇所にセルが移動して下記のエラーが出ます。 コンパイルエラー このプロジェクトのコードは64ビットシステムで使用するために更新する 必要があります。 Declareステートメントの確認および更新を行い、次にDeclareステートメント にPtrSafe属性を設定してください。
そして下記のコードは全て赤色になっております。 Private Declare Function SendMail Lib "bsmtp" _ (szServer As String, szTo As String, szFrom As String, _ szSubject As String, szBody As String, szFile As String) As String

該当のソースコード

Option Explicit Private Declare Function SendMail Lib "bsmtp" _ (szServer As String, szTo As String, szFrom As String, _ szSubject As String, szBody As String, szFile As String) As String Private Function ExSendMail() As Boolean Dim sret As String Dim szServer As String 'SMTPサーバー名 Dim szFrom As String '送信元 Dim szTo As String '宛先 Dim szSubject As String '件名 Dim szBody As String '本文 Dim szFile As String '添付ファイル ExSendMail = False szServer = Range("H6") szFrom = Range("H7") szTo = Range("H7") szSubject = Range("H9") szBody = Range("H11") szFile = "" On Error GoTo ErrEnd sret = SendMail(szServer, szTo, szFrom, szSubject, szBody, szFile) ' 送信エラーの場合 If Len(sret) <> 0 Then MsgBox "送信エラー: " & sret, , "一斉メール送信" Else ExSendMail = True End If Exit Function ErrEnd: MsgBox "送信中にエラーが発生しました。" & vbCrLf & Err.Description, , "一斉メール送信" End Function Private Sub CommandButton1_Click() If ExSendMail Then MsgBox "正常に送信できました。", , "一斉メール送信" End If End Sub
'送信設定値のチェック Private Function ExDataCheck() As Boolean ExDataCheck = False If Range("I7") = "" Then MsgBox "SMTPサーバー名を入力してください。", , "一斉メール送信" Exit Function End If If Range("L7") = "" Then MsgBox "ポート番号を入力してください。(通常は「25」になります)", , "一斉メール送信" Exit Function End If If Range("I8") = "" Then MsgBox "送信元アドレスを入力してください。", , "一斉メール送信" Exit Function End If If Range("I10") = "" Then MsgBox "件名を入力してください。", , "一斉メール送信" Exit Function End If If Range("I11") = "" Then MsgBox "本文を入力してください。", , "一斉メール送信" Exit Function End If ExDataCheck = True End Function Private Sub CommandButton2_Click() Dim lrow As Long '送信設定値のチェック If ExDataCheck = False Then Exit Sub End If '送信先アドレスの最終行を調べる lrow = ActiveSheet.Range("D65536").End(xlUp).Row If lrow = 6 Then MsgBox "送信先アドレスは最低1件は入力してください。", , "一斉メール送信" End If End Sub '下記のVBAコードに変更してください。 Private Function ExSendMail() As Boolean Dim sret As String Dim szServer As String 'SMTPサーバー名 Dim szFrom As String '送信元 Dim szTo As String '宛先 Dim szSubject As String '件名 Dim szBody As String '本文 Dim szFile As String '添付ファイル ExSendMail = False szServer = Range("I7") & ":" & Range("L7") If Range("I6") = "" Then szFrom = Range("I8") Else szFrom = Range("I6") & "<" & Range("I8") & ">" End If szTo = Range("I8") szSubject = Range("I10") szBody = Range("I11") szFile = "" On Error GoTo ErrEnd sret = SendMail(szServer, szTo, szFrom, szSubject, szBody, szFile) ' 送信エラーの場合 If Len(sret) <> 0 Then MsgBox "送信エラー: " & sret, , "一斉メール送信" Else ExSendMail = True End If Exit Function ErrEnd: MsgBox "送信中にエラーが発生しました。" & vbCrLf & Err.Description, , "一斉メール送信" End Function Private Sub CommandButton1_Click() If ExDataCheck = False Then Exit Sub End If If ExSendMail Then MsgBox "正常に送信できました。", , "一斉メール送信" End If End Sub`
Private Sub ExAllSendMail(lrow As Long) Dim sret As String Dim szServer As String 'SMTPサーバー名 Dim szFrom As String '送信元 Dim szTo As String '宛先 Dim szSubject As String '件名 Dim szBody As String '本文 Dim szFile As String '添付ファイル Dim i As Long szServer = Range("J7") & ":" & Range("M7") If Range("J6") = "" Then szFrom = Range("JI8") Else szFrom = Range("J6") & "<" & Range("J8") & ">" End If szSubject = Range("J10") szBody = Range("J11") szFile = "" On Error GoTo ErrEnd For i = 7 To lrow '送信マークとアドレスの確認 If Cells(i, 2) = 1 And Cells(i, 4) <> "" Then Cells(i, 5) = "" Cells(i, 6) = "送信中!!" Cells(i, 6).Font.Color = RGB(255, 0, 0) '宛名 If Cells(i, 3) = "" Then szTo = Cells(i, 3) Else szTo = Cells(i, 3) & "<" & Cells(i, 4) & ">" End If sret = SendMail(szServer, szTo, szFrom, szSubject, szBody, szFile) Cells(i, 6).Font.Color = RGB(0, 0, 0) '送信エラーの場合 If Len(sret) <> 0 Then Cells(i, 5) = "Error" Cells(i, 6) = sret Else Cells(i, 5) = Format(Now, "yyyy/mm/dd hh:nn:ss") Cells(i, 6) = "" End If End If Next Exit Sub ErrEnd: Range("E2") = "" MsgBox "送信中にエラーが発生しました。処理を中止します。" _ & vbCrLf & Err.Description, , "一斉メール送信" End Sub '下記のVBAコードに変更してください。 Private Sub CommandButton2_Click() Dim lrow As Long '送信設定値のチェック If ExDataCheck = False Then Exit Sub End If '送信先アドレスの最終行を調べる lrow = ActiveSheet.Range("D65536").End(xlUp).Row If lrow = 6 Then MsgBox "送信先アドレスは最低1件は入力してください。", , "一斉メール送信" End If '一斉メール送信 ExAllSendMail lrow End Sub

補足情報(FW/ツールのバージョンなど)

参照設定はMicrosoft office 16.0 Object Libraryにチェックが入っております。

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

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

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

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

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

guest

回答2

0

今お使いのMS Officeは64bit版かと思われますが
エラーメッセージの意味としては以下のような雰囲気になります。

このプロジェクトのコードは64ビットシステムで使用するために更新する必要があります。

→ Declareステートメントの記述が古い(32bit専用)ため、64bitではそのままでは動かない可能性があります。記述を確認し、最新の書き方に更新してください。

Declareステートメントの確認および更新を行い、

→ 引数の型などを確認し必要に応じて修正してください

次にDeclareステートメントにPtrSafe属性を設定してください。

→ 記述の確認・更新ができたのであれば、PtrSafeを追加してください。

詳しくは以下のページを参照して修正してください。

Office の 32 ビット バージョンと 64 ビット バージョン間の互換性 | Microsoft Docs
Declare ステートメント (VBA) | Microsoft Docs


また、bsmtp自体が古く32bit版しか提供されていないようにも見えます。
このあたりあまり詳しいわけではありませんが、Declareステートメントを修正しても、dllが32bitなので実行できない可能性がありそうです。

メールの送信であればOutlookの自動操作や、CDO.Message(これも結構古いらしいですが)を使った方法もあるので、そちらを検討してもいいかもしれません。

投稿2019/12/26 05:17

imihito

総合スコア2166

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

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

ichigo15

2020/01/09 05:07

コメントありがとうございます。 64bit版には対応していなかったのですね。 他の方法で検討してみようと思います。
guest

0

自己解決

投稿しましたコードは自分のPCに対応していなかったので他の方法を
検討してみようと思います。

解決はしておりませんが、質問を終了とさせていただきます。

コメントをくださった方々、感謝いたします。

投稿2020/01/09 05:09

ichigo15

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問