【OutlookVBA】フォルダを移動

Yahoo!知恵袋から、OutlookのVBAで、受信トレイのフォルダを移動させるには。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11280183926

Outlookのフォルダの位置を入れ替える(移動)マクロは作れますか?
用途は位置を移動させてもマクロを使用したら固定の配置にできるイメージです

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11280183926

回答

私の回答です。

作れますが、ご質問の内容だけでは分からないことが多くて、具体的なコードを作れないです。

移動させたいフォルダが何という名前でどういうフォルダ配下にあるか(フォルダによっては移動させることができないものもありますので)、位置を移動させるのはユーザの不注意によるものなのか、それとも恣意的なものなのか(それによって考えなければいけないエラー制御の量が変わりますので)、移動させたらすぐもとに戻したいのかそれともある一定の時間が経過した後にまとめてでもよいのか(それによってイベントを使うか、それともバッチ処理でよいかどうかが決まりますので)などなど、分からないことが多くて、ご質問の内容だけではお役には立てないです。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11280183926

以下は、受信トレイ配下に作ったフォルダ1とフォルダ2のうち、フォルダ2をフォルダ1に移動させるコードです。

受信トレイ
├─フォルダ1
└─フォルダ2

変更前↑

受信トレイ
└─フォルダ1
    └─フォルダ2

変更後↑
Option Explicit
'フォルダ2をフォルダ1に移動させる
Public Sub MoveToFolder()
    
    Dim NS As Outlook.NameSpace
    Dim 受信トレイ As Outlook.Folder
    Dim Folder1 As Outlook.Folder
    Dim Folder2 As Outlook.Folder
    
    Set NS = Application.GetNamespace("MAPI")
    Set 受信トレイ = NS.GetDefaultFolder(olFolderInbox)
    Set Folder1 = 受信トレイ.Folders("フォルダ1")
    Set Folder2 = 受信トレイ.Folders("フォルダ2")
    
    'フォルダ2をフォルダ1に移動
    Folder2.MoveTo Folder1
    
    '後始末
    Set Folder2 = Nothing
    Set Folder1 = Nothing
    Set 受信トレイ = Nothing
    Set NS = Nothing
    
End Sub

解説

特に解説することもないような気がしていますが、コードの説明をしておくと、フォルダ.MoveToでフォルダ移動します。

MoveToには引数が一つあって、移動先のフォルダ(オブジェクト)です。引数はオブジェクト型(Folder型)の値を指定しないといけません。

そもそもの話からすると、OutlookのVBAは他のVBAと少し世界観が違っています。

Applicationですぐいろいろなオブジェクトにアクセスできる訳でなくて、名前空間(NameSpace)を指定しないといけません。

じゃあ、その名前空間というのはたくさんあるのかというと、今のところたった一つしか実装されていなくて、”MAPI”といいます(Message Application Programming Interface)。一つしかないならなくてもよかったのに・・・と思わないでもないですが、将来の拡張性のためかなという気もするので、おとなしく呪文を唱えることにしています(これが呪文です⇒Set NS = Application.GetNamespace(“MAPI”))。

その後、目的のフォルダまでは階層構造を順にたどってアクセスしていきます。

まず受信トレイは、NS.GetDefaultFolder(olFolderInbox)で取得できます。

受信トレイの下にあるフォルダは、受信トレイ.Folders(“○○○”)で取得できます(○○○にはフォルダの名称が入ります)。

調べたこと

ここからディープで濃い話になります。

今回こういうテスト環境を用意しました。

テスト環境

受信トレイの下にフォルダ1とフォルダ2があります。

このフォルダの上で右クリックしてみると、次のような操作が用意されていました。

下へ移動

実際にやってみます。

フォルダ1を下に移動させたところ

そこで私は思ったわけです、「これ絶対VBAでもできるよね?」と。

ところが・・・・。

結論から言うと、下に移動ないし上に移動に相当するVBAのメソッドは見つけることができませんでした。

NavigationとかViewの方にあるかな??と調べましたが、それっぽいものは見つかりません。

NavigationFolderにPositionというプロパティがあったので、「ひょっとしたらこれか!?」とも思ったのですが、違いました。

NavigationFolderのPosition

今回質問者様にはフォルダからフォルダへの移動を示しましたが、場合によっては同一フォルダ下における移動もさせたいことがあるであろうと思い調べ始めたら、みごとにドツボにはまりました。

見つけられなかったです(›´÷`‹ )げっそり

私の調べ方が悪いのかもしれませんが・・・。

もちろんSortで解決できる場合もあります。そうではなくて、私が知りたいのは、「下に移動」「上に移動」(あるいは、マウスを使ってフォルダをドラッグで移動)をVBAで実装するにはどうすればよいか?ということです。

この件は継続調査とします(知見者の情報提供お待ちしております)。

Outlookのバージョン情報

Microsoft Outlook for Microsoft 365 MSO (バージョン2304 ビルド16.0.16327.20200) 64ビット