受信したメールの添付ファイルを自動保存するマクロのコメントにて以下のご要望をいただきました。
大変参考にさせていただいております。
初心者なもので、大変恐縮ですが、教えてください。
元の添付ファイルのファイル名:abc
保存したいファイル名:yyyymmdd_01_abc
(年月日_その日の受信の連番(2桁)_添付ファイル名)
としたい場合、どうしたらよろしいでしょうか?
何卒よろしくお願いします。
年月日を追加したい場合は、Format 関数の第 1 パラメータに現在の日時を表す Now 関数を指定し、第 2 パラメータとして “yyyymmdd” という文字列を指定すれば可能です。
問題は「その日の受信の連番」をどうやって管理するかです。
ファイルやレジストリを使って管理する方法もあるのですが、今回は Outlook の StorageItem というオブジェクトを使ってみました。
StorageItem は受信トレイなどの任意のフォルダーに隠しアイテムとして設定などを保存することができるというものです。
マクロは以下のようになります。
' ここをトリプルクリックでマクロ全体を選択できます。
' 連番を保持する StorageItem オブジェクト
Dim myStgCount As StorageItem
' メール受信時に発生するイベント
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
On Error Resume Next
Dim objMsg As MailItem
'
Set objMsg = Session.GetItemFromID(EntryIDCollection)
If Not objMsg Is Nothing Then
SaveAttachmentsWithDate objMsg
End If
End Sub
'
' 添付ファイルの保存を行うサブ プロシージャ
Private Sub SaveAttachmentsWithDate(objMsg As MailItem)
Const SAVE_PATH = "C:\attachments\"
Dim objAttach As Attachment
Dim iSerial As Integer
Dim strDate As String
Dim strFileName As String
'
'
' ここで条件指定
'
' 日付を文字列に変換
strDate = Format(Now, "YYYYMMDD_")
' 添付ファイルすべてについて処理
For Each objAttach In objMsg.Attachments
With objAttach
' 日ごとの連番を取得
iSerial = GetSerialForToday()
' ファイル名に日付と連番を追加
strFileName = SAVE_PATH & strDate & Format(iSerial, "0#_") & .FileName
' ファイルを保存
.SaveAsFile strFileName
End With
Next
Set objMsg = Nothing
Set objFSO = Nothing
End Sub
'
' 日ごとの連番を取得する関数
Private Function GetSerialForToday()
Const COUNT_SUBJECT = "GLOBAL_COUNTER"
Dim fldInbox As Folder
Dim myStgCount As StorageItem
Dim strToday As String
Dim propDate As UserProperty
Dim propCount As UserProperty
' 連番を保持する StorageItem オブジェクトを取得
If myStgCount Is Nothing Then
Set fldInbox = Session.GetDefaultFolder(olFolderInbox)
Set myStgCount = fldInbox.GetStorage(COUNT_SUBJECT, olIdentifyBySubject)
End If
' 今日の日付を取得
strToday = FormatDateTime(Now, vbShortDate)
' 連番を保持している日付を取得
Set propDate = myStgCount.UserProperties.Find("CountDate")
If propDate Is Nothing Then
' プロパティがなければ新規追加
Set propDate = myStgCount.UserProperties.Add("CountDate", olText)
propDate.Value = strToday
End If
' 連番を取得
Set propCount = myStgCount.UserProperties.Find("Counter")
If propCount Is Nothing Then
' プロパティがなければ新規追加
Set propCount = myStgCount.UserProperties.Add("Counter", olInteger)
propCount.Value = 0
End If
' 日付が変わっていたら連番をリセット
If propDate.Value <> strToday Then
propDate.Value = strToday
propCount.Value = 1
Else
' 日付が変わっていなければ連番を追加
propCount.Value = propCount.Value + 1
End If
' 変更後の連番と日付を保存
myStgCount.Save
GetSerialForToday = propCount.Value
End Function
いつも参考にさせていただいております
こちらの”受信したメールの添付ファイルに日付と連番を付けて自動保存するマクロ”
を仕分けルールのスクリプトで動作し、添付ファイルの保存後に印刷もするものにしたく調べながら編集しているんですが、うまく動作してくれません。お力添えお願いできませんでしょうか?よろしくお願いいたします。
まず、マクロの先頭部分に以下を追加します。
Private Declare Function ShellExecute Lib “shell32.dll” Alias “ShellExecuteA” _
(ByVal hwnd As Long, ByVal lpszOp As String, _
ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal LpszDir As String, ByVal FsShowCmd As Long) _
As Long
そして、.SaveAsFile strFileName で添付ファイルを保存した後に以下の記述で印刷ができます。
ShellExecute 0, “print”, strFileName, 0, SAVE_PATH, 0
いつも大変参考になっております
ありがとうございます
さて、こちらの連番にて添付ファイル自動保存のマクロに特定の差出人のメールのみ保存するようにしたいのですが、複数人となるとうまくいきません
大変初歩的で申し訳ないのですが下記のスクリプトを作成したのですが、ご教授頂けると大変ありがたいです。
鈴木太郎山田次郎として複数人設定しましたが、うまく作動しません
——-
‘ 連番を保持する StorageItem オブジェクト
Dim myStgCount As StorageItem
‘ メール受信時に発生するイベント
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
On Error Resume Next
Dim objMsg As MailItem
‘
Set objMsg = Session.GetItemFromID(EntryIDCollection)
If Not objMsg Is Nothing Then
SaveAttachmentsWithDate objMsg
End If
End Sub
‘
‘ 添付ファイルの保存を行うサブ プロシージャ
Private Sub SaveAttachmentsWithDate(objMsg As MailItem)
Const SAVE_PATH = “C:\Users\”
Dim objAttach As Attachment
Dim iSerial As Integer
Dim strDate As String
Dim strFileName As String
‘
‘
‘ ここで条件指定
If Not objMsg.SenderName Like “鈴木太郎” Or Not objMsg.SenderName Like “山田次郎” Then
Exit Sub
End If
‘
‘ 日付を文字列に変換
strDate = Format(Now, “YYMMDD_”)
‘ 添付ファイルすべてについて処理
For Each objAttach In objMsg.Attachments
With objAttach
‘ 日ごとの連番を取得
iSerial = GetSerialForToday()
‘ ファイル名に日付と連番を追加
strFileName = SAVE_PATH & strDate & Format(iSerial, “0#_”) & .FileName
‘ ファイルを保存
.SaveAsFile strFileName
End With
Next
Set objMsg = Nothing
Set objFSO = Nothing
End Sub
‘
‘ 日ごとの連番を取得する関数
Private Function GetSerialForToday()
Const COUNT_SUBJECT = “GLOBAL_COUNTER”
Dim fldInbox As Folder
Dim myStgCount As StorageItem
Dim strToday As String
Dim propDate As UserProperty
Dim propCount As UserProperty
‘ 連番を保持する StorageItem オブジェクトを取得
If myStgCount Is Nothing Then
Set fldInbox = Session.GetDefaultFolder(olFolderInbox)
Set myStgCount = fldInbox.GetStorage(COUNT_SUBJECT, olIdentifyBySubject)
End If
‘ 今日の日付を取得
strToday = FormatDateTime(Now, vbShortDate)
‘ 連番を保持している日付を取得
Set propDate = myStgCount.UserProperties.Find(“CountDate”)
If propDate Is Nothing Then
‘ プロパティがなければ新規追加
Set propDate = myStgCount.UserProperties.Add(“CountDate”, olText)
propDate.Value = strToday
End If
‘ 連番を取得
Set propCount = myStgCount.UserProperties.Find(“Counter”)
If propCount Is Nothing Then
‘ プロパティがなければ新規追加
Set propCount = myStgCount.UserProperties.Add(“Counter”, olInteger)
propCount.Value = 0
End If
‘ 日付が変わっていたら連番をリセット
If propDate.Value strToday Then
propDate.Value = strToday
propCount.Value = 1
Else
‘ 日付が変わっていなければ連番を追加
propCount.Value = propCount.Value + 1
End If
‘ 変更後の連番と日付を保存
myStgCount.Save
GetSerialForToday = propCount.Value
End Function
以下のロジックでは常に条件に当てはまってしまうため、Exit Sub で処理を中断してしまいます。
If Not objMsg.SenderName Like “鈴木太郎” Or Not objMsg.SenderName Like “山田次郎” Then
If A Or B Then は、A か B のいずれかの条件に合致したら、という意味になるので、どちらか一方が合致してしまえば、条件は成立し、Exit Sub が中断されます。
そして、SenderName が鈴木太郎であれば Not objMsg.SenderName Like “山田次郎” のほうに合致し、SenderName が山田次郎であれば Not objMsg.SenderName Like “鈴木太郎” のほうに合致するため、いずれの場合も条件が成立することになるのです。
以下のような条件とする必要があります。
If Not (objMsg.SenderName Like “鈴木太郎” Or objMsg.SenderName Like “山田次郎”) Then
続けてすみません
ご質問なのですが、現在開いているメールに対して、手動でファイルを特定のフォルダに日付連番で保存するよう下記のように書きましたが、エラーが出てしまいます
Private Function GetSerialForToday() の名前が違うとのエラーが出ます
ご教示頂けると幸いです
———-
Sub SaveAttachmentFile()
Dim objItem As Object
Dim objIns As Inspector
Dim strFile As String
Dim strPath As String
Dim objAttachment As Object
Set objIns = Application.ActiveInspector
Set objItem = objIns.CurrentItem ‘今開いているメールオブジェクトを取得
strPath = “C:\Users\” ‘ファイルを保存したいフォルダ
With objItem
For Each objAttachment In .Attachments
strFile = strPath & objAttachment
objAttachment.SaveAsFile strFile
Next objAttachment
End With
‘ ここで条件指定
‘
‘ 日付を文字列に変換
strDate = Format(Now, “YYMMDD_”)
‘ 添付ファイルすべてについて処理
For Each objAttach In objMsg.Attachments
With objAttach
‘ 日ごとの連番を取得
iSerial = GetSerialForToday()
‘ ファイル名に日付と連番を追加
strFileName = SAVE_PATH & strDate & Format(iSerial, “0#_”) & .FileName
‘ ファイルを保存
.SaveAsFile strFileName
End With
Next
Set objMsg = Nothing
Set objFSO = Nothing
End Sub
‘
‘ 日ごとの連番を取得する関数
Private Function GetSerialForToday()
Const COUNT_SUBJECT = “GLOBAL_COUNTER”
Dim fldInbox As Folder
Dim myStgCount As StorageItem
Dim strToday As String
Dim propDate As UserProperty
Dim propCount As UserProperty
‘ 連番を保持する StorageItem オブジェクトを取得
If myStgCount Is Nothing Then
Set fldInbox = Session.GetDefaultFolder(olFolderInbox)
Set myStgCount = fldInbox.GetStorage(COUNT_SUBJECT, olIdentifyBySubject)
End If
‘ 今日の日付を取得
strToday = FormatDateTime(Now, vbShortDate)
‘ 連番を保持している日付を取得
Set propDate = myStgCount.UserProperties.Find(“CountDate”)
If propDate Is Nothing Then
‘ プロパティがなければ新規追加
Set propDate = myStgCount.UserProperties.Add(“CountDate”, olText)
propDate.Value = strToday
End If
‘ 連番を取得
Set propCount = myStgCount.UserProperties.Find(“Counter”)
If propCount Is Nothing Then
‘ プロパティがなければ新規追加
Set propCount = myStgCount.UserProperties.Add(“Counter”, olInteger)
propCount.Value = 0
End If
‘ 日付が変わっていたら連番をリセット
If propDate.Value strToday Then
propDate.Value = strToday
propCount.Value = 1
Else
‘ 日付が変わっていなければ連番を追加
propCount.Value = propCount.Value + 1
End If
‘ 変更後の連番と日付を保存
myStgCount.Save
GetSerialForToday = propCount.Value
End Function
End Sub
こちらは「名前が違う」というエラーの原因がわかりませんでした。
ただ、End Function の次に End Sub があるのは正しくないので、最後の End Sub は削除してください。
[…] 受信したメールの件名でフォルダーをデスクトップ上に作成し、添付ファイルを保存するマクロ受信したメールの埋め込み画像を除いた添付ファイルを自動保存するマクロ受信したメールの件名の文字列により異なるフォルダーへ自動的に添付ファイルを保存するマクロ共有メールボックスの受信トレイに追加されたメールの添付ファイルを保存するマクロ受信したメールを自動的に MSG ファイルとして保存するマクロ受信したメールの添付ファイルに日付と連番を付けて自動保存するマクロ送信者が自分以外のメールを受信した際に添付ファイルを自動保存するマクロ受信したメールの添付メッセージに含まれる添付ファイルも保存・印刷するマクロ受信したメールの件名の文字列により異なるフォルダーへ自動的に添付ファイルを保存するマクロ […]