outlook VBAで実際のアイテム数より1多い数が取得される理由

このQ&Aのポイント
  • outlook VBAでフォルダ内のすべてのメールを処理する際、実際のアイテム数より1多い数が取得される現象が発生します。
  • この現象の原因は、処理の開始前にメールが追加され、アイテム数が変化したためです。
  • 処理中にメールが追加される可能性があるため、ループの最初にアイテム数を取得し、その後に処理を行う必要があります。
回答を見る
  • ベストアンサー

outlook 実際のアイテム数より1多い数が取得

http://www.geocities.co.jp/SiliconValley-Bay/3475/outlook_vba.html の フォルダ内のすべてのメールを処理   Dim ns As NameSpace Dim mf As MAPIFolder Dim x As Integer Set ns = GetNamespace("MAPI") Set mf = ns.Folders("個人用フォルダ").Folders("test") For x = 1 To mf.Items.Count   ' ここに処理を記述 Next MsgBox x & "件の処理が終了しました。" を実行すると、実際のアイテム数より1多い数が取得されるのですが なぜでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

>For x = 1 To mf.Items.Count は、以下のコードと一緒だから: Dim x as Integer x = 1 While x <= mf.Items.Count ' ここに処理を記述 x = x + 1 Wend 上記コードでのWhileループ終了時のxの値がいくつになるかに注目してください。

参考URL:
http://msdn.microsoft.com/en-us/library/5z06z1kb.aspx
EXVNBQQH
質問者

お礼

ありがとうございました。

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

Dim i As Integer For i = 1 To 10 Next i MsgBox i で「11」が表示されるのと同じです。 (i=11の時にループを抜けるから)

EXVNBQQH
質問者

お礼

納得しました。ありがとうございました。

関連するQ&A

  • OutLookVBA 指定のフォルダをアクティブ化

    こんばんは、よろしくお願いいたします。 OUTLOOK VBAで指定のフォルダをアクティブにするコードが分かりません。 Windows:VISTA OutLook:2007 ○.Display とすると、別ウィンドウが立ち上がってそのフォルダが表示されます。 ○.Activate とするとエラーになります。 別ウィンドウではなくアクティブフォルダが遷移する、とするにはそう すればいいでしょうか? ご指導お願いいたします。 Sub foldpl() Dim ns As NameSpace Dim mf As MAPIFolder Set ns = GetNamespace("MAPI") Set mf = ns.Folders("個人用フォルダ").Folders("送信済みアイテム") mf.Display '別ウィンドウで表示されてしまします Set mf = Nothing Set ns = Nothing End Sub

  • VBAで全ての受信トレイの数ではなく受信メールの数

    VBAで全ての受信トレイの数ではなく受信メールの数を取得する方法は? Sub めーる数() Dim myNaSp As NameSpace Dim myFolder As MAPIFolder Set myNaSp = GetNamespace("MAPI") Set myFolder = myNaSp.GetDefaultFolder(olFolderInbox) Debug.Print myFolder.Items.Count Set myNaSp = Nothing Set myFolder = Nothing End Sub このコードだと、「受信トレイ」のメールの数しか取得できません。 フォルダは画像のように、サブフォルダがあります。 この場合、全ての受信メール(受信トレイ+サブフォルダ)の数を取得するにはどうすればいいでしょう?

  • ダイレクトに目的のフォルダを指定する方法は?

    全てのフォルダをループするのではなく、 ダイレクトに目的のフォルダを指定する方法はありますか? アクセスからアウトルックの該当のフォルダの中身を取得したいのですが 下記コードで目的通り取得できるのですが コードが遠回りの気がします。 ダイレクトにフォルダを指定する方法があれば教えてください。 Sub test() Dim myNaSp As Namespace Dim myFolder As MAPIFolder Dim mySecFolder As MAPIFolder Dim myThrFolder As MAPIFolder Dim FolderName As String Dim myItem As MailItem Dim myindex As Long Set cn = CurrentProject.Connection Set myNaSp = GetNamespace("MAPI") For Each myFolder In myNaSp.GetDefaultFolder(olFolderInbox).Folders For myindex = 1 To myFolder.Items.Count Set myItem = myFolder.Items(myindex) If myFolder.Name = "testフォルダ" Then Debug.Print myItem.Body End If Next Next Set myNaSp = Nothing Set myFolder = Nothing End Sub

  • GetNamespaceで、コンパイルエラー

    アクセスからアウトルックの受信メールを操作しようとしているのですが Private Sub test1() Dim requestsFolder As MAPIFolder Dim appNameSpace As Namespace Dim requestMailItem As MailItem Dim i As Integer '受信フォルダの取得 Set appNameSpace = Application.GetNamepace("MAPI") Set requestsFolder = appNameSpace.GetDfaultFolder(olFolderInbox) ・ ・ ・ End Sub これを実行すると GetNamespaceで、コンパイルエラーになります。 Microsoft Outlook ○.○ Object Library で、アウトルックに参照設定はしているのですが アクセスからはGetNamespaceは使えないのでしょうか?

  • アウトルックが起動しているかどうかを取得するには?

    http://www.ken3.org/cgi-bin/group/vba_outlook.asp を参考に Sub Sample() Dim oApp As Outlook.Application Dim myNameSpace As Outlook.Namespace Dim myFolder As Outlook.Folder 'outlook 起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を Set oApp = CreateObject("Outlook.Application") Set myNameSpace = oApp.GetNamespace("MAPI") '作業フォルダーの指定(.GetDefaultFolder) と 表示(.Display) Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定 myFolder.display End Sub でエクセルからアウトルックを起動しているのですが 既に起動していると2個起動してしまいます。 「既に起動しているのなら起動しない」という事はできますか? 参考URLに 起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を と書いてありますが、ちょっと勘弁できませんでした笑

  • outlookの予定をexcelから読む

    Office2007を使っています。 予定作成のフロントエンドとしてoutlook、 全体の予定表の作表、印刷エンジンとしてexcel、という使い方をしたいです Dim oApp 'As Outlook.Application OutlookのApplication オブジェクトを入れる Dim myNameSpace 'As Outlook.NameSpace 名前のスペースと言われても、、 Dim myFolder 'As Outlook.Folder フォルダー指定 Dim shigoto Dim aITEM 'As Outlook.AppointmentItem '予定、アポ Set oApp = CreateObject("Outlook.Application") Set myNameSpace = oApp.GetNamespace("MAPI") Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー olFolderInbox=6 指定 Set shigoto = myFolder.Folders("予定表(仕事)") shigoto.display oApp.ActiveWindow.WindowState = 2 'olNormalWindow=2 を セット For Each aITEM In shigoto.Items 'aITEMに入っている個々の予定に対する処理 Next http://www.ken3.org/cgi-bin/group/vba_outlook.asp 上記サイトのコードで、規定の予定表にある予定オブジェクトにアクセスすることはできました これを、iCloud内の予定表に対して同じことをやりたいのですが、うまくいきません。 Set shigoto = myFolder.Folders("iCloud内の予定表(仕事)") Set shigoto = myFolder.Folders("iCloud").Folders("予定表(仕事)") などとやってみたのですが、 実行時エラー'-2147221283(8004010f)": 操作は失敗しました。オブジェクトが見つかりませんでした。 というエラーで終了です。 うまくいく方法はないでしょうか? よろしくお願いします。

  • 添付ファイルの抽出

    メール添付からpdfを抽出するために下記のVBAを使用しています。 今までは受信トレイのサブフォルダも含めていたのですが 今後は受信トレイのみにしたいのですがどこをどのように変更したらいいのか解りません。 解る方いましたら教えてください。お願いします。 Sub 抽出() Dim personalFolder As MAPIFolder Dim requestsFolder As MAPIFolder Dim object As Object Dim appNameSpace As NameSpace Dim requestMailItem As MailItem Dim mailCount As Integer Dim folderCount As Integer Dim tempCount As Integer 'ルートフォルダ取得 Set appNameSpace = Application.GetNamespace("MAPI") Set personalFolder = appNameSpace.Folders.Item(1) 'ルートフォルダ配下のループ For folderCount = 1 To personalFolder.Folders.Count 'フォルダ一覧からfolderCount件目のフォルダ取得 Set requestsFolder = personalFolder.Folders.Item(folderCount) 'フォルダに存在するメールの件数分ループ For mailCount = 1 To requestsFolder.Items.Count 'フォルダのmailCount件目のメールのタイプをチェック If TypeOf requestsFolder.Items.Item(mailCount) Is MailItem Then 'フォルダからmailCount件目のメール取得 Set requestMailItem = requestsFolder.Items.Item(mailCount) '添付ファイルの件数分ループ For tempCount = 1 To requestMailItem.Attachments.Count '添付ファイルの拡張子をチェック If Right(requestMailItem.Attachments.Item(tempCount).FileName, 3) = "pdf" Then '添付ファイルを保存 requestMailItem.Attachments.Item(tempCount).SaveAsFile _ "C:\My Documents" + "\" + requestMailItem.Attachments.Item(tempCount).DisplayName End If Next End If Next Next End Sub

  • outlookが起動してるかどうかを取得したい

    Sub Outlookが起動してないなら起動する() Dim oApp 'As Outlook.Application OutlookのApplication オブジェクトを入れる Dim myNameSpace 'As Outlook.NameSpac Dim myFolder 'As Outlook.Folder If Outlookが起動してるなら Then Exit Sub 'outlook 起動をCreateObjectで ※これだと複数起動してしまうがご勘弁を Set oApp = CreateObject("Outlook.Application") Set myNameSpace = oApp.GetNamespace("MAPI") Set myFolder = myNameSpace.GetDefaultFolder(6) '規定のフォルダー myFolder.Display '(通常サイズ olNormalWindow=2 , olMaximized=0,olMinimized=1) oApp.ActiveWindow.WindowState = 0 End Sub ///////////////////////////////////////////////////////////////// のような事がしたいのですが、 If Outlookが起動してるなら Then Exit Sub をどうすればいいのか教えていただけませんか? 当方OFFICE2007を使用しています。

  • 変数 requestsFolder に格納できない

    アウトルックvbaでこれを実行すると Sub test() Dim requestsFolder As MAPIFolder Dim appNameSpace As NameSpace Set appNameSpace = Application.GetNamepace("MAPI") Set requestsFolder = appNameSpace.GetDfaultFolder(olFolderInbox) End Sub 「実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません」 が出るのですが、何がおかしいのでしょうか?まったくわかりません。

  • OutlookVBAは他のVBAと違って入力支援は無いのですか?

    Outlook2003を使っています。 たとえば、 Public Sub AllMaildisp() Dim mlitem As NameSpace Dim fd As MAPIFolder Dim cnt As Long Set mlitem = GetNamespace("MAPI") ' 対象メールボックス Set fd = mlitem.Folders("電子メール").Folders("受信トレイ") For cnt = 1 To 3 'For cnt = 1 To fd.Items.Count Debug.Print fd.Items(cnt).Subject Debug.Print fd.Items(cnt).Body Debug.Print fd.Items(cnt).ReceivedByName Debug.Print fd.Items(cnt).ReceivedTime Debug.Print fd.Items(cnt).To Debug.Print fd.Items(cnt).CC Debug.Print fd.Items(cnt).BCC Next cnt End Sub のときにfd.Items(cnt). と入力したら、ExcelのVBAとかだとその次のプロパティの候補が表示されると思いますが表示されません。 この場合 既に書いてありますが、CC とか BCC とか Toとかだと思います。 表示する方法はありますか?

専門家に質問してみよう