アプリ版:「スタンプのみでお礼する」機能のリリースについて

チェックが入った情報を置換?して標準モジュールに受け渡したいです。

◼️やりたいこと
ユーザーフォームに設定したチェックボックスのチェックが入ってる人をアドレスに置換して標準モジュールのメール作成コードのtoに入れたい。
Initializeに何か設定しておけばいいのか、完了クリック時に何か設定するのかわからずうまくいきません。

VBAは勉強中のレベルです。どなたかご教授ください。


sub mail()
Form_adr.Show

Dim objOutlook As Outlook.Application
Dim objMail As Outlook.MailItem
Set objOutlook = New Outlook.Application
Set objMail = objOutlook.CreateItem(olMailItem)

With objMail
.To = ★←ここにチェックいれた人のアドレスを入れたい
.HTMLBody = "test"
End With

Unload Form_adr
End sub


▼Form_adrの中身  ()内はオブジェクト名

□田中 □鈴木 □佐藤  [完了]
(cb1)  (cb2)  (cb3)

[完了]はコマンドボタンで.Me Hideだけ書いています。

質問者からの補足コメント

  • ご回答ありがとうございます。
    複数宛先を選ぶ可能性もあるので別のプロシージャに分けたいと思います。(1件の可能性もあります)
    複数あった場合、★印をどう渡したらいいのでしょうか。
    イメージはできるのですが、どこで引数にするのかもわからなくなってしまいました…

    ▽add[完了]ボタンの中身
    Private Sub OKbutton_Click()
    Me.Hide
    Call sendmail(★)
    End Sub

    ▽メール作成コード
    Sub sendmail(★)
    〜割愛
    .To =★
    〜割愛
    End sub

      補足日時:2022/06/08 17:54

A 回答 (4件)

こんにちは



全体像が不明ですが、対象は一人だけと考えてよいのでしょうか?
(配列で渡すなどすれば、複数でも考え方は同様です。)

いずれにしろ変数の内容を受け取って、入れ込めば良いのですが・・
ご提示のコードでは、mainからFormを表示しているようですので、
共通変数を用意しておいて、
 1)Form側から、共通変数に値(アドレス等)を設定してHide
 2)main側で、共通変数を読み取り、指定位置に設定
というような方法が考えられます。
https://docs.microsoft.com/ja-jp/office/vba/lang …


必ずしも共通変数を利用しなくても、例えばセルの値を利用する方法などでも同様のことは可能です。
要は、両方のプロシージャからアクセス可能なところに一時的に値をセットして引き渡すという考え方です。

そんな面倒なことをしなくても、プロシージャの引数に直接引き渡す方法も考えられます。
ご提示のコードで、メール送信部分を別プロシージャ(仮に、sendMail()とします)にしておいて、Form側からこれを呼び出す方法です。
 Sub sendmail(byref addr as String)
などとしておいて、Form側からは
 Call sendmail(mailAddress)
として呼び出すといった感じです。
こちらの方法が最も簡単だと思いますけれど、この場合は、ご提示のコードの全体構成を変える必要がありそうです。
    • good
    • 0

No1です。



>複数あった場合、★印をどう渡したらいいのでしょうか。
実際の内容がはっきりとわからないので、半分は推測になってしまいますが・・

同じ内容のメールを複数人に送るのであれば、宛先をまとめて1回の送信で済ます方法も考えられます。
その場合は、宛先を連結しておけばよかったはずと思います。
ただし、受信者に他の同時送信者がわかるので、これがNGの場合は個別に送るか、BCCで送るかになるかと。


個別に複数回送信するにしても、大雑把に2種類の方法が考えられます。
(肝心の本文をどうするのかがわかりませんけれど・・)
1)Form側からループ等で、必要回数sendmailを呼び出す。
 例えば、Form側でループ等でチェックボックスをチェックして、都度送信するなら
 (以下では、ひとまず配列にいれた内容を送っていますが・・)
 この場合は、呼び出し回数がメールを送る回数になります。
[ Form側 ]
mailAddresses = Array("address11", "address22", "address33")
For i = LBound(mailAddresses) To UBound(mailAddresses)
Call sendmail(CStr(mailAddresses(i)))
Next i

[ sendmail ]
Sub sendmail(ByRef mailAddress As String)
MsgBox mailAddress
End Sub
のような構成になっていれば、アドレスが順にMsgBoxで表示されます。
MsgBoxで表示する代わりに、メールを送信する処理にすれば良いでしょう。


2)Form側から配列などでまとめて渡し、sendmail側で個別に処理する。
 (個々にメールを送信することを想定しています)
 こちらの場合は、呼び出しは1回のみになります。
[ Form側 ]
mailAddresses = Array("address11", "address22", "address33")
Call sendmail(mailAddresses)

[ sendmail ]
Sub sendmail(ByRef mailAddresses As Variant)
For i = LBound(mailAddresses) To UBound(mailAddresses)
MsgBox mailAddresses(i)
Next i
End Sub
こちらも同様に、MsgBox(=メール送信の代わり)で順に表示されます。
上記のように処理する場合は、1通だけ送信する場合でも配列引数で渡す必要があります。
(数が可変の引数という概念等(=paramarrays)もありますが、混乱するだけと思いますので省略)
    • good
    • 0

申し訳ない


#1ご回答と内容丸かぶりでした。
#2は無視して下さい。
    • good
    • 0

こんにちは。



Form_adr.Show

で表示されたForm_ adr が閉じる、または非表示されると、呼び出し元プロシージャ、ここでは次行の

Dim objOutlook As Outlook.Application

にフローが戻ります。

ご質問分では Form_ adr を Me.Hideで非表示としていますよね。

オンメモリのままです。つまり、

Form_ adr.Checkbox1.Value

などプロパティーなどにアクセス可能ということです。
必要なデータを受け取ったら Unload して下さい。

Unload Firm_adr

その他のデータ受け渡し方法としては

1. グローバルレベル変数を使う
2. 外部1時ファイルを使う
3. セルを使う
4. 関数に引数を持たせる

など。私なら4.の方法を使います。
#1ご回答で最後に紹介された方法です。

複数の宛先を引数で渡す可能性があるなら、引数をVariant型にして、値または配列のどちらが渡されたのかは受け手側でIsArray関数を使って条件分岐します。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています