![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
一度、知恵袋で質問しましたが、回答に対して聞くことができないので、こちらで質問させて頂きます。
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) で送信するにはどうすればよろしいでしょうか。
ご教授よろしく御願い申し上げます。
No.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 との性能比較・・・・は、わかりません
早速回答頂きありがとうございました。
Set Dic = Nothing の後
adrs = Split(adrsarray, ",") として
ndoc.SendTo = adrs
とすれば、配列に格納したアドレスに一斉送信することができました。
文字列と配列の使い分けができていなかったようです。
ありがとうございました。
No.1
- 回答日時:
よくわかりませんが、メールアドレスを配列ではなくカンマで羅列した
文字列にしてみてはどうでしょうか?
もしくは配列を必要回数ループ処理して、メールするとか?
回答ありがとうございます。
配列から取り出したものを1つずつ送信することも考えたのですが
送信された人が誰宛に送られているか分かるように
どうしても、一斉送信したかったので、悩んでいました。
配列にばかり固執していましたが、文字列というヒントを頂き
配列と文字列の使い分けを再度考えてみました。
なんとか解決にこじつけました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) vba 重複データ合算 5 2023/07/05 18:55
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) VBAで組み合わせ算出やCOUNTIFSの処理を高速化したいです。 4 2022/04/07 02:38
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
構造体配列内の文字列検索のよ...
-
Dir関数で読み取り順を操作でき...
-
定数配列の書き方
-
vba フィルター 複数条件 3つ以...
-
VB6のメモリ解放に関して
-
複数のtextboxの処理を一括で行...
-
Redim とEraseの違いは?
-
COBOLの基本的な事なので...
-
配列の中から最大値だけ取り出...
-
VB6でやると構造体の配列になる...
-
OutOfMemoryExceptionの回避策...
-
Excelのメモリ(配列)の上限は2G...
-
Excel2010のinputboxで複数デー...
-
VBScript で ADO Streamオブジ...
-
C++で作成したDLLにVBAから配列...
-
デバイスマネージャーの一覧取得
-
配列の中の最大値とそのインデ...
-
配列をランダムに並び替えても...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 変数名に変数を使用したい。
-
C#でbyte配列から画像を表示さ...
-
vba フィルター 複数条件 3つ以...
-
Dir関数で読み取り順を操作でき...
-
エクセルでXY座標に並べられた...
-
配列の中の最大値とそのインデ...
-
VB.NETの配列にExcelから読み込...
-
定数配列の書き方
-
Excel2010のinputboxで複数デー...
-
大量の変数を定義するにはどう...
-
構造体配列の特定のメンバーをF...
-
構造体配列内の文字列検索のよ...
-
Redim とEraseの違いは?
-
Segmentation Fault (メモリ制限?)
-
OutOfMemoryExceptionの回避策...
-
VBAでMODE関数をつくる
-
COBOLの基本的な事なので...
-
Excelのメモリ(配列)の上限は2G...
-
コンボボックスのインデックス...
-
VB6のメモリ解放に関して
おすすめ情報