メールテンプレを作るため、ワードに差し込み印刷したいと考えています。
本当はアクセス内で解決したいですが、メールの長文の中に名前を差込むようなワードの差込印刷のような機能はありませんよね…?
そこで
元になるクエリを作成し、差込印刷ボタンを押して、ワードの差込ファイルも作成できたのですが、VBAでボタンを押すと該当のワードファイルにに該当のクエリを差込して開く。という自動アクションは不可能なのでしょうか。(調べたところ不可能なのかと思っていますが…)
メールテンプレを作るため、ワードに差し込み印刷したいと考えています。
本当はアクセス内で解決したいですが、メールの長文の中に名前を差込むようなワードの差込印刷のような機能はありませんよね…?
そこで
元になるクエリを作成し、差込印刷ボタンを押して、ワードの差込ファイルも作成できたのですが、VBAでボタンを押すと該当のワードファイルにに該当のクエリを差込して開く。という自動アクションは不可能なのでしょうか。(調べたところ不可能なのかと思っていますが…)
やろうと思えばできますよ。
T_メールテンプレート
「本文」フィールドに下記のような感じでテンプレート文を入力します。
送信データテーブルは下記とします。
T_メール送信
クエリを作成して T_メール送信 と T_メールテンプレート を テンプレートID で結合します。
これをレコードソースとするフォームを作成して、テキストボックスを配置してコントロールソースを下記のように設定します。
これでフィールドのデータが差し込まれた本文が表示されます。
あとは、下記のような方法でメール送信できます。
■T'sWare Access Tips #463 ~既定のメールソフトで新規メールにデータを添付する方法~
AccessからVBAでメールを送信する2つの方法|アズビーパートナーズ
ありがとうございます!メーラーが会社の規定のもので、WEBメーラーなので送信にはつなげられないかもしれませんが、作成の部分は参考にさせていただき、今から作成していきます!
そこで1つ質問です。
差込印刷では以下のようなことが可能でした。アクセスで行うにはどうしたらよいでしょうか。
コントロールソースへの式?クエリの設定?悩んでいます・・
TO欄
To1&","&To2
Cc欄
Cc1&","&Cc2&","&Cc3
メールアドレス欄。複数の場合は間に","が必要。
Ccについて、例えばCc1とCc2しかなければ、Cc3のまえの","が不要となる。
ごめんなさい、作成方法は今から確認しようと思いながら違う質問をしたつもりでしたが、同じことで対応できそうですね!すみません。確認します。
Cc1, Cc2, Cc3 というフィールドがあるということなら、
Cc欄のテキストボックスのコントロールソースを下記のようにすればいいでしょう。
なるほど…本当に勉強になります。素晴らしいですね!
あと、メーラーがWEBメールなら、WEBスクレイピングという方法で自動化できるかもしれません(セキュリティがきつく設定してあるとできない場合もありますが)。
「VBA WEBスクレイピング」で検索する解説ページがいろいろ見つかります。
メールテンプレを作成してみたのですが、
コントロールソースに
=Replace([メールタイトル],"【タイトル一部】",[タイトル一部])
と入れるとエラーになり、#Type!と表示されています。
ちなみに、
=Replace([メールタイトル],"【タイトル一部】","テスト")
や
[タイトル一部]
はうまくいきます。
クエリに式を入れたらうまくいきました!
WEBスクレイピングの件も、調べてみます。ありがとうございました!!
=Replace(Replace(Replace(Replace(Replace([本文], "【氏名】", [氏名]), "【品名】", [品名]), "【入荷予定日】", [入荷予定日]), "【価格】", [価格]), "【担当者】", [担当者])
↑この式を使って、クエリに入力してタイトルはうまくいったのですが、メール本文の式が長すぎてエラーが出ます。
VBAに組み込みたいと思ったのですが、どうやって組み込んだらいいか、答えが見つからない状況です…
方法はありますでしょうか。
VBAでイミディエイトウィンドウでテストしてみたところ、どうもフィールドが空のところを追加するとエラーが出るようでした。解決方法を探ってみることにします。
Nz関数をつかう。
Replace([本文], "【氏名】", Nz([氏名],""))
あるいは、
テーブルのデザインビューでフィールドの「値要求」プロパティを「はい」に、「空文字列の許可」を「はい」に設定する。
上記の2つの対策のどちらかをしてください。
後者の方がお勧めです。
ありがとうございます。
後者を使いたいのですが、空欄が出る欄については空欄がない場合は改行をしたくないという条件を付けたく思っています。そこで、下記の式を作りましたが、データがあってもなくても改行してしまいます…なぜでしょうか。
勉強のため、大変でなければ、Replaceでの正解も教えていただけると助かります。
"{添付2}", Nz(Chr(13) + Chr(10) & [添付2案件], "")),
"{添付3}", Nz(Chr(13) + Chr(10) & [添付3案件], "")),
"{添付4}", Nz(Chr(13) + Chr(10) & [添付4案件], "")) _
>空欄がない場合は
⇒空欄の場合は・・の間違いです・・
"{添付2}", Nz(Chr(13) + Chr(10) + [添付2案件], "")),
"{添付3}", Nz(Chr(13) + Chr(10) + [添付3案件], "")),
"{添付4}", Nz(Chr(13) + Chr(10) + [添付4案件], "")) _
でいかがでしょうか。
kitasue様
うまくいきました!ありがとうございました。
"{添付2}", Format([添付2案件], Chr(13) & Chr(10) & "&")),
"{添付3}", Format([添付3案件], Chr(13) & Chr(10) & "&")),
"{添付4}", Format([添付4案件], Chr(13) & Chr(10) & "&")) _
だと、[添付2案件] が Null でも "" でもOKです。
ありがとうございます。こちらを使わせていただきます!
nullは難しいですね…
説明を読んでも未だ、理解しきれておりません。
空白だったら…の条件を設定する際はいつも悩んでしまいます。
このQA面白いですね。とても勉強になります
kitasueさん、cerophanさん
VBAは文字列の連結に「+」を許容しますが、特別な理由がない限り「&」を使うべきです。Nz()関数は評価値がNullであることを条件に特別な処理をする関数ですが、評価値の最初に
Chr(13)
がある時点で、これがNullになることがあるのか?と疑問に思ってしまいます。条件分岐で処理をするならとするほうが、何をしているのかわかるコードになります。hatenaさん指摘のとおり、データ形式によってはうまく動作しないことも考えられます
Format 関数
改めて眺めていましたが難しい関数ですね。
Nullはまだしも「長さ0の文字列("")」は「すべての文字列データ」に該当しないんですねぇ
何もしないためにFormat()関数を使うのはかなり高等テクニックだと思います。さすがhatenaさんですね
hiroton さん
+と&の違いは気になっていたところでした。詳しく教えていただきありがとうございます。
確かに、IIfだとわたしでも理解できました。
Format関数の解説もありがとうございます。あとでじっくり確認させていただきます。
=[Cc1] & Format([Cc2],"\,&") & Format([Cc3],"\,&")
今更ですが、「"\,&") 」これの意味がわかりきれておりません。
解説ページを探すのですが、検索できず…
その他、①nullについて②""の使い方←SQLのWHEREと関係ある??
がなかなか理解できず困っております。
Format関数の設定は、書式プロパティの設定と同じですので、理解しておくと応用が効きます。
"\,&" ですが、コピーしてVBEとか書式プロパティに貼り付けると "¥,&" となります。(ブラウザ上では¥ は \ に変換されるので)
紛らわしいのでいちおう理解しておいてください。
書式プロパティの設定(=Format関数の設定)では、¥ の後に記述したテキストはそのまま表示されます。
例えば日付などは、
yyyy¥年mm¥月dd¥日 と設定しますよね。¥ の後の年、月、日 はそのまま表示されます。
¥, とするとカンマがそのまま表示されます。 & の箇所にはフィールドのテキストが表示されます。
書式は ; でセクションを2つにわけることができて、
一番目のセクションにテキストがある場合の書式を設定して、
2番目に長さ 0 の文字列か Null値のフィールドの書式を設定します。
2番目のセクションを省略した場合は、テキストがないとき("" または Null)の時は何も表示されません。
¥,& という設定は、テキストがあれば、テキストの前にカンマ、テキストがない(""またはNull)の時は何も表示しないという意味になります。
テキストフィールドの書式を設定する - Access
MSのドキュメントは非常に分かりにくいので、一応読んで実際にいろいろ設定してみて結果を確認して初めてそういうことを言っているかと理解できます。
MSのドキュメントを読んで一発で理解できことは稀です。一応読んでみて、実際にやってみて理解するという繰り返しですね。
>MSのドキュメントを読んで一発で理解できことは稀です。一応読んでみて、実際にやってみて理解するという繰り返しですね。
MSのドキュメントは理解できなかったため、今までwebの検索結果からMSのドキュメントは、ほぼ避けて通ってきました。検索結果から、他の方のブログ等を参考にするようにしてきました。
hatenaさんのアドバイスに気づかされました。今後はMSのドキュメントをもっと理解する努力をしていきたいと思います。(とは言いつつ今後も質問させていただくことが多いかと思います…申し訳ありません。宜しくお願いいたします。)
Format関数についてもご解説いただき、よく理解できました。今後も活用していきたいと思います!貴重な知識を、ありがとうございました。