質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

1回答

3864閲覧

VBSでMSGファイルから添付ファイルを抽出するスクリプト

OfficeNono

総合スコア15

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2021/07/22 10:15

処理時間を短縮させることはできないでしょうか。

VBS

1'************************************************************* 2' ドラッグ&ドロップしたmsgファイルから添付ファイルを抽出し、 3' 指定したフォルダに保存するスクリプト 4' 5' 2015/12/16 @kinuasa 6' 2021/07/22 @Nonomura 保存フォルダをVBSのあるフォルダに変更 https://qiita.com/asterisk9101/items/54cdcedb9ef60ea0bb21 @asterisk9101が2015年06月09日に更新 7'************************************************************* 8 9Option Explicit 10 11Dim fso '2021/07/22 @Nonomura 12set fso = createObject("Scripting.FileSystemObject") '2021/07/22 @Nonomura 13 14Dim strFolderPath '2021/07/22 @Nonomura 15strFolderPath = fso.getParentFolderName(WScript.ScriptFullName) '2021/07/22 @Nonomura 16 17Dim Dup '2021/07/22 @Nonomura 重複ファイル名蓄積 18Dim MyFlag '2021/07/22 @Nonomura 重複フラグ 19Dim Mydic 20Set Mydic = CreateObject("Scripting.Dictionary") 21 22Dup = "削除された添付ファイル,MSGファイル" & vbCrLf '2021/07/22 @Nonomura 重複メッセージ 23MyFlag = 0 '2021/07/22 @Nonomura 重複フラグ 24 25 26Dim args 27Dim olApp 28Dim i 29'Const SaveFolderPath = "C:\Users\user\Desktop\添付ファイル抽出" '添付ファイルの保存先フォルダ(※要変更) 2021/07/22 @Nonomura ↓に変更 30dim SaveFolderPath '2021/07/22 @Nonomura 31SaveFolderPath = strFolderPath '2021/07/22 @Nonomura 32 33Set args = WScript.Arguments 34If args.Count < 1 Then 35 MsgBox "msgファイルを当スクリプトファイルにドラッグ&ドロップしてください。", vbExclamation + vbSystemModal 36 WScript.Quit 37End If 38 39With CreateObject("Scripting.FileSystemObject") 40 If .FolderExists(SaveFolderPath) = False Then 41 MsgBox "添付ファイルの保存先フォルダが見つかりませんでした。" & vbCrLf & _ 42 "処理を中止します。", vbCritical + vbSystemModal 43 WScript.Quit 44 End If 45 Set olApp = CreateObject("Outlook.Application") 46 For i = 0 To args.Count - 1 47 If .FileExists(args(i)) = True Then 48 Select Case LCase(.GetExtensionName(args(i))) 49 Case "msg" 'msgファイルのみ処理 50 SaveMsgAttachments olApp, args(i), AddPathSeparator(SaveFolderPath), Mydic, Dup, MyFlag '2021/07/22 @Nonomura 引数追加 51 End Select 52 End If 53 Next 54 olApp.Quit 55End With 56 57 if MyFlag = 1 then 58 msgbox "添付ファイルの一部は、ファイル名が同一であったため、上書きされました。" & vbCrLf & _ 59 "重複データ.csvを確認してください。" '2021/07/22 @Nonomura 重複メッセージ 60 61 Dim ts 62 Set ts = fso.CreateTextFile(SaveFolderPath & "\重複データ.csv", True, True) 63 64 ts.Write (Dup) ' 書き込み 65 ts.Close ' ファイルを閉じる 66 End if 67 68 69 70MsgBox "処理が終了しました。", vbInformation + vbSystemModal 71 72Private Sub SaveMsgAttachments(ByVal OutlookApp, ByVal MsgFilePath, ByVal SaveFolderPath, ByRef Mydic, ByRef Dup, ByRef MyFlag) '2021/07/22 @Nonomura 引数追加 73 Dim itm 'Outlook.MailItem 74 Dim atc 'Outlook.Attachment 75 Dim fn 76 77 With OutlookApp.GetNamespace("MAPI") 78 Set itm = .OpenSharedItem(MsgFilePath) 79 Select Case LCase(TypeName(itm)) 80 Case "mailitem" 81 If itm.Attachments.Count < 1 Then 82 MsgBox "添付ファイルがありません。" & vbCrLf & _ 83 "(ファイル名:" & MsgFilePath & ")", vbExclamation + vbSystemModal 84 Exit Sub 85 Else 86 With CreateObject("Scripting.FileSystemObject") 87 For Each atc In itm.Attachments 88 fn = SaveFolderPath & atc.FileName 89 If .FileExists(fn) = True Then 90 Dup = Dup & atc.FileName & "," & Mydic(atc.FileName) & vbCrLf '2021/07/22 @Nonomura 91 If Mydic.Exists(atc.FileName) = True Then '2021/07/22 @Nonomura 92 Mydic.Remove atc.FileName '2021/07/22 @Nonomura 93 Mydic.Add atc.FileName, .getFileName(MsgFilePath) '2021/07/22 @Nonomura 94 End If 95 .DeleteFile fn, True '同名のファイルがあったら事前に削除 96 End If 97 If Mydic.Exists(atc.FileName) = False Then '2021/07/22 @Nonomura 98 Mydic.Add atc.FileName, .getFileName(MsgFilePath) '2021/07/22 @Nonomura 99 Else '2021/07/22 @Nonomura 100 MyFlag = 1 '2021/07/22 @Nonomura 重複フラグ 101 End If '2021/07/22 @Nonomura 102 atc.SaveAsFile fn 103 Next 104 End With 105 End If 106 End Select 107 End With 108 109End Sub 110 111Private Function AddPathSeparator(ByVal s) 112 If Right(s, 1) <> ChrW(92) Then s = s & ChrW(92) 113 AddPathSeparator = s 114End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

ループ処理の中にあるcreateObject("Scripting.FileSystemObject")をfsoに置き換えて、呼び出し元から引数としてオブジェクトを渡してあげるようにしたら多少速くなりました。

VBS

1'************************************************************* 2' ドラッグ&ドロップしたmsgファイルから添付ファイルを抽出し、 3' 指定したフォルダに保存するスクリプト 4' 5' 2015/12/16 @kinuasa 6' 2021/07/22 @Nonomura 保存フォルダをVBSのあるフォルダに変更 https://qiita.com/asterisk9101/items/54cdcedb9ef60ea0bb21 @asterisk9101が2015年06月09日に更新 7'************************************************************* 8 9Option Explicit 10 11Dim fso '2021/07/22 @Nonomura 12set fso = createObject("Scripting.FileSystemObject") '2021/07/22 @Nonomura 13 14Dim strFolderPath '2021/07/22 @Nonomura 15strFolderPath = fso.getParentFolderName(WScript.ScriptFullName) '2021/07/22 @Nonomura 16 17Dim Dup '2021/07/22 @Nonomura 重複ファイル名蓄積 18Dim list '2021/07/22 @Nonomura 19Dim MyFlag '2021/07/22 @Nonomura 重複フラグ 20Dim Mydic 21Set Mydic = CreateObject("Scripting.Dictionary") 22 23Dup = "削除された添付ファイル,削除されたMSG,上書きしたMSG" & vbCrLf '2021/07/22 @Nonomura 重複メッセージ 24list = "MSGファイル,添付ファイル" & vbCrLf 25MyFlag = 0 '2021/07/22 @Nonomura 重複フラグ 26 27 28Dim args 29Dim olApp 30Dim i 31'Const SaveFolderPath = "C:\Users\user\Desktop\添付ファイル抽出" '添付ファイルの保存先フォルダ(※要変更) 2021/07/22 @Nonomura ↓に変更 32dim SaveFolderPath '2021/07/22 @Nonomura 33SaveFolderPath = strFolderPath '2021/07/22 @Nonomura 34 35Set args = WScript.Arguments 36If args.Count < 1 Then 37 MsgBox "msgファイルを当スクリプトファイルにドラッグ&ドロップしてください。", vbExclamation + vbSystemModal 38 WScript.Quit 39End If 40 41With fso 42 If .FolderExists(SaveFolderPath) = False Then 43 MsgBox "添付ファイルの保存先フォルダが見つかりませんでした。" & vbCrLf & _ 44 "処理を中止します。", vbCritical + vbSystemModal 45 WScript.Quit 46 End If 47 Set olApp = CreateObject("Outlook.Application") 48 For i = 0 To args.Count - 1 49 If .FileExists(args(i)) = True Then 50 Select Case LCase(.GetExtensionName(args(i))) 51 Case "msg" 'msgファイルのみ処理 52 SaveMsgAttachments olApp, args(i), AddPathSeparator(SaveFolderPath), Mydic, Dup, MyFlag, list, fso '2021/07/22 @Nonomura 引数追加 53 End Select 54 End If 55 Next 56 olApp.Quit 57End With 58 59 if MyFlag = 1 then 60 msgbox "添付ファイルの一部は、ファイル名が同一であったため、上書きされました。" & vbCrLf & _ 61 "重複データ.csvを確認してください。" '2021/07/22 @Nonomura 重複メッセージ 62 63 Dim ts 64 Set ts = fso.CreateTextFile(SaveFolderPath & "\!重複データ.csv", True, True) 65 66 ts.Write (Dup) ' 書き込み 67 ts.Close ' ファイルを閉じる 68 Set ts = fso.CreateTextFile(SaveFolderPath & "\!添付ファイルリスト.csv", True, True) 69 ts.Write (list) ' 書き込み 70 ts.Close ' ファイルを閉じる 71 72 End if 73 74 75 76MsgBox "処理が終了しました。", vbInformation + vbSystemModal 77 78Private Sub SaveMsgAttachments(ByVal OutlookApp, ByVal MsgFilePath, ByVal SaveFolderPath, ByRef Mydic, ByRef Dup, ByRef MyFlag, ByRef list, ByVal fso) '2021/07/22 @Nonomura 引数追加 79 Dim itm 'Outlook.MailItem 80 Dim atc 'Outlook.Attachment 81 Dim fn 82 83 With OutlookApp.GetNamespace("MAPI") 84 Set itm = .OpenSharedItem(MsgFilePath) 85 Select Case LCase(TypeName(itm)) 86 Case "mailitem" 87 If itm.Attachments.Count < 1 Then 88 MsgBox "添付ファイルがありません。" & vbCrLf & _ 89 "(ファイル名:" & MsgFilePath & ")", vbExclamation + vbSystemModal 90 Exit Sub 91 Else 92 With fso 93 For Each atc In itm.Attachments 94 fn = SaveFolderPath & atc.FileName 95 list = list & .getFileName(MsgFilePath) & "," & atc.FileName & vbCrLf '2021/07/22 @Nonomura 96 If .FileExists(fn) = True Then 97 Dup = Dup & atc.FileName & "," & Mydic(atc.FileName) & "," & .getFileName(MsgFilePath) & vbCrLf '2021/07/22 @Nonomura 98 If Mydic.Exists(atc.FileName) = True Then '2021/07/22 @Nonomura 99 Mydic.Remove atc.FileName '2021/07/22 @Nonomura 100 Mydic.Add atc.FileName, .getFileName(MsgFilePath) '2021/07/22 @Nonomura 101 End If 102 .DeleteFile fn, True '同名のファイルがあったら事前に削除 103 End If 104 If Mydic.Exists(atc.FileName) = False Then '2021/07/22 @Nonomura 105 Mydic.Add atc.FileName, .getFileName(MsgFilePath) '2021/07/22 @Nonomura 106 Else '2021/07/22 @Nonomura 107 MyFlag = 1 '2021/07/22 @Nonomura 重複フラグ 108 End If '2021/07/22 @Nonomura 109 atc.SaveAsFile fn 110 Next 111 End With 112 End If 113 End Select 114 End With 115 116End Sub 117 118Private Function AddPathSeparator(ByVal s) 119 If Right(s, 1) <> ChrW(92) Then s = s & ChrW(92) 120 AddPathSeparator = s 121End Function

投稿2021/07/22 15:29

編集2021/07/25 09:16
OfficeNono

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問