teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記

2020/04/07 03:07

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -65,4 +65,70 @@
65
65
   ↓
66
66
  wsMailSource
67
67
  とかどうですか?英語が苦手なのでおかしなことを書いているかもですが^^;
68
- お好みで^^
68
+ お好みで^^
69
+
70
+ ---
71
+ > ⓵最初のwsMailがobjMailで何故動作するのか、
72
+ > ②24行目と29行目の.Rangeの前にwsMailをつけるのは何故なのか
73
+
74
+ Set wsMail = ThisWorkbook.Sheets("メール内容")
75
+
76
+ ↑ここで、エクセルのシートそのものを変数に代入しています。
77
+
78
+ Set objMail = objOutlook.CreateItem(olMailItem)
79
+
80
+ ↑ここで、アウトルックのメール(?)そのものを変数に代入しています。
81
+
82
+ なので、エクセルのシート上の値を読むときは、
83
+
84
+
85
+ wsMail.Range("B1").Value
86
+ (変数に入っている)シートの中の指定するセル(B1セル)の値
87
+
88
+
89
+
90
+ objMail.Subject
91
+ (変数に入っている)メールの件名
92
+
93
+ に渡したいなら
94
+ objMail.Subject = wsMail.Range("B1").Value
95
+
96
+ とイコールつなぐと右辺から左辺へ代入
97
+ という意味になります。
98
+
99
+ With が曲者ですね。理解をするのに妨げになってます。
100
+
101
+ With でオブジェクト(≒操作対象そのもの)を示したとき、
102
+ .To
103
+ は、
104
+ その宛先
105
+ .Subject
106
+ は、
107
+ その件名
108
+
109
+ というような意味になります。
110
+ なので、
111
+
112
+ ```VBA
113
+
114
+ objMail.To = wsList.Cells(i, 4).Value 'メール宛先
115
+ objMail.Subject = wsMail.Range("B1").Value 'メール件名
116
+ objMail.BodyFormat = olFormatPlain 'メールの形式
117
+ objMail.Body = wsList.Cells(i, 1).Value & vbCrLf & _
118
+ wsList.Cells(i, 2).Value & " " & _
119
+ wsList.Cells(i, 3).Value & " 様" & vbCrLf & vbCrLf & _
120
+ wsMail.Range("B2").Value 'メール本文
121
+ objMail.Send
122
+ ```
123
+
124
+ こう書いても同じ意味になります。
125
+ 対象が同じなら省略しちゃえってことですね。
126
+ wsList と
127
+ wsMail とには、
128
+ 当然違うシートが代入されていますから、
129
+ どっちのシートの話をするのかちゃんと書かないといけないことになります。
130
+
131
+ どの操作対象に対してどんなことをしたいかを明示しなければ、
132
+ 命令を受ける人は、「解らない!」と投げ出す(エラーを返す)か、
133
+ 忖度して適当なことをして返す(間違ったことをする)かどっちかなので、
134
+ しっかり明言して命令することが肝要です。

1

追記

2020/04/07 03:07

投稿

mattuwan
mattuwan

スコア2167

answer CHANGED
@@ -37,4 +37,32 @@
37
37
 
38
38
  objMail.Send
39
39
  End With
40
- ```
40
+ ```
41
+
42
+ ---
43
+ > すると、今度は24行目
44
+ >
45
+ > .Subject = .Range("B1").Value 'メール件名
46
+ >
47
+ > で、438エラー
48
+ >
49
+ > (オブジェクトは、このプロパティまたはメソッドをサポートしていません)
50
+ >
51
+ > が出ました。
52
+
53
+ 当然Rangeは、メールのメンバーではないので、
54
+ エラーになりますね。
55
+ 今回は実行時エラーなので、コンパイルだけでは発見できませんでした。
56
+
57
+ .Subject = wsMail.Range("B1").Value
58
+
59
+ エクセルのシートのセルの値を、メールの件名(?)に渡すのですよね?
60
+ この辺も手打ちで意識して書いていたら間違えない部分です。
61
+
62
+ 変数名が似ていて間違いやすいかも?
63
+ かといって僕もそう書くかもしれませんが、、、、
64
+ wsMail
65
+  ↓
66
+ wsMailSource
67
+ とかどうですか?英語が苦手なのでおかしなことを書いているかもですが^^;
68
+ お好みで^^