1485686015 マイクロソフトアウトルックの件名内容を特定フォルダにメモ帳貼付したい。【エクセルVBA】



画像のようなマイクロソフトアウトルックのメッセージを選択し、
選択したメール内容をメモ帳で保存したいのです。

・メールの件名がそのままメモ帳の件名
・メールのメッセージ内容がそのままメモ帳の中身

となります。

メールの件名は170217021補助説明など、9ケタ(2017年の下二けた17から始まる6ケタ+3桁の連番+漢字の組み合わせです。


それを下記の場所に、件名に応じて、その日付(この場合17017)というフォルダをつくって、その中のさらに下層の楽天というフォルダをつくってその中に保存したいのです。


なお、フォルダがすでに存在している場合もあります。

★保存場所などは追加説明いたします。
途中エラーがでたときには、エラーがでたので中止しました。などと言ってくれるとありがたいです。


エクセルのVBAかUWSCでお願いいたします。
(それ以外にポイントはお付けできません)
お手数ですがよろしくお願いいたします。

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2017/01/29 19:33:35
  • 終了:2017/02/05 19:35:04
id:naranara19

★画像の保存場所は
C:\Users\zzzzzz\Desktop\PC移動受け\写真(現在)\170217\楽天

などになります。

zzzzzzは実際は個人名です。



★マイクロソフトアウトルックの保存場所は
C:\Users\zzzzzz\AppData\Local\Microsoft\Outlook\Outlook.pst

でした。その「自分の出品必要」というトレイになります。

ベストアンサー

id:a-kuma3 No.1

a-kuma3回答回数4619ベストアンサー獲得回数19552017/02/03 22:52:53

ポイント500pt

Excel VBA でという指定がありますが、Excel のファイルに保存するわけでもなく、Excel を起動する意味がないと思うので、VBScript のコードです。

base_dir = "C:\Users\zzzzzz\Desktop\PC移動受け\写真(現在)\"

Sub save_mail

    Set re = New RegExp
    re.Pattern = "^(\d{6})\d{3}"

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set outlook = WScript.CreateObject("Outlook.Application")

    Set namespace = outlook.GetNamespace("MAPI")
    
    Set inbox = namespace.GetDefaultFolder(6)   ' InBox
    Set mail_folder = inbox.Folders("自分の出品必要")
    
    
    For i = 1 To mail_folder.Items.Count
        Set mail = mail_folder.Items(i)
        Set ma = re.Execute(mail.Subject)
        If ma.Count > 0 Then
            folder = ma(0).SubMatches(0)
            file = mail.Subject
            If Not fs.FolderExists(base_dir & folder) Then
                fs.CreateFolder(base_dir & folder)
                fs.CreateFolder(base_dir & folder & "\楽天")
            End If
            If Not fs.FileExists(base_dir & folder & "\楽天\" & file & ".txt") Then
                Set f = fs.CreateTextFile(base_dir & folder & "\楽天\" & file & ".txt", True)
                f.Write(mail.Body)
                f.Close
            Else
                wscript.echo "File already exists. " & file
            End If
        Else
            wscript.echo "Bad title. " & mail.Subject
        End If
    Next

'   outlook.Quit        ' Outlook を終了させる
    Set outlook = Nothing
    Set fs = Nothing

End Sub

call save_mail

上記のコードを、savemail.vbs というような名前で保存して、コマンドプロンプトを起動して

d> cscript savemail.vbs

という感じで実行します。
# d> は、プロンプトのつもりです。

保存先の根っこになるディレクトリを、スクリプトの先頭で書いてますので、適宜変更してください。
他にも、「楽天」というサブディレクトリ名とか、受信メールのフォルダなど埋め込みで書いているところがいくつかあります。

メールの件名が数字9ケタで始まってない場合と、既に同名のファイルが存在する場合には、コマンドプロンプトにメッセージを出して処理をスキップするようにしています。

スクリプトの最後の方に、outlook.Quit という行をコメントアウトしていますが、これを活かすと起動中の Outlook を終了させます。
普段、Outlook を起動しっぱなしにしているなら、コメントアウトしたままの方が使いやすいと思います。
逆に、Outlook は必要なときにしか起動せず、メールを確認したらすぐに閉じてしまうような使い方をしているなら、コメントを外した方が良いと思います。

他9件のコメントを見る
id:naranara19

ありがとうございました!これ以上はご迷惑をおかけするので、一度質問を終了しますね。
また本件等ご質問させていただくときにはぜひご協力いただけたら幸いです。
いつもありがとうございます。

2017/02/07 18:14:23
id:a-kuma3

うーん、もやもやします (´・ω・`)

2017/02/08 01:47:24

その他の回答(0件)

id:a-kuma3 No.1

a-kuma3回答回数4619ベストアンサー獲得回数19552017/02/03 22:52:53ここでベストアンサー

ポイント500pt

Excel VBA でという指定がありますが、Excel のファイルに保存するわけでもなく、Excel を起動する意味がないと思うので、VBScript のコードです。

base_dir = "C:\Users\zzzzzz\Desktop\PC移動受け\写真(現在)\"

Sub save_mail

    Set re = New RegExp
    re.Pattern = "^(\d{6})\d{3}"

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set outlook = WScript.CreateObject("Outlook.Application")

    Set namespace = outlook.GetNamespace("MAPI")
    
    Set inbox = namespace.GetDefaultFolder(6)   ' InBox
    Set mail_folder = inbox.Folders("自分の出品必要")
    
    
    For i = 1 To mail_folder.Items.Count
        Set mail = mail_folder.Items(i)
        Set ma = re.Execute(mail.Subject)
        If ma.Count > 0 Then
            folder = ma(0).SubMatches(0)
            file = mail.Subject
            If Not fs.FolderExists(base_dir & folder) Then
                fs.CreateFolder(base_dir & folder)
                fs.CreateFolder(base_dir & folder & "\楽天")
            End If
            If Not fs.FileExists(base_dir & folder & "\楽天\" & file & ".txt") Then
                Set f = fs.CreateTextFile(base_dir & folder & "\楽天\" & file & ".txt", True)
                f.Write(mail.Body)
                f.Close
            Else
                wscript.echo "File already exists. " & file
            End If
        Else
            wscript.echo "Bad title. " & mail.Subject
        End If
    Next

'   outlook.Quit        ' Outlook を終了させる
    Set outlook = Nothing
    Set fs = Nothing

End Sub

call save_mail

上記のコードを、savemail.vbs というような名前で保存して、コマンドプロンプトを起動して

d> cscript savemail.vbs

という感じで実行します。
# d> は、プロンプトのつもりです。

保存先の根っこになるディレクトリを、スクリプトの先頭で書いてますので、適宜変更してください。
他にも、「楽天」というサブディレクトリ名とか、受信メールのフォルダなど埋め込みで書いているところがいくつかあります。

メールの件名が数字9ケタで始まってない場合と、既に同名のファイルが存在する場合には、コマンドプロンプトにメッセージを出して処理をスキップするようにしています。

スクリプトの最後の方に、outlook.Quit という行をコメントアウトしていますが、これを活かすと起動中の Outlook を終了させます。
普段、Outlook を起動しっぱなしにしているなら、コメントアウトしたままの方が使いやすいと思います。
逆に、Outlook は必要なときにしか起動せず、メールを確認したらすぐに閉じてしまうような使い方をしているなら、コメントを外した方が良いと思います。

他9件のコメントを見る
id:naranara19

ありがとうございました!これ以上はご迷惑をおかけするので、一度質問を終了しますね。
また本件等ご質問させていただくときにはぜひご協力いただけたら幸いです。
いつもありがとうございます。

2017/02/07 18:14:23
id:a-kuma3

うーん、もやもやします (´・ω・`)

2017/02/08 01:47:24

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません