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

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

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

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

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Q&A

解決済

1回答

13200閲覧

VBA コンパイルエラー:メソッドまたはデータメンバーが見つかりません の解決

r_o_234

総合スコア15

VBA

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

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

0グッド

0クリップ

投稿2020/04/06 06:55

前提・実現したいこと

エクセルのVBAとOutlookを連携させて一括送信メーラーを創っています。
指南サイトの手順通りに実装した所、以下のエラーメッセージが発生しました。

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

コンパイルエラー:メソッドまたはデータメンバーが見つかりません

該当のソースコード

VBA

1Sub SendEmail() 2 3Dim objOutlook As Outlook.Application 4Dim i 5Dim rowMax As Long 6Dim wsList As Worksheet 7Dim wsMail As Worksheet 8Dim objMail As Outlook.MailItem 9 10Set objOutlook = New Outlook.Application 11Set wsList = ThisWorkbook.Sheets("送信先") 12Set wsMail = ThisWorkbook.Sheets("メール内容") 13 14With wsList 15 16 '送信先の件数 17 rowMax = .Cells(Rows.Count, 1).End(xlUp).Row 18 19 '送信先の件数分繰り返す 20 For i = 2 To rowMax 21 Set objMail = objOutlook.CreateItem(olMailItem) 22 With wsMail 23 .To = wsList.Cells(i, 4).Value 'メール宛先 24 .Subject = .Range("B1").Value 'メール件名 25 .BodyFormat = olFormatPlain 'メールの形式 26 .Body = wsList.Cells(i, 1).Value & vbCrLf & _ 27 wsList.Cells(i, 2).Value & " " & _ 28 wsList.Cells(i, 3).Value & " 様" & vbCrLf & vbCrLf & _ 29 .Range("B2").Value 'メール本文 30 31 objMail.Send 32 End With 33 Next i 34 35 Set objOutlook = Nothing 36 MsgBox "送信完了" 37 38End With 39 40End Sub

試したこと

Google検索をして、単なるスペルミスなのか、iの4のセルが原因なのかと考えましたが、わかりませんでした。
もしおわかりになれば考え方やヒントをご教授願います。

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

Windows10
Excle2019

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

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

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

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

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

guest

回答1

0

ベストアンサー

With wsMail

With objMail

ですかね?

一応、デバック→コンパイル としてエラーになりませんでした。
OutLookのVBAを操作したことないのでそれだけでいいかは知りません。

メンバーというのは、
オブジェクト(メールやシート)を構成する命令やプロパティ等のことです。
(今回の件だとTo プロパティ等です)
盲目的にコピペをしただけだとわかりませんが、
手入力していくと、

With objMail .

と、ピリオドまで入れると入力候補としてメンバーの一覧が出てくるので、
それを使うと間違いがないし、指定しているオブジェクトが、
間違っていることにも早く気づけると思います。

VBA

1 With objMail 2 'With wsMail 3 .To = wsList.Cells(i, 4).Value 'メール宛先 4 .Subject = .Range("B1").Value 'メール件名 5 .BodyFormat = olFormatPlain 'メールの形式 6 .Body = wsList.Cells(i, 1).Value & vbCrLf & _ 7 wsList.Cells(i, 2).Value & " " & _ 8 wsList.Cells(i, 3).Value & " 様" & vbCrLf & vbCrLf & _ 9 .Range("B2").Value 'メール本文 10 11 objMail.Send 12 End With

すると、今度は24行目

.Subject = .Range("B1").Value 'メール件名

で、438エラー

(オブジェクトは、このプロパティまたはメソッドをサポートしていません)

が出ました。

当然Rangeは、メールのメンバーではないので、
エラーになりますね。
今回は実行時エラーなので、コンパイルだけでは発見できませんでした。

.Subject = wsMail.Range("B1").Value

エクセルのシートのセルの値を、メールの件名(?)に渡すのですよね?
この辺も手打ちで意識して書いていたら間違えない部分です。

変数名が似ていて間違いやすいかも?
かといって僕もそう書くかもしれませんが、、、、
wsMail

wsMailSource
とかどうですか?英語が苦手なのでおかしなことを書いているかもですが^^;
お好みで^^


⓵最初のwsMailがobjMailで何故動作するのか、
②24行目と29行目の.Rangeの前にwsMailをつけるのは何故なのか

Set wsMail = ThisWorkbook.Sheets("メール内容")

↑ここで、エクセルのシートそのものを変数に代入しています。

Set objMail = objOutlook.CreateItem(olMailItem)

↑ここで、アウトルックのメール(?)そのものを変数に代入しています。

なので、エクセルのシート上の値を読むときは、

wsMail.Range("B1").Value
(変数に入っている)シートの中の指定するセル(B1セル)の値

objMail.Subject
(変数に入っている)メールの件名

に渡したいなら
objMail.Subject = wsMail.Range("B1").Value

とイコールつなぐと右辺から左辺へ代入
という意味になります。

With が曲者ですね。理解をするのに妨げになってます。

With でオブジェクト(≒操作対象そのもの)を示したとき、
.To
は、
その宛先
.Subject
は、
その件名

というような意味になります。
なので、

VBA

1 2 objMail.To = wsList.Cells(i, 4).Value 'メール宛先 3 objMail.Subject = wsMail.Range("B1").Value 'メール件名 4 objMail.BodyFormat = olFormatPlain 'メールの形式 5 objMail.Body = wsList.Cells(i, 1).Value & vbCrLf & _ 6 wsList.Cells(i, 2).Value & " " & _ 7 wsList.Cells(i, 3).Value & " 様" & vbCrLf & vbCrLf & _ 8 wsMail.Range("B2").Value 'メール本文 9 objMail.Send

こう書いても同じ意味になります。
対象が同じなら省略しちゃえってことですね。
wsList と
wsMail とには、
当然違うシートが代入されていますから、
どっちのシートの話をするのかちゃんと書かないといけないことになります。

どの操作対象に対してどんなことをしたいかを明示しなければ、
命令を受ける人は、「解らない!」と投げ出す(エラーを返す)か、
忖度して適当なことをして返す(間違ったことをする)かどっちかなので、
しっかり明言して命令することが肝要です。

投稿2020/04/06 08:30

編集2020/04/07 03:07
mattuwan

総合スコア2163

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

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

r_o_234

2020/04/07 06:00 編集

mattuwanさん、ご返信ありがとうございます。 With wsMailをWith objMailに置換しました。 すると、今度は24行目 .Subject = .Range("B1").Value 'メール件名 で、438エラー (オブジェクトは、このプロパティまたはメソッドをサポートしていません) が出ました。 おっしゃる通りに、盲目的にコピペでなく、手入力して間違いを確認するやり方で、もう少し調べてみます。 エラーチェックの手法を教えて頂き、ありがとうございました! ------------------------------------------------------------------------------------------------ mattuwanさん ご返信ありがとうございます。 ひとまず解決しました。 新しくVBAを創り直し、一旦、全部手入力で入力しました。 24行目 .Subject = .Range("B1").Value 'メール件名 438エラー (オブジェクトは、このプロパティまたはメソッドをサポートしていません) のエラー解決の為に、おっしゃる通り、wsMailをつけました。 すると今度は、27行目(.Bodyの構文内)で、また438エラーが出ました。 よって同様に、29行目にwsMailをつけ、wsMail.Range("B2").Value と変更した所、正常に動作しました。 動作はしましたが、⓵最初のwsMailがobjMailで何故動作するのか、②24行目と29行目の.Rangeの前にwsMailをつけるのは何故なのか、等、VBAの基本的な事が良く判っていないので、もう少し調べてみます! ご協力ありがとうございました! ------------------------------------------------------------------------------------------------ mattuwanさん、ご返信ありがとうございます。 なるほど、そうなんですね。 wsMailとobjMailにエクセルとアウトルックを変数として代入していると理解できました。 また、Withの使い方も学ぶことが出来ました。 丁寧に教えて頂きまして、勉強になりました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問