[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロが止まります』(むうこ)
outlookの受信フォルダ下にあるいくつかのサブフォルダ内のメール
内容を書き出すマクロで、あるフォルダの内容を書き出すマクロだけ
途中で止まってしまいます。
エラーメッセージは
「クラスはオートメーションまたは予測したインターフェースをサポートしていません。」です。
ひとつのサブフォルダについて以下のコードを作成して
call でくっつけています。
このコードのうち Bフォルダのメール内容を呼び出すマクロだけ
上記エラーで止まります。Bフォルダに1000くらいのメールがありその状態でマクロをかけるとエラーになりますが100くらいに減らすとちゃんと機能します。
他のフォルダは1000以上のメールがあっても思い通りに動きます。
何が原因なのか、どうすればいいのか、問題の切り分けでもご教授ください。
sub folderA()
Dim ol As Object Dim sht As Worksheet Dim rowCnt As Long
Set ol = GetObject(, "Outlook.Application") If ol Is Nothing Then Exit Sub
Set sht = Worksheets("Aメール取得")
' シートクリア With sht Columns("A:D").Select Selection.ClearContents .Cells(1, 1).Value = "受信日時" .Cells(1, 2).Value = "差出人" .Cells(1, 3).Value = "件名" .Cells(1, 4).Value = "本文" End With
' メール一覧取得 rowCnt = 1 For Each itms In ol.GetNamespace("MAPI").GetDefaultFolder(6).Folders("A").Items
If itms.Class = 43 Then ' olMail:43 sht.Cells(rowCnt + 1, 1).Value = itms.ReceivedTime ' 受信日時 sht.Cells(rowCnt + 1, 2).Value = itms.SenderName ' 差出人 sht.Cells(rowCnt + 1, 3).Value = itms.Subject ' 件名 sht.Cells(rowCnt + 1, 4).Value = itms.Body ' 本文
rowCnt = rowCnt + 1 End If
Next
Set ol = Nothing End Sub
Sub
< 使用 Excel:Excel2016、使用 OS:Windows10 >
>Bフォルダに1000くらいのメールがありその状態でマクロをかけるとエラーになりますが >100くらいに減らすとちゃんと機能します。 >他のフォルダは1000以上のメールがあっても思い通りに動きます。
ならBフォルダーの一部のメールそのものがエラーを引き起こしている原因では? 地道な作業になるけど100づつ別のフォルダーに分けて、個別に実行したらどうなりますか?
(sy) 2018/06/17(日) 10:17
「取り消し」されたメールがあると、そこでエラーになりました。
ソートして「取り消し」メールを削除後に
マクロを実行するとちゃんと動きました。
アドバイス、どうもありがとうございました・
(むうこ) 2018/06/18(月) 12:48
(1)
たぶんだけど、なかなか回答つかなかったのは、「GetObject(, "Outlook.Application")」ってやってるから解ってると思いますが、掲示板の趣旨である”エクセル”の質問じゃ無くて”Outlook”の質問だよなぁと思われてるだとおもいます。(少なくともわたしはそう思いました)
なので、今回はこちらで欲しい回答が得られたようですが、問題がOutlookにあることが濃厚な場合は、最初から、moug(http://www.moug.net/)などOutlookの質問にも対応できるような質問サイトで聞いてみるのも手なんじゃないかとおもいます。
(2)
提示されたコードってご自身で作成されたものですか?
私も詳しいわけではないですが、ExcelVBAで他のアプリケーションを操作しようとするレベルの方が
Columns("A:D").Select Selection.ClearContents
や
sht.Cells(rowCnt + 1, 1).Value = itms.ReceivedTime ' 受信日時 sht.Cells(rowCnt + 1, 2).Value = itms.SenderName ' 差出人 sht.Cells(rowCnt + 1, 3).Value = itms.Subject ' 件名 sht.Cells(rowCnt + 1, 4).Value = itms.Body ' 本文
という書き方を選択するようにも思えず、
・前者は .Columns("A:D").ClearContents
・後者は いちいちセルに出力せず、配列を経由(メモリ上で処理してから)させてセルへの出力は1回だけやる
という設計にされる方が多いように思います。(格納する件数が多いと逆に逐一出力した方がいいのかなぁ・・・)
(3)
Outlook側に問題があるとすれば、
http://www.ken3.org/cgi-bin/group/vba_outlook.asp
こちらとか研究の参考にならないでしょうか
(4)
「.GetNamespace("MAPI").GetDefaultFolder(6).Folders("A").Items」
' olMail:43 これら↑の部分がそれぞれ、これでよいのか私のスキルだと解らないですが、(2)の部分を中心に改造、コメント付けしてみました。よかったら研究の足しにしてください。
※「ひとつのサブフォルダについて以下のコードを作成して call でくっつけています。 」とのことでしたので、サブフォルダを取得する部分と、メールアイテムを取得&出力する部分でプロシージャを分けてみました。
Sub メインルーチン() Dim ol As Object Dim MyFolder As Object
'Outlookが起動してなかったら終了 On Error Resume Next Set ol = GetObject(, "Outlook.Application") If ol Is Nothing Then Exit Sub On Error GoTo 0
'受信トレイ配下のサブフォルダを順に取得して処理 For Each MyFolder In ol.GetNamespace("MAPI").GetDefaultFolder(6).Folders
'サブフォルダの中にメールが1つ以上ある場合だけ処理 If MyFolder.Items.Count > 0 Then Call サブルーチン(MyFolder)
Next MyFolder
Set ol = Nothing End Sub
Sub サブルーチン(MyFolder As Object) Dim Myarr As Variant Dim dstSH As Worksheet Dim i As Long, c As Long
c = MyFolder.Items.Count
'Myarrを2次元配列として定義してメールのデータを格納 ReDim Myarr(1 To c, 1 To 4) For i = 1 To c With MyFolder.Items(i) Application.StatusBar = MyFolder.Name & "を処理中......" & i & "/" & c If .Class = 43 Then '←★私のスキルだと何をしたいのか解らず Myarr(i, 1) = .ReceivedTime ' 受信日時 Myarr(i, 2) = .SenderName ' 差出人 Myarr(i, 3) = .Subject ' 件名 Myarr(i, 4) = .Body ' 本文 End If End With Next i
'出力用シートの用意 On Error GoTo シート生成 Set dstSH = ThisWorkbook.Worksheets(MyFolder.Name & "メール取得") On Error GoTo 0
'出力用シートへ出力 With dstSH .Range("A:D").Cells.ClearContents .Range("A1:D1").Value = Array("受信日時", "差出人", "件名", "本文") .Range("A2").Resize(c, 4).Value = Myarr End With
Application.StatusBar = False Exit Sub
シート生成: Application.StatusBar = "出力用のシートを生成しています" Set dstSH = ThisWorkbook.Worksheets.Add dstSH.Name = MyFolder.Name & "メール取得"
Resume
End Sub
(もこな2) 2018/06/18(月) 18:28
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.