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

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

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

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Q&A

1回答

2581閲覧

Outlook VBAで特定のメールをOneNoteに送信する方法について

marina0504

総合スコア3

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Outlook

Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

0グッド

0クリップ

投稿2021/10/31 05:48

編集2021/11/02 12:30

前提・実現したいこと

お疲れ様です。
VBA初心者です。

現在職場でOutlookの特定のフォルダに受信したメールをOnenoteに送信する
という作業をOutlookのVBAを使用して自動化しようとしています。

具体的には
未処理フォルダに受信されたメールを確認し、
特定の宛先が記載されていた場合そのメールをOneNoteに送り
該当メールを処理済フォルダに移動
この処理をフォルダのメールの数分だけ繰り返すという処理のコードを作成したいです。

以下に記載しているソースコードでは
未処理フォルダがMyFolder_A、処理済フォルダがMyFolder_Bの想定です。

発生している問題・エラーメッセージ

実際に動かして見たところ1件目のメールの処理では正常にフォルダ移動までできているものの
2件目の処理でMyItem.GetInspectoy.Displyの部分でエラーが発生してしまいます。。。

おそらくOneNoteに送信した時にアクティブウインドウがOneNoteに移った影響かなと考えています。
MyItem.GetInspectoy.Displyの上にMsgBoxを置いたところメッセージボックスを押せば
最後まで正常に動作することを確認できていますが、
1件の処理ごろにわざわざメッセージボックスを消しに行くの手間でしかないので
最初にマクロ開始をしたら未処理フォルダのすべてのメールに対して処理を行ってくれるマクロを作成したいと
考えています。

なにか皆様で思い当たる知見がありましたら教えて頂きたいです。

※下記ソースコードは会社で実際記載したものを
自宅で思い出しながら書いたものなので何か過不足があるかもしれないです。。
というかあると思います。。

該当のソースコード

Outlook

1

Sub Send_OneNote()
Dim MyItem As Outlook.MailItem
Dim MyFolder As Outlook.MAPIFolder
Dim MyNameSpace As Outlook.Namespace

Set MyNameSpace = Aplication.GetNamespace("MAPI")
Set MyMailFolder = MyNameSpace.GetDefaultFolder(olFolderInbox)
Set MyFolder_A = MymailFolder.Folders("A")
Set MyFolder_B = MymailFolder.Folders("B")

For i = 1 To MyFolder_A.Items.Count
If InStr(MyItem.To, "test") > 0 Then

Set MyItem = MyFolder_A.Items(1) MsgBox MyItem.To 'これを消すとエラーが発生する Set MyItem = Aplication.ActiveExplorer().Selection(1) MyItem.GetInspectoy.Disply MyItem.GetInspector.CommandBars.ExcuteMso ("MoveToOneNote") MyItem.Close (0) MyItem.Move MyFolder_B End If

Next i

End Sub

補足情報(FW/ツールのバージョンなど)

使用しているOfficeのバージョンは2016です

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

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

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

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

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

ken3memo

2021/11/01 07:39

該当のソースコードは本物ですか? 失礼、 1.変数名が違うコードが混ざっている?のでは? Dim MyNameSpace As Outlook.Namespace Set MyNameSpace = Aplication.GetName Set MyFolder_A = objNAMESPC.Folders(olFolderInbox).Folders("A") objNAMESPC.Folders ↑MyNameSpace ? 2.変数に代入していないのに、Ifの判断があるのがとても気になったり For i = 1 To MyFolder_A.Ttems.Count If InStr(MyItem.To, "test") > 0 Then '※←ここで、MyItem.Toに"test"が入っているか?聞いてますが、この変数MyItemの代入がIf判断の下↓にあるのが、とても気になったり。 Set MyItem = MyFolder_A.Items(1) MsgBox MyItem.To 'これを消すとエラーが発生する Set myItem = Aplication.ActiveExplorer().Selection(1) 3.↑MyFolder_A.Items(1)や.ActiveExplorer().Selection(1) Moveで移動するのでテストデータの作りによっては動くのかもしれませんが、 もし1番目にtestが入っていなければ、永遠にIf内に入らないのでは? 3.1 MyItem.Move MyFolder_B ループ内でMoveして、コレクション・オブジェクトの内容が変化すると、 トラブルが多い感じがします。 ※よく、Moveや削除するときは、後ろからループを回したりするコードが多かったり。  よけいなお世話ですが、きになったので。 質問が、 >おそらくOneNoteに送信した時にアクティブウインドウがOneNoteに移った影響かなと考えています。 のアクティブ関係なので、質問の本筋とはズレタコメントですが、 該当のソースコードは本物ですか? 少し気になったので。 アクティブウインドウの件、解決するといいですね。
ken3memo

2021/11/01 07:44

Set MyItem = MyFolder_A.Items(1) MsgBox MyItem.To 'これを消すとエラーが発生する Set myItem = Aplication.ActiveExplorer().Selection(1) ↑Set myItem = MyItemとmyItem?ここのコード、手書きで質問用に追加しましたか? 質問用にコードを加工するのが大変だともいますが、 実際に近い・動作するコードを加工してUPすると、 的確な回答が付きやすいと思います。
marina0504

2021/11/02 12:33

ken3memoさん回答ありがとうございます。 今後の質問の参考にさせて頂きます。 ソースコードについては発生している問題・エラーメッセージの最後の部分にも記載されている通り 会社で記載しているものを自宅で思い出しながら書いたものなので いくつかおかしい部分もあったかもしれないです。 先ほど修正させて頂きました。
guest

回答1

0

>※下記ソースコードは会社で実際記載したものを
>自宅で思い出しながら書いたものなので何か過不足があるかもしれないです。。
>というかあると思います。。

質問への追記・修正の依頼では、失礼しました。

Set MyItem = MyFolder_A.Items(1)
MsgBox MyItem.To 'これを消すとエラーが発生する
Set MyItem = Aplication.ActiveExplorer().Selection(1)

ActiveExplorer Selection で検索
https://docs.microsoft.com/ja-JP/office/vba/api/Outlook.Application.ActiveExplorer

もしかして、
MsgBox MyItem.To 'これを消すとエラーが発生する
のは、
Set MyItem = Aplication.ActiveExplorer().Selection(1)
と、単純に、選択されているアイテムActiveExplorer().Selection(1)をMyItemに再代入しているからでは?

MyItem.Move MyFolder_B
すると、二件目は選択されていないので
>実際に動かして見たところ1件目のメールの処理では正常にフォルダ移動までできているものの
>2件目の処理でMyItem.GetInspectoy.Displyの部分でエラーが発生してしまいます。。。

Set MyItem = Aplication.ActiveExplorer().Selection(1)
が要らないのでは?

あと、
Set MyItem = MyFolder_A.Items(1)
↑これ、(1)イチではなく(i)なのでは?実際のコードはiで転記ミスだったらすみません。

MyItem.GetInspectoy.Disply

.GetInspector を検索すると
https://docs.microsoft.com/ja-jp/office/vba/api/outlook.mailitem.getinspector

そのまま、
MyItem.Disply
でいいのでは?

あとは、ループを後ろから回して
https://teratail.com/questions/318808#reply-444569
↑昔の恥ずかしい削除アイテムの回答ですが移動ループ処理の参考となれば

VBA

1 For i = MyFolder_A.Items.Count To 1 Step -1 'メールを最後から先頭1まで回す 2 Set MyItem = MyFolder_A.Items(i) 'i番目のメール 3 If InStr(MyItem.To, "test") > 0 Then '宛先toにTESTが含まれていたら 4 MyItem.Disply 'メールアイテムの表示 5 MyItem.GetInspector.CommandBars.ExcuteMso ("MoveToOneNote") 'ノートに送る 6 MyItem.Close (0) 'メールアイテム閉じる 7 MyItem.Move MyFolder_B 'メールをBフォルダへ移動 8 End If 9 Next i

テストしていないので、動作しなかったらスミマセン。
解決の糸口となれば幸いです。

投稿2021/11/03 11:03

ken3memo

総合スコア132

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問