質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

0回答

597閲覧

アクセスで複数のPDFを添付したデータを送信したい

susls

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2023/01/19 05:47

編集2023/01/19 07:34

前提

ここに質問の内容を詳しく書いてください。

アクセスで複数のPDFを添付して自動でメール送信ができるようにしたいです。

実現したいこと

・PDF(図面データ)の数量最大数を取得=明細IDの最大数取得
・PDFの格納先変数定義、パスの格納
・メールに宛先、表題、本文記載
・図面添付←エラーが出る

エラーメッセージ 実行時エラー440 添付ファイルを追加することができません。作成元データがありません。

該当のソースコード

Dim db As DAO.Database Dim rs As DAO.Recordset Set db = CurrentDb Set rs = db.OpenRecordset("Qメール送信") '原則1明細につき1図面がある '図面が存在しない場合もある Do Until rs.EOF = True If rs!明細ID > 図面数最大 Then 図面数最大 = rs!明細ID - 1 End If rs.MoveNext Loop '図面格納先変数定義 Dim astrAttachments図面() As Variant ReDim astrAttachments図面(図面数最大) astrAttachments図面(図面数最大) = "\\aaa\Users\aaa\Desktop\見積システム\図面保存場所\" & a & "-" & 図面数最大 & ".pdf" Const WF As String = "\\aaa\Users\aaa\Desktop\見積システム\図面保存場所\" Dim WFna As String WFna = Dir(WF & a & "*" & 図面数最大 & "*") '図面パス取得 For f = 図面数最大 To 1 Step -1 '図面があればパス格納 If WFna <> "" Then      ’デバッグでastrAttachments図面にカーソルを合わせるとパスが表示される astrAttachments図面(図面数最大) = "\\aaa\Users\aaa\Desktop\見積システム\図面保存場所\" & a & "-" & 図面数最大 & ".pdf"  End If Next Set mailitem = olapp.CreateItem(0) Set rs2 = db.OpenRecordset("Qメールアドレス送信チェック分")  Set 登録用紙送り先 = rs2!メールアドレス With mailitem 'アドレス入力 Do Until rs2.EOF .Recipients.Add 登録用紙送り先 rs2.MoveNext Loop .subject = "登録用紙提出 【" & 件名担当者 & "】" .Body = "関係者各位" & vbCrLf & "お疲れ様です。" & vbCrLf & "登録用紙を送付させていただきます。 " & vbCrLf & "ご確認よろしくお願いいたします。" & vbCrLf & コメント追記 '図面添付 'エラーが出る For Each varAttach In astrAttachments図面 .Attachments.Add varAttach Next varAttach .Display '.Send End With

試したこと

図面を1点のみにしたところ正常に作動しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2023/01/19 06:25

このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
susls

2023/01/19 07:21

失礼しました。 修正しましたのでご確認ください。 よろしくお願いいたします。
macof

2023/01/19 14:02

軽くみる限りastrAttachments図面がまともに設定されているとは思えないのですが、 エラーになった時その変数の中身って本当に想定した内容になってますか?
susls

2023/01/19 23:37 編集

ご質問ありがとうございます! 一応エラーが出た後のデバッグでastrAttachments図面にカーソルを合わせるとパスが表示されます msgboxで中身のパスを確認しましたが正しく入っていました WFnaと図面数最大にもカーソルを合わせてみましたが意図した数値が入っていました
macof

2023/01/19 23:42

>一応エラーが出た後のデバッグで>astrAttachments図面にカーソルを合わせるとパスが表示されます それはastrAttachments図面(図面数最大) に入ってるだけでは? 他の要素にアクセスしてる形跡はありませんし図面数最大が変化してる場所もないように見受けます (書かれていないところでなんかうまいことされているのかもしれませんが) エラー時のvarAttachにも意図した文字列は入っているのですか?
susls

2023/01/20 00:26 編集

varAttachには入っておらずempty値が出ています。 astrAttachments図面(図面数最大) に入っているだけでは動作しないのでしょうか? メールへの図面添付ははじめて触るので良くわからなくて… 図面数最大は繰り返し処理の時に変化させているつもりですがそこが違うのでしょうか 例えば明細IDの最大が3、明細ID1と3に図面がある場合 明細IDの最大値3を取得→明細ID1、3の図面のパスを格納→図面添付 のイメージでコードを書いていたのですがどこが違うか分からず質問させて頂きました
macof

2023/01/20 00:36

そういう意図であるならば、とりあえず表面的な問題は下記のとおりです ・設定用のループで添字が誤っている For f = 図面数最大 To 1 Step -1 のループ内で変化するのはfであり図面数最大ではありません ・添付しない場合それに対応する要素は空になる仕様なのに添付する部分でそれに対する考慮がない
macof

2023/01/20 00:51 編集

あっ、要素を設定するかを判定するWFna = Dir(WF & a & "*" & 図面数最大 & "*")がループ外のため、おそらくループ内で意図した判定が行えていない という問題もありますね
macof

2023/01/20 01:02

上記問題の意味が分からないようであれば、 とりあえず妄想で場当たり的な対応をしたコードくらいは回答しますので仰ってください。
susls

2023/01/20 01:17

なるほど! 確かにfと図面数最大とを混同していました。 for分の内容を変更かけてみました。 WFnaの位置と変数を図面数最大→fに変更しました。 こんな感じであっていますでしょうか? '図面パス取得 For f = 図面数最大 To 1 Step -1 WFna = Dir(WF & a & "*" & f & "*") '図面があればパス格納 If WFna <> "" Then      ’デバッグでastrAttachments図面にカーソルを合わせるとパスが表示される astrAttachments図面(図面数最大) = "\\aaa\Users\aaa\Desktop\見積システム\図面保存場所\" & a & "-" & f & ".pdf"  End If Next
macof

2023/01/20 01:23

はい、それが現実に沿っているかはわかりませんが、現状のコードを見る限りではそうあるべきではないかなと考えていたものです。 あとは添付部分でEmptyの場合にスキップするようにすれば、とりあえずはおかしなところはなくなるのではないでしょうか? (もしそれで直るようであればその結果で自己解決としてください)
susls

2023/01/20 02:07

ありがとうございます! ちなみにスキップはどのように記載すればよいでしょうか? if文でelseを追加することは想像つくのですが、そのあとがあまり思いつきませんでした
macof

2023/01/20 02:12

普通に If Not IsEmpty(varAttach) Thenとかでよろしいかと あと本筋から外れるので問題には挙げていないですが、 配列は特別指定しない場合0から始まりますのでこの処理では配列の最初は必ずEmptyになります。 (先にスキップする話をだすとそもそも配列がまともに設定できていない問題を変に隠蔽しそうなので言いませんでした) 今後はコレクションの利用等を検討することをお勧めします。
susls

2023/01/20 02:53

If Not IsEmpty(varAttach) Thenはvarattachで指定したファイルが空でない場合という事でしょうか? ファイルが存在しない場合エラーが出てしまいました… エラーは「ファイルが見つかりません。パスとファイル名が正しいかどうかを確認してください」でした 入力箇所が間違っているのでしょうか… For Each varAttach In astrAttachments図面 If Not IsEmpty(varAttach) Then .Attachments.Add varAttach End If Next varAttach 初心者なのでどの配列がどこっていうのが書いているうちに分からなくなりがちですね 何か整理方法があればいいのですが思いつかないままで…勉強不足ですね コレクションというのがあるのですね!はじめて知ったのでまた調べてみます!
macof

2023/01/20 03:10

> If Not IsEmpty(varAttach) Thenはvarattachで指定したファイルが空でない場合という事でしょうか? astrAttachments図面はVariant型の配列として宣言されています。 そして、上のForループで設定された要素は必ず有意な文字列型になります。 残りの設定されていない要素はVariant型の初期値であるEmptyが設定されています。 つまり、Forループで設定された要素に対してのみ添付処理を行うと言う意図のコードとなります。 つまるところ設定された要素のファイルパスが誤っているかどうかは添付部分の問題ではありません。 (設定時に正しいパスになっているかどうかの問題であるため) Dir関数で存在確認している以上なんかはヒットしているのでしょうが、 正味どのようなファイルがヒットして、そしてどのようなファイルが添付されるべきかは私には分からないことであるため、 助言できることはありません。 少なくとも添付部分の処理の問題でない以上この質問で扱うべき話ではありません、 そちらをご質問なさりたいならばファイル探索部分を別質問とされるのがよろしいでしょう。
macof

2023/01/20 03:31

>初心者なのでどの配列がどこっていうのが書いているうちに分からなくなりがちですね 何か整理方法があればいいのですが思いつかないままで…勉強不足ですね なお、この問題に関して必要なのはコードを書く勉強ではなく開発環境の勉強ですね。 書いてる最中に全てを把握できる人は本業のプログラマにもほぼ居ません。 書いた意図と現実の動作が一致するかを確認せずに済む事はないと言うか、むしろこまめにやればやるほどスムーズに進みます。
susls

2023/01/20 04:27 編集

>つまるところ設定された要素のファイルパスが誤っているかどうかは添付部分の問題ではありません。 ファイルパスについて存在する場合は添付されることを確認しています。 ファイル探索部分の質問ではありません。 >・添付しない場合それに対応する要素は空になる仕様なのに添付する部分でそれに対する考慮がない >普通に If Not IsEmpty(varAttach) Thenとかでよろしいかと とお答えも頂いており、こちらの指摘と回答を試したところエラーが出たので質問しました。
macof

2023/01/20 04:54

存在する場合は添付される、というのは、添付部分の処理の問題ですね。 問題なのは、下記のポイントです。 ・該当のファイルが存在していることを正確に判断できているのか(Dir関数部分) ・該当のファイルが存在しているとき、そのファイルパスを正しく作成しているのか(上のForループ部分) エラーメッセージは指定されたファイルが存在しない、と報告している以上、上記のどちらかができていないと判断するのが妥当です。 故にファイル探索(存在確認及びそのパスの取得)部分の問題だと申し上げました。
macof

2023/01/20 04:58

>とお答えも頂いており、こちらの指摘と回答を試したところエラーが出たので質問しました。 この質問を投稿されたタイミングでは、そもそもそのエラーが出るパターンにすら到達しておらず、 修正した結果ようやくファイルパスの問題が表面化した、ということです。 修正したら問題が起きた=修正した部分に問題があるということにはならないんですね。
susls

2023/01/20 05:45

下記に書き換えたら上手く動作しました! ありがとうございました! For Each varAttach In astrAttachments図面 If Not Dir(varAttach) = "" Then .Attachments.Add varAttach End If Next varAttach
macof

2023/01/20 05:51

そうなるとDir(WF & a & "*" & f & "*")の部分がそもそも誤っているというか想定通りの動作をしていないことになるので個人的にはちゃんと直したいところですが、 とりあえず望み通りの動きになるのであればそれでよいのかもしれませんね。 何はともあれお疲れさまでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問