標記の通りなのですが、VBAで、複数ファイルを添付したメールを一括作成したいです。
メールはOutlookです。
複数ファイルというのは、一つのフォルダ上に格納されているファイルではなく、
ある規則性によって作成されているフォルダ内に、格納されているファイルのことを指します。
添付画像のようなファルダ構造になっており、
「通知」フォルダを添付させる用のメールのVBAを起動させると、
各先生配下の、さらにクラス名配下の、「通知」のフォルダ内のファイルが、
各先生に送信されるようにしたいです。
ある特定のフォルダから、エクセル上の「添付キーワード」と一致するファイル名のファイルを各先生あてに送信はできるようにはなったのですが、
上記の太字のような、フォルダ構成を考慮して添付ファイルをつけることができません。
③FileAttachの以下の部分
Dim FileStorePath As String 'ファイル格納パス
FileStorePath = "C:\Outlookテスト\aaa先生\1-1\通知"
を編集して、パス名にも、先生名やクラス名をループで入るようにすればいいのでは、
と思うのですが、うまくいかないため、
各先生配下のいづれのクラスにおいて共通のフォルダ名内のファイルを添付したメールを、クラスごとに作成する方法について、
お力を貸してください。
①main
VBA
1Enum col '1以降の数値を省略した場合は+1される 2 宛先 = 1 3 複写 4 クラス名 5 氏名 6 添付キーワード 7End Enum 8 9Sub main() 10 11 'Outlookオブジェクトの作成 12 Dim OutlookObj As Outlook.Application 13 Set OutlookObj = New Outlook.Application 14 15 Dim r As Long 16 For r = 2 To Cells(1, 1).End(xlDown).Row 17 18 'メールアイテムオブジェクト作成 19 Dim mailItemObj As Outlook.MailItem 20 Set mailItemObj = OutlookObj.CreateItem(olMailItem) 21 22 '添付ファイルオブジェクトの生成 23 Dim attachObj As Outlook.Attachments 24 Set attachObj = mailItemObj.Attachments 25 26 Dim keyword As String 27 keyword = Cells(r, col.添付キーワード) 28 29 '★添付ファイルが存在する場合のみ、メールアイテムを作成する 30 If FileAttach(attachObj, keyword) = True Then 31 32 'メール本文作成 33 Dim mailBody As String 34 mailBody = CreateMailBody(r) 35 36 'メールアイテム作成 37 With mailItemObj 38 .To = Cells(r, col.宛先).Value 39 .CC = Cells(r, col.複写).Value 40 .Subject = Cells(1, "I").Value '件名 41 .Body = mailBody '本文 42 End With 43 44 mailItemObj.Display '下書きを表示 45 46 '次のメールアイテムを作成するためいったん破棄 47 Set mailItemObj = Nothing 48 49 End If 50 51 Next r 52 53End Sub 54
②CreateMailBody
VBA
1 2' 【機能】Excelシート上の指定行番号のメール本文を作成する 3Function CreateMailBody(r As Long) As String 4 5 Dim cName As String, sName As String 6 cName = Cells(r, col.クラス名).Value 7 sName = Cells(r, col.氏名).Value 8 9 ' Dim sign As String '署名 10 ' sign = Cells(12, "I").Value 11 12 Dim mBody As String 'メール本文 13 mBody = Cells(2, "I").Value '初期値を設定 14 mBody = Replace(mBody, "(クラス名)", cName) 15 mBody = Replace(mBody, "(氏名)", sName) 16 ' mBody = mBody & vbCrLf & vbCrLf & sign '末尾に署名を付与 17 18 CreateMailBody = mBody 19 20End Function 21
③FileAttach
VBA
1' 処理① キーワードに合致するファイルを添付する 2' 処理② 1つ以上のファイルが見つかった場合、Trueを返す 3Function FileAttach(attachObj As Object, keyword As String) As Boolean 4 5 Dim fileCnt As Long '★添付したファイル数をカウントする 6 7 Dim FileStorePath As String 'ファイル格納パス 8 FileStorePath = "C:\Outlookテスト\aaa先生\1-1\通知" 9 10 Dim FileName As String 11 FileName = Dir(FileStorePath & "\" & "*") 12 13 'フォルダ内のファイル数、検索を繰り返す&" 14 Do While FileName <> "" 15 16 'キーワードを含むファイルが見つかったら、下書きアイテムに添付する 17 If InStr(FileName, keyword) > 0 Then 18 attachObj.Add FileStorePath & "\" & FileName 19 fileCnt = fileCnt + 1 '★添付したファイル数 20 End If 21 22 FileName = Dir() 23 24 Loop 25 26 Set attachObj = Nothing 27 28 '★1以上のファイルを添付した場合Trueを返す 29 '(Boolean型の初期値はFalse) 30 If fileCnt > 0 Then FileAttach = True 31 32End Function 33
(2020/05/06 追記)
コメントいただいたように、VBAを編集してみたのですが、うまく実行しません…。
エクセルもすこし変更しました。
FileStorePathで指定したフォルダ内を「添付キーワード」で検索するのではなく、
FileStorePathで指定したフォルダ内のファイルをすべてメールに添付したいのですが、
さらにどこを修正したらよいでしょうか…。
③FileAttach(変更版)
VBA
1' 処理① キーワードに合致するファイルを添付する 2' 処理② 1つ以上のファイルが見つかった場合、Trueを返す 3Function FileAttach(attachObj As Object, keyword As String) As Boolean 4 5 Dim fileCnt As Long '★添付したファイル数をカウントする 6 7 Dim FileStorePath As String 'ファイル格納パス 8 FileStorePath = "C:\Outlookテスト\" & Cells(r, "D") & "先生\" & Cells(r, "E") & "\通知" 9 10 Dim FileName As String 11 FileName = Dir(FileStorePath & "\" & "*") 12 13 'フォルダ内のファイル数、検索を繰り返す&" 14 Do While FileName <> "" 15 16 'キーワードを含むファイルが見つかったら、下書きアイテムに添付する 17 **'↑は無し。FileStorePathに格納されているファイルすべてを送信したい。** 18 'If Array(FileName) > 0 Then 19 ' attachObj.Add FileStorePath & "\" & FileName 20 ' fileCnt = fileCnt + 1 '★添付したファイル数 21 'End If 22 23 FileName = Dir() 24 25 Loop 26 27 Set attachObj = Nothing 28 29 '★1以上のファイルを添付した場合Trueを返す 30 '(Boolean型の初期値はFalse) 31 If fileCnt > 0 Then FileAttach = True 32 33End Function 34
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/06 08:53
2020/05/06 12:07
2020/05/06 23:24 編集
2020/05/06 23:27
2020/05/07 14:38 編集
2020/05/08 00:00
2020/05/08 11:16
2020/05/08 13:07
2020/05/08 13:31 編集
2020/05/08 15:25