前提
ここに質問の内容を詳しく書いてください。
アクセスで複数の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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
このままではコードが読めないので、質問を編集し、</>(コードの挿入)ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
失礼しました。
修正しましたのでご確認ください。
よろしくお願いいたします。
軽くみる限りastrAttachments図面がまともに設定されているとは思えないのですが、
エラーになった時その変数の中身って本当に想定した内容になってますか?
ご質問ありがとうございます!
一応エラーが出た後のデバッグでastrAttachments図面にカーソルを合わせるとパスが表示されます
msgboxで中身のパスを確認しましたが正しく入っていました
WFnaと図面数最大にもカーソルを合わせてみましたが意図した数値が入っていました
>一応エラーが出た後のデバッグで>astrAttachments図面にカーソルを合わせるとパスが表示されます
それはastrAttachments図面(図面数最大) に入ってるだけでは?
他の要素にアクセスしてる形跡はありませんし図面数最大が変化してる場所もないように見受けます
(書かれていないところでなんかうまいことされているのかもしれませんが)
エラー時のvarAttachにも意図した文字列は入っているのですか?
varAttachには入っておらずempty値が出ています。
astrAttachments図面(図面数最大) に入っているだけでは動作しないのでしょうか?
メールへの図面添付ははじめて触るので良くわからなくて…
図面数最大は繰り返し処理の時に変化させているつもりですがそこが違うのでしょうか
例えば明細IDの最大が3、明細ID1と3に図面がある場合
明細IDの最大値3を取得→明細ID1、3の図面のパスを格納→図面添付
のイメージでコードを書いていたのですがどこが違うか分からず質問させて頂きました
そういう意図であるならば、とりあえず表面的な問題は下記のとおりです
・設定用のループで添字が誤っている
For f = 図面数最大 To 1 Step -1
のループ内で変化するのはfであり図面数最大ではありません
・添付しない場合それに対応する要素は空になる仕様なのに添付する部分でそれに対する考慮がない
あっ、要素を設定するかを判定するWFna = Dir(WF & a & "*" & 図面数最大 & "*")がループ外のため、おそらくループ内で意図した判定が行えていない
という問題もありますね
上記問題の意味が分からないようであれば、
とりあえず妄想で場当たり的な対応をしたコードくらいは回答しますので仰ってください。
なるほど!
確かに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
はい、それが現実に沿っているかはわかりませんが、現状のコードを見る限りではそうあるべきではないかなと考えていたものです。
あとは添付部分でEmptyの場合にスキップするようにすれば、とりあえずはおかしなところはなくなるのではないでしょうか?
(もしそれで直るようであればその結果で自己解決としてください)
ありがとうございます!
ちなみにスキップはどのように記載すればよいでしょうか?
if文でelseを追加することは想像つくのですが、そのあとがあまり思いつきませんでした
普通に If Not IsEmpty(varAttach) Thenとかでよろしいかと
あと本筋から外れるので問題には挙げていないですが、
配列は特別指定しない場合0から始まりますのでこの処理では配列の最初は必ずEmptyになります。
(先にスキップする話をだすとそもそも配列がまともに設定できていない問題を変に隠蔽しそうなので言いませんでした)
今後はコレクションの利用等を検討することをお勧めします。
If Not IsEmpty(varAttach) Thenはvarattachで指定したファイルが空でない場合という事でしょうか?
ファイルが存在しない場合エラーが出てしまいました…
エラーは「ファイルが見つかりません。パスとファイル名が正しいかどうかを確認してください」でした
入力箇所が間違っているのでしょうか…
For Each varAttach In astrAttachments図面
If Not IsEmpty(varAttach) Then
.Attachments.Add varAttach
End If
Next varAttach
初心者なのでどの配列がどこっていうのが書いているうちに分からなくなりがちですね
何か整理方法があればいいのですが思いつかないままで…勉強不足ですね
コレクションというのがあるのですね!はじめて知ったのでまた調べてみます!
> If Not IsEmpty(varAttach) Thenはvarattachで指定したファイルが空でない場合という事でしょうか?
astrAttachments図面はVariant型の配列として宣言されています。
そして、上のForループで設定された要素は必ず有意な文字列型になります。
残りの設定されていない要素はVariant型の初期値であるEmptyが設定されています。
つまり、Forループで設定された要素に対してのみ添付処理を行うと言う意図のコードとなります。
つまるところ設定された要素のファイルパスが誤っているかどうかは添付部分の問題ではありません。
(設定時に正しいパスになっているかどうかの問題であるため)
Dir関数で存在確認している以上なんかはヒットしているのでしょうが、
正味どのようなファイルがヒットして、そしてどのようなファイルが添付されるべきかは私には分からないことであるため、
助言できることはありません。
少なくとも添付部分の処理の問題でない以上この質問で扱うべき話ではありません、
そちらをご質問なさりたいならばファイル探索部分を別質問とされるのがよろしいでしょう。
>初心者なのでどの配列がどこっていうのが書いているうちに分からなくなりがちですね 何か整理方法があればいいのですが思いつかないままで…勉強不足ですね
なお、この問題に関して必要なのはコードを書く勉強ではなく開発環境の勉強ですね。
書いてる最中に全てを把握できる人は本業のプログラマにもほぼ居ません。
書いた意図と現実の動作が一致するかを確認せずに済む事はないと言うか、むしろこまめにやればやるほどスムーズに進みます。
>つまるところ設定された要素のファイルパスが誤っているかどうかは添付部分の問題ではありません。
ファイルパスについて存在する場合は添付されることを確認しています。
ファイル探索部分の質問ではありません。
>・添付しない場合それに対応する要素は空になる仕様なのに添付する部分でそれに対する考慮がない
>普通に If Not IsEmpty(varAttach) Thenとかでよろしいかと
とお答えも頂いており、こちらの指摘と回答を試したところエラーが出たので質問しました。
存在する場合は添付される、というのは、添付部分の処理の問題ですね。
問題なのは、下記のポイントです。
・該当のファイルが存在していることを正確に判断できているのか(Dir関数部分)
・該当のファイルが存在しているとき、そのファイルパスを正しく作成しているのか(上のForループ部分)
エラーメッセージは指定されたファイルが存在しない、と報告している以上、上記のどちらかができていないと判断するのが妥当です。
故にファイル探索(存在確認及びそのパスの取得)部分の問題だと申し上げました。
>とお答えも頂いており、こちらの指摘と回答を試したところエラーが出たので質問しました。
この質問を投稿されたタイミングでは、そもそもそのエラーが出るパターンにすら到達しておらず、
修正した結果ようやくファイルパスの問題が表面化した、ということです。
修正したら問題が起きた=修正した部分に問題があるということにはならないんですね。
下記に書き換えたら上手く動作しました!
ありがとうございました!
For Each varAttach In astrAttachments図面
If Not Dir(varAttach) = "" Then
.Attachments.Add varAttach
End If
Next varAttach
そうなるとDir(WF & a & "*" & f & "*")の部分がそもそも誤っているというか想定通りの動作をしていないことになるので個人的にはちゃんと直したいところですが、
とりあえず望み通りの動きになるのであればそれでよいのかもしれませんね。
何はともあれお疲れさまでした。
あなたの回答
tips
プレビュー