Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2013)
PDFに変換後、メール添付までするには
投稿日時: 24/10/11 14:32:43
投稿者: ふしぎちゃん

お世話になります。
 
Excelのファイルで開いているシートを
PDF変換して、メールに添付するまでの
作業をしようとしています。
 
色々調べていきながら、
構文を作ってみたのですが
PDF変換して保存のところで止まって
しまい、その先もどうなのか心配です。
 
すごい恥ずかしい間違いを
しているのだと思いますが
よろしくお願いします。
 
Sub pdf変換後メール()
    Dim ws As Worksheet
    Dim pdfFileName As String
    Dim outlookApp As Object
    Dim outlookMail As Object
 
    ' PDFに変換する範囲を動的に指定する例として、アクティブシートを使用する
    Set ws = ActiveSheet
     
    Dim TargetName As String
    'ファイル名にするセルを変数へ格納
    TargetName = Cells(13, 1)
 
    ' PDFファイルの保存先とファイル名を設定
    pdfFileName = ThisWorkbook.Path & "\" & TargetName & ".pdf"
     
    ' PDFに変換して保存
    ws.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfFileName, Quality:=xlQualityStandard
     
    ' Outlookアプリケーションを起動
    Set outlookApp = CreateObject("Outlook.Application")
     
    ' メール作成
 
        Set outlookMail = outlookApp.CreateItem(0)
        With outlookMail
            ' 件名と本文を設定
            .Subject = "請求書をお送り致します。"
            .Body = "いつも大変お世話になっております。"
             
            ' 添付ファイルの追加
  .Attachments.Add pdfFileName
       
    End With
 
End Sub
 
 

回答
投稿日時: 24/10/11 16:07:51
投稿者: simple

>PDF変換して保存のところで止まってしまい、
エラーになるなら、エラーメッセージを正確に示してもらえますか?

投稿日時: 24/10/11 16:15:38
投稿者: ふしぎちゃん

お世話になります。
 
「ファイルを保存できませんでした」
と出ます。

回答
投稿日時: 24/10/11 16:35:33
投稿者: simple

 手元では保存できました。私には原因不明です。他の回答者のコメントをお待ちください。

回答
投稿日時: 24/10/11 17:03:13
投稿者: Suzu

とりあえず PDF 保存でエラーとの事なので。。
 
1. pdfFileName の中身の確認。
 
2. その中身は Windowsの命名規則に則っているのか。
  (使えない文字は含まていないか)
 
 
3. そのパス・ファイル名 で、PDF にて 保存を 手動でできるか?
  (当該フォルダでのファイル作成権限があるか)
  (そもそも、何かしらの理由で、PDF 変換が出来ていない)
 
辺りを確認でしょうか。

投稿日時: 24/10/12 09:10:02
投稿者: ふしぎちゃん

皆さん有難うございます。
 
Suzuさんの言われた通り
基本的な間違いで
参照先が間違っていて
空白なので保存できないのが原因でした。
 
保存は出来たのですが
メール添付の動きがなく
保存だけで終わってしまいます。
 
どこの部分が間違っているのでしょうか?
 
よろしくお願い致します。

回答
投稿日時: 24/10/12 11:47:26
投稿者: Suzu

引用:
参照先が間違っていて
空白なので保存できないのが原因でした。

解決したのであれば何よりです。
 
 
 
引用:
メール添付の動きがなく
保存だけで終わってしまいます。
 
どこの部分が間違っているのでしょうか?

 
どの様にして、保存だけだと判断したのでしょうか?
 
シングルステップにて実行してみましたか?
 
また、
引用:
色々調べていきながら、
構文を作ってみたのですが

 
その調べたコードについても、
同様に、動作確認なり、解説を読み、動作について理解された上で
今回のコードを作成しているのでしょうか?
 
 
普通は、シングルステップで実行していった場合、何かしらの変化が現れます。
それは、開発者は、
 ・画面内の アプリケーションの画面
 ・VBEのオブジェクトブラウザ
 ・VBEのローカルウィンド
 にて変化を確認します。
あなたは、画面内のアプリケーションの画面内だけで確認していませんか?
 
調べたコードでは、理想通りになって、
今回のコードでは、そうなっていない のでは?
 
結論。
質問者さんのコードでは、
MailItem.Display メソッド (Outlook)
https://learn.microsoft.com/ja-jp/office/vba/api/outlook.mailitem.display
が不足しているのだと思われます。

回答
投稿日時: 24/10/12 12:26:38
投稿者: Suzu

引用:
どの様にして、保存だけだと判断したのでしょうか?
 
シングルステップにて実行してみましたか?

 
メール作成画面があり、コードが進む毎に、その内容が手動で宛先等の設定、ファイル添付の様に
画面に反映されると お思いでしょうが、そうではありません。
 
そもそも、コードに問題がなく、コードの通りに動いているなら、
画面に反映させる必要はありません。
 
例えば、
WorkSheets(1).Activate
WorkSheets(2).Range("A1").Value = "A1"
 
上記の場合
シート1をアクティブにし、シート2 の A1 に A1 を代入。
シート2の 画面は表示されません。 が、シート2のA1 には代入されている。
 
メール作成ウィンドは表示されていないが、メールは作成されている。
表示、保存、送信 の いずれも 行われていないので、
画面上、実行ユーザーが見ている画面上では何も実行されていない様に見えます。
 
でも、コーディング者であれば、シングルステップにて実行しVBEのローカルウィンドにて
 
Set outlookMail = outlookApp.CreateItem(0)
ここで、オブジェクト outlookMail が Nothing から、何か参照された事が判り
 
 
With outlookMail
  ' 件名と本文を設定
  .Subject = "請求書をお送り致します。"
  .Body = "いつも大変お世話になっております。"
ここまでで、outlookMail の Subject、Body に 文字列が設定されている事を確認でき
 
 
  ' 添付ファイルの追加
  .Attachments.Add pdfFileName
ここで、outlookMail に 添付ファイルが添付されている事を確認できたはず。
 
 
ここまでわかったなら、
『 じゃぁ、その outlookMail に対し
  画面表示なり、保存、送る、削除 等の命令を送る事が出来るのでは?』
と推測し、調べる事になるのです。
 
 
開発者にとって、ローカルウィンドはオブジェクトの状態を知る上で必要です。
画面だけで判断しない様にしましょう。

投稿日時: 24/10/18 15:47:58
投稿者: ふしぎちゃん

有難うございました。
 
MailItem.Display メソッド (Outlook)
が不足ということで
調べていくと実行できました。
 
有難うございました。