[[20210721002453]] 『KEYWORDを含む複数PDFファイルをメールに添付した』(しゅう) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『KEYWORDを含む複数PDFファイルをメールに添付したい』(しゅう)

ファイル添付がうまくいきません。
仕入先毎にMAILはうまく作成できます。
fileStorePath 、fileNameをローカルウィンドウで確認しましたら
うまく格納しておりました。
なぜでしょうか?
お力添えお願いいたします。

Sub 注文書メール作成()

Dim MAIL As Worksheet
Set MAIL = Worksheets("MAIL")

Dim RENRAKU As Worksheet
Set RENRAKU = Worksheets("連絡先")

Dim HONBUN As Worksheet
Set HONBUN = Worksheets("本文")

'MAILの最終行数をLRMとする

 Dim LRM As Long
 LRM = MAIL.Cells(Rows.Count, 1).End(xlUp).Row

'********OUTLOOKMAIL作成********

Dim Outlook As Outlook.Application
Set Outlook = New Outlook.Application

Dim NewMail As Outlook.MailItem
'
Dim TANTOU As Variant

Dim attached As String

'メールを作成する

'MAILの8行目から最終行まで
For i = 8 To LRM

    Set NewMail = Outlook.CreateItem(olMailItem)

    'メールアイテムオブジェクト作成
    Dim mailItemObj As Outlook.MailItem
    Set mailItemObj = Outlook.CreateItem(olMailItem)

    '添付ファイルオブジェクト作成
    Dim attachObj As Outlook.Attachments
     Set attachObj = mailItemObj.Attachments

    With NewMail

    Supplier = MAIL.Cells(i, 1).Value
    TANTOU = MAIL.Cells(i, 2).Value

      'メール宛先
      '.To = Cells(i, 4).Value
      '.CC = Cells(i, 5).Value

      'メール件名
      .Subject = "【" & Supplier & "様】新規注文書_" & Format(Date, "yyyy/mm/dd")

       'メールの形式
        .BodyFormat = olFormatHTML

      'メール本文

      .Body = Supplier & vbLf & _
                  TANTOU & "様" & vbLf & _
                  HONBUN.Cells(1, 1).Value

        'メールアイテムにファイルを添付する
        Dim keyword As String
        keyword = Cells(i, 1).Value

        Call FileAttach(attachObj, keyword)

End With

  NewMail.Save
  'NewMail.Send

Next i

  Set Outlook = Nothing

End Sub

' 【機能】下書きメールアイテムにファイルを添付する
' 複数ファイル添付可能(キーワードを含むファイルをすべて添付する)
' キーワードを含むファイルが見つからない場合、何も添付しない

Sub FileAttach(attachObj As Object, keyword As String)

    Dim MAIL As Worksheet
    Set MAIL = Worksheets("MAIL")

    Dim fileStorePath As String 'ファイル格納パス
    fileStorePath = MAIL.Range("C2") & "\"

    Dim fileName As String
    fileName = Dir(fileStorePath & "\" & "*")

    'フォルダ内のファイル数、検索を繰り返す
    Do While fileName <> ""

        'キーワードを含むファイルが見つかったら、下書きアイテムに添付する
        If InStr(fileName, keyword) > 0 Then
            attachObj.Add fileStorePath & "\" & fileName
        End If

        fileName = Dir()

    Loop

    Set attachObj = Nothing

End Sub

< 使用 Excel:Excel2019、使用 OS:Windows10 >


全体をみていませんが、
最後で
   Set attachObj = Nothing
をしているのはなぜ? せっかく作ったのに。

(γ) 2021/07/21(水) 07:41


気になったところだけ。

 fileStorePath = MAIL.Range("C2") & "\"
                                    ~~~

↑なので

 fileName = Dir(fileStorePath & "*")
 attachObj.Add fileStorePath & fileName

が正しいのではないですか?(勘違いだったらごめんなさい)

(もこな2 ) 2021/07/21(水) 08:02


ご返信ありがとうございます。

Y様

  Set attachObj = Nothing
をしているのはなぜ? せっかく作ったのに。
⇒よくわからないです。
 サンプルコピーしただけなので・・・・
 ここはなしでいいのですか?

もこな様

   Dim fileStorePath As String 'ファイル格納パス
    fileStorePath = MAIL.Range("C2") & "\"

    Dim fileName As String

    fileName = Dir(fileStorePath & "*")

        'キーワードを含むファイルが見つかったら、下書きアイテムに添付する
        If InStr(fileName, keyword) > 0 Then

             attachObj.Add fileStorePath & fileName

になおしてみたんですけど
うまくいかないです。

             attachObj.Add fileStorePath & fileName

ここだけうまくいってないので
fileStorePath & fileNameが怪しいんですけど
なんででしょうか?

ご教授いただきたくお願いいたします。

しゅう

(しゅう) 2021/07/21(水) 10:53


 >        'メールアイテムにファイルを添付する
 >        Dim keyword As String
 >        keyword = Cells(i, 1).Value

 Cellsの親シートが特定されてないですよ。MAILシートなら、↓とする

         keyword = MAIL.Cells(i, 1).Value

(半平太) 2021/07/21(水) 11:33


  '半平太様
ご返信誠にありがとうございます。
下記へなおしてみましたがやはりATTACHされないです。

メールアイテムにファイルを添付する

        Dim keyword As String
        keyword = MAIL.Cells(i, 1).Value

        Call FileAttach(attachObj, keyword)

なぜでしょうか? ご教授いただきたく。とりあえずアナログでやります!


(しゅう) 2021/07/21(水) 13:10


とりあえず、まったく使ってない変数を削ったり、いちいち変数にするまでもない部分を統合したりして、一旦コードを整理してみてはどうですか?

参考に私が整理(というか普段自分が使っているメールマクロを改造)したものを置いておきます
(レイトバインディング(参照設定なし)ですが、整理の参考にはなると思います)

    Sub 注文書メール作成_改()
        Dim mailOBJ As Object
        Dim i As Long

        With Worksheets("MAIL")
            For i = 8 To .Cells(Rows.Count, 1).End(xlUp).Row
                Set mailOBJ = CreateObject("Outlook.Application").CreateItem(0)

                'メール件名
                mailOBJ.Subject = "【" & .Cells(i, 1).Value & "様】新規注文書_" & Format(Date, "yyyy/mm/dd")

                'メールの形式
                mailOBJ.BodyFormat = 2

                'メール本文
                mailOBJ.Body = .Cells(i, 1).Value & vbLf & .Cells(i, 2).Value & "様" & vbLf & Worksheets("本文").Cells(1, 1).Value

                '添付ファイル処理を呼び出し(半平太さん指摘部分に留意)
                Call 添付ファイル処理(mailOBJ, .Range("C2") & "\", .Cells(i, 1).Value)

                '下書きフォルダへ保存
                mailOBJ.Save
            Next i
        End With
    End Sub
    '----------------------------------------------------------------------------------------------------------
    Sub 添付ファイル処理(mailOBJ As Object, MyPath As String, Keyword As String)
        Dim ファイル名 As String

        ファイル名 = Dir(MyPath & "*.pdf")
        Do Until ファイル名 = ""
            If ファイル名 Like "*" & Keyword & "*" Then mailOBJ.Attachments.Add MyPath & ファイル名
            ファイル名 = Dir()
        Loop
    End Sub

(もこな2) 2021/07/21(水) 14:00


 |   Set attachObj = Nothing
 | をしているのはなぜ? せっかく作ったのに。
 | ⇒よくわからないです。
 |  サンプルコピーしただけなので・・・・
 |  ここはなしでいいのですか?    

 SaveなりSendなりの前に Set .. = Nohthing としてしまったら、
 せっかく作った添付ファイル情報は消されますよ。
 SaveなりSendのあとにすればよいと思います。

 NewMailと mailItemObj の二つがあるのは何故ですか?
 全般によく整理して、それぞれのコードの意味を考えられたほうがよいと思います。
(γ) 2021/07/21(水) 16:03

 変数の定義を上部にまとめさせてもらいます。

 細かいコーディングエラー(でも無害なところ)は無視しています。
 こちらでは、以下でアタッチできています。

 Sub 注文書メール作成()
     Dim i As Long
     Dim Supplier
     Dim MAIL As Worksheet
     Dim RENRAKU As Worksheet
     Dim HONBUN As Worksheet
     Dim LRM As Long
     Dim Outlook As Outlook.Application
     Dim NewMail As Outlook.MailItem
     Dim TANTOU As Variant
     Dim attached As String
     Dim mailItemObj As Outlook.MailItem
     Dim attachObj As Outlook.Attachments
     Dim Keyword As String

     Set MAIL = Worksheets("MAIL")
     Set RENRAKU = Worksheets("連絡先")
     Set HONBUN = Worksheets("本文")
     'MAILの最終行数をLRMとする
     LRM = MAIL.Cells(Rows.Count, 1).End(xlUp).Row
     '********OUTLOOKMAIL作成********
     Set Outlook = New Outlook.Application
     '
     'メールを作成する
     'MAILの8行目から最終行まで

     For i = 8 To LRM
 '        Set NewMail = Outlook.CreateItem(olMailItem)
         'メールアイテムオブジェクト作成
         Set mailItemObj = Outlook.CreateItem(olMailItem)
         '添付ファイルオブジェクト作成

         Set attachObj = mailItemObj.Attachments
         With mailItemObj
             Supplier = MAIL.Cells(i, 1).Value
             TANTOU = MAIL.Cells(i, 2).Value
             'メール宛先
             '.To = Cells(i, 4).Value
             '.CC = Cells(i, 5).Value
             'メール件名
             .Subject = "【" & Supplier & "様】新規注文書_" & Format(Date, "yyyy/mm/dd")
             'メールの形式
             .BodyFormat = olFormatHTML
             'メール本文
             .Body = Supplier & vbLf & _
             TANTOU & "様" & vbLf & _
             HONBUN.Cells(1, 1).Value
             'メールアイテムにファイルを添付する
             Keyword = MAIL.Cells(i, 1).Value '親シートを限定する。でもこれってSupplierと同じではないですか?
             Call FileAttach(attachObj, Keyword)
         End With
         mailItemObj.Save
         'NewMail.Send
     Next i

 '    mailItemObj.Display

     Set Outlook = Nothing
 End Sub
 ' 【機能】下書きメールアイテムにファイルを添付する
 ' 複数ファイル添付可能(キーワードを含むファイルをすべて添付する)
 ' キーワードを含むファイルが見つからない場合、何も添付しない
 Sub FileAttach(attachObj As Object, Keyword As String)
     Dim MAIL As Worksheet
     Dim fileStorePath As String 'ファイル格納パス
     Dim fileName As String

     Set MAIL = Worksheets("MAIL")
     fileStorePath = MAIL.Range("C2") & "\"
     fileName = Dir(fileStorePath & "*")
     'フォルダ内のファイル数、検索を繰り返す
     Do While fileName <> ""
         'キーワードを含むファイルが見つかったら、下書きアイテムに添付する
         If InStr(fileName, Keyword) > 0 Then
             attachObj.Add fileStorePath & fileName
         End If
         fileName = Dir()
     Loop

 End Sub

(半平太) 2021/07/21(水) 16:17


もりあがっているようなので、頑張ってアーリバインディングに挑戦。
(こうでいいんですよね・・・たぶん・・)
    Sub 注文書メール作成_改二()
        Dim Outlook As Outlook.Application
        Dim i As Long
        Dim MAIL As Worksheet, RENRAKU As Worksheet, HONBUN As Worksheet
        Dim ファイル名 As String

        Set MAIL = Worksheets("MAIL")
        Set RENRAKU = Worksheets("連絡先")
        Set HONBUN = Worksheets("本文")
        Set Outlook = New Outlook.Application

        For i = 8 To MAIL.Cells(MAIL.Rows.Count, 1).End(xlUp).Row
            With Outlook.CreateItem(olMailItem)

                .Subject = "【" & MAIL.Cells(i, 1).Value & "様】新規注文書_" & Format(Date, "yyyy/mm/dd") 'メール件名
                .BodyFormat = olFormatHTML 'メールの形式
                .Body = MAIL.Cells(i, 1).Value & vbLf & MAIL.Cells(i, 2).Value & "様" & vbLf & Worksheets("本文").Cells(1, 1).Value 'メール本文

                '添付ファイル処理
                ファイル名 = Dir(MAIL.Range("C2").Value & "\" & "*.pdf")
                Do Until ファイル名 = ""
                    If ファイル名 Like "*" & MAIL.Cells(i, 1).Value & "*" Then
                        .Attachments.Add MAIL.Range("C2").Value & "\" & ファイル名
                    End If
                    ファイル名 = Dir()
                Loop

                .Save '下書きフォルダへ保存
            End With
        Next i
    End Sub

(もこな2) 2021/07/21(水) 17:37


もこな2様

お世話になります。
ご教授いただき誠にありがとうございます!

いちいち変数にするまでもない部分を統合したりして、一旦コードを整理してみてはどうですか?
⇒そうですよね。もっと意味を理解して
 コードの整理をしてみます。

サンプルありがとうございます!
できました!感動です!!!

もっと勉強します!
(しゅう) 2021/07/22(木) 00:03


γ様

ご返信ありがとうございます。

 全般によく整理して、それぞれのコードの意味を考えられたほうがよいと思います
⇒まだまだ理解していないことを痛感いたしました。

ありがとうございます。
もっと勉強します。

半平太様

お世話になります。
すごいです!できました!感動です!
コードの書き方もかなりスッキリしていて
学ぶことがたくさんです!

このコードをかくのにさくっとかけるのですか?
SEとかのお仕事されているんですか?

私ももっと勉強します!

ありがとうございます!

もこな2様

ありがとうございます。
こちらのコードもためしました!
ばっちり動きました!

感動です(:_;)

こんなにも短いコードでいけるのですね。。。。
私のはいったい。。。

本当にありがとうございます。
次の大量の発注書が楽しみですw

しゅう

(しゅう) 2021/07/22(木) 00:09


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.