[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロでメールの宛先編集』(まくろくん)
表題の件、教えてください。
マクロでOutlookメールの宛先を設定する際に、もし存在しないアドレスがいたら宛先から削除するやり方を探しています。
通常メールなら出来たのですが、同じ考え方で予定表の会議メールで宛先を設定しようとすると出来ません。分かる方がいらっしゃいましたらアドバイスお願いします。
<通常メール:うまくいく>
'Outlookメール作成
Dim myOutlook As Object Dim mail As Object
Set myOutlook = CreateObject("outlook.application") Set mail = myOutlook.CreateItem(0)
With mail .To = Worksheets("Sheet1").Range("A1").Value .CC = Worksheets("Sheet1").Range("B1").Value .Recipients.ResolveAll '宛先の名前の確定
' 存在しない宛先を除外 For i = .Recipients.Count To 1 Step -1 If Not .Recipients.Item(i).Resolved Then .Recipients.Remove i End If Next i End With
mail.Display
<予定表の会議メール:うまくいかない>
下記の状態で流すと、何も宛先に貼り付かない。
”存在しない宛先を除外”部分の工程をコメントアウトすると、宛先は貼り付くが、存在しないアドレスも貼りついてしまう。
Dim objApp As Object Dim objAppt As Object Dim objAttendee As Object
Set objApp = CreateObject("Outlook.Application") Set objAppt = objApp.CreateItem(1)
With objAppt .MeetingStatus = 1
'参加者(必須) Set objAttendee = .Recipients.Add(設定ws.Range("AW4").Value) objAttendee.Type = 1
'参加者(任意) Set objAttendee = .Recipients.Add(設定ws.Range("AX4").Value) objAttendee.Type = 2
' 宛先を確定(存在しない宛先を除外するために確定) .Recipients.ResolveAll
' 存在しない宛先を除外 For i = .Recipients.Count To 1 Step -1 If Not .Recipients.Item(i).Resolved Then .Recipients.Remove i End If Next i
'表示 .Display
< 使用 Excel:Microsoft365、使用 OS:Windows10 >
他の部分に間違いがないか、設定に問題がないか、
Excelのバージョンによる違いに問題がないかなどを確認してください。
そのままでと書きましたが、以下は追加したかな。
Dim i As Long Dim 設定ws As Worksheet: Set 設定ws = ActiveSheet
End With
>下記の状態で流すと、何も宛先に貼り付かない。
>”存在しない宛先を除外”部分の工程をコメントアウトすると、宛先は貼り付>くが、存在しないアドレスも貼りついてしまう。
明らかにおかしいですよね。
どのように動作しているかデバッグで追いかけてください。
(ゆたか) 2024/01/30(火) 11:41:51
必須に5人いてそのうち1人宛先不能が混じっている。
objAttendeeに5人分のアドレス格納される。
'参加者(必須) Set objAttendee = .Recipients.Add(設定ws.Range("AW4").Value) objAttendee.Type = 1
次に任意に3人いてそのうち2人宛先不能が混じっている。
objAttendeeに3人分のアドレス格納される
★必須と任意でobjAttendeeを使いまわしているため、必須に格納したのが書き換わってしまう?
'参加者(任意) Set objAttendee = .Recipients.Add(設定ws.Range("AX4").Value) objAttendee.Type = 2
' 宛先を確定(存在しない宛先を除外するために確定) .Recipients.ResolveAll
下記でRecipients.Countに何が入るかデバックで見たところ、宛先(必須、任意)を色々変更しても、
いつも「2」が入る。そのためか?、宛先に全く何も入らない現象となる。
' 存在しない宛先を除外 For i = .Recipients.Count To 1 Step -1 If Not .Recipients.Item(i).Resolved Then .Recipients.Remove i End If Next i (まくろくん) 2024/01/30(火) 13:50:18
わたしはそれぞれのセルに1つのメールアドレスが入っているのかと思っていましたが。
だから、カウントは当然ながら2です。
https://learn.microsoft.com/ja-jp/office/vba/api/outlook.recipients.add
ここを見ても、複数のレシピアントを一度に指定できるとはありませんが。
>★必須と任意でobjAttendeeを使いまわしているため、必須に格納したのが書き換わってしまう?
その時点で正しいアドレスがセットされているので問題ないと思います。
まあ、使い回しはしないほうが良いでしょうけれど(書き換え後に前のものと勘違いするかも)
(ゆたか) 2024/01/30(火) 15:36:49
For i = .Recipients.Count To 1 Step -1 If Not .Recipients.Item(i).Resolved Then .Recipients.Remove i End If Next i (まくろくん) 2024/01/30(火) 16:07:37
Sub c()
' ツール>参照設定でmicrosoft outlook xx.x object libraryをチェックしてね
Dim i As Long Dim 設定ws As Worksheet: Set 設定ws = ActiveSheet Dim Recipients As Variant
Dim objApp As Outlook.Application Dim objAppt As Outlook.AppointmentItem Dim objAttendee As Outlook.Recipient
Set objApp = CreateObject("Outlook.Application") Set objAppt = objApp.CreateItem(olAppointmentItem)
With objAppt
.MeetingStatus = olMeeting ' AppointmentItemをMeetingItemにする
Recipients = Split(設定ws.Range("AW4").Value, ";") '参加者(必須) For i = LBound(Recipients) To UBound(Recipients) Set objAttendee = .Recipients.Add(Recipients(i)) objAttendee.Type = olRequired Next
Recipients = Split(設定ws.Range("AX4").Value, ";") '参加者(任意) For i = LBound(Recipients) To UBound(Recipients) Set objAttendee = .Recipients.Add(Recipients(i)) objAttendee.Type = olOptional Next
.Recipients.ResolveAll 'すべての受信者オブジェクトを解決
For i = .Recipients.Count To 1 Step -1 ' 解決しない宛先を削除 If Not .Recipients.Item(i).Resolved Then .Recipients.Remove i Next i
.Display '表示
End With
End Sub (ゆたか) 2024/02/01(木) 09:28:51
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.