dポイントプレゼントキャンペーン実施中!

一度、知恵袋で質問しましたが、回答に対して聞くことができないので、こちらで質問させて頂きます。

VBAでNotesからメールを送信する際、宛先に複数のアドレスを配列変数で指定すると、
2人目以降にメールが送信されません。

コードの内容はエクセルシートにあるアドレスリストのA列を順に配列にし、
重複しているアドレスを省いて配列変数(adrsarray)を作成し
配列変数に入っている複数の宛先へ、Notesからメールを送信するというものです。

以下、抜粋ですがコードを記します。

Const EMBED_ATTACHMENT As Integer = 1454
Dim nss As Object ' lotus.NOTESSESSION
Dim ndb As Object ' lotus.NOTESDATABASE
Dim ndoc As Object ' lotus.NOTESDOCUMENT
Dim rtitem As Object ' lotus.NOTESRICHTEXTITEM
Dim nemb As Object ' lotus.NOTESEMBEDDEDOBJECT
Dim fname As String
Dim r, lastr, i As Long
Dim tmp
Dim adrsarray, myarray, mydic, myitm, adrs As Variant


'A列のアドレスを配列変数adrsarrayに代入

For r = 2 To lastr
If Cells(r, 1) <> "" Then
If r = 2 Then
adrsarray = Cells(r, 1)
End If

If r > 2 Then
adrsarray = adrsarray & "," & Cells(r, 1)
End If

End If
Next

Set Dic = CreateObject("Scripting.Dictionary")

myarray = Split(adrsarray, ",")
For i = 0 To UBound(myarray)
If Not Dic.Exists(myarray(i)) Then
Dic.Add myarray(i), myarray(i)
End If
Next i

'(1)データの重複した配列を初期化し(2)で再度重複無しの配列を格納
adrsarray = ""

'(2)重複を除いて配列を作成
myitm = Dic.keys
For i = 0 To UBound(myitm)
If adrsarray = "" Then
adrsarray = myitm(i)
Else
adrsarray = adrsarray & "," & myitm(i)
End If
Next

Set Dic = Nothing


Set nss = CreateObject("Notes.NotesSession")
Set ndb = nss.GETDATABASE("", "")
ndb.OpenMail
Set ndoc = ndb.CREATEDOCUMENT()
ndoc.Subject = "データを送ります。"
ndoc.SendTo =Array(adrsarray)

ここで以下のように複数名のアドレスを指定すると
ndoc.SendTo = Array("○○@○○.com","○○@○○.com","○○@○○.com")
一斉送信できることがわかったのですが、
宛先は固定ではない為、Array(adrsarray)のように
取得した複数アドレスを入れたいのですが
私の作成したコードではうまく動作しません。

長々と申し訳ないですが
ndoc.SendTo =array(adrsarray) で送信するにはどうすればよろしいでしょうか。
ご教授よろしく御願い申し上げます。

A 回答 (2件)

Notes の事はさっぱりわかりませんが、



> ここで以下のように複数名のアドレスを指定すると
> ndoc.SendTo = Array("○○@○○.com","○○@○○.com","○○@○○.com")
> 一斉送信できることがわかったのですが、

という事なので、

> ndoc.SendTo =Array(adrsarray)

ndoc.SendTo = myitm

にすると、どうなりますか。
(myitm 自体は、重複の無いアドレスの配列になっているようですが)



余計なお世話で、気になった箇所を何点か

> Dim r, lastr, i As Long

Long は i だけで、r, lastr は Variant だったと思います。

コード部分は抜粋で、途中提示されていない処理をされているのかもしれませんが
ひと塊の処理と考えた時、以下のような書き方(雰囲気)もあるのかも(【未検証】)
(ndoc.SendTo = myitm で動いたっていう前提があってのものになりますが)

' ・・・・・
' ・・・・・
  Dim Dic As Object
  Dim ndoc As Object
  Dim r As Long, lastr As Long
  Dim adrsarray As Variant
'  Dim adrsstring As String

' ・・・・・
' ・・・・・
  
  Set Dic = CreateObject("Scripting.Dictionary")

  For r = 2 To lastr
    If (Cells(r, 1).Value <> "") Then
      Dic.Item(Cells(r, 1).Value) = Null
    End If
  Next

  If (Dic.Count = 0) Then
    ' アドレスがなかった場合 Exit ? する
    ' ・・・なら、後始末を忘れずに
  End If

  adrsarray = Dic.keys
  Set Dic = Nothing

'  adrsstring = Join(adrsarray, ",") ' カンマ(,)区切りで1つの文字列に
' ・・・・・
' ・・・・・
  ndoc.SendTo = adrsarray
' ・・・・・


Dic.Item(キー) = 値
では、
キーが登録済みなら値を設定
キーが登録されていなかったら、キーを登録してから値を設定
だったと思います。
今回、値は不要と思うので、Null にしてみました

※ Exists & Add との性能比較・・・・は、わかりません
    • good
    • 0
この回答へのお礼

早速回答頂きありがとうございました。
Set Dic = Nothing の後
adrs = Split(adrsarray, ",")  として
ndoc.SendTo = adrs
とすれば、配列に格納したアドレスに一斉送信することができました。
文字列と配列の使い分けができていなかったようです。
ありがとうございました。

お礼日時:2011/09/15 14:59

よくわかりませんが、メールアドレスを配列ではなくカンマで羅列した


文字列にしてみてはどうでしょうか?
もしくは配列を必要回数ループ処理して、メールするとか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
配列から取り出したものを1つずつ送信することも考えたのですが
送信された人が誰宛に送られているか分かるように
どうしても、一斉送信したかったので、悩んでいました。
配列にばかり固執していましたが、文字列というヒントを頂き
配列と文字列の使い分けを再度考えてみました。
なんとか解決にこじつけました。
ありがとうございました。

お礼日時:2011/09/15 15:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!