2017-06-21 3 views
1

Kann jemand darauf hinweisen, was ich hier fehlt. Jedes Mal, wenn ich das starte, wird ein Objekt benötigt.Outlook Graf E-Mails als wichtig markieren

Ich entschuldige mich Ich fühle mich wie das ist eine sehr einfache Lösung, aber ich habe für eine Weile mein Gehirn zerstört.

Grundsätzlich, was ich versuche zu erreichen ist zählen, wie viele E-Mails sind als hohe Bedeutung markiert.

Wieder fühle ich mich wie das ist so ein einfacher Fehler, aber ich lerne immer noch dies.

Sub CheckForImportance() 

Dim myNs As Outlook.NameSpace 
Dim infldr As Outlook.Folder 
Dim impMail As Outlook.MailItem 
Dim ttlcount As Integer 

Set myNs = Application.GetNamespace("MAPI") 
Set infldr = myNs.GetDefaultFolder(olFolderInbox) 
Set impMail = infldr.Items 
Set ttlcount = 0 

If impMail.Importance = olImportanceHigh Then ttlImp = ttlImp + 1 

MsgBox ("count:" & ttlImp) 

End Sub 
+0

sein Sie sagen nicht, welche Anweisung den Fehler gibt, damit ich mich zu erwähnen, die offensichtlichen Probleme begrenzen. (1) Der standardmäßige Posteingang ist wahrscheinlich nicht der gewünschte Posteingang. Sie müssen wahrscheinlich explizit sein. (2) 'infldr.Items' ist eine Sammlung von MailItems, nicht ein MailItem. Du brauchst so etwas wie 'Für jeden impMail In infldr.Items'' Prüfe auf wichtige Postsendungen' 'Weiter'. –

+0

Sie haben auch Ihre 'ttlcount'- und' ttlImp'-Variablen gemischt. Aber das größte Problem ist das Fehlen einer For-Schleife. – finjo

+0

Ja Entschuldigung, ich bin noch ziemlich neu dazu und lerne. Das ist, was ich nach dem ganzen Tag versucht habe. Wie für die for-Schleife würde nicht eine Einschränkung oder ein Filter besser funktionieren? Ich bin mir nicht ganz sicher, wie Schleife, dass bis auf .. 'für jedes Element in folder.item' ' wenn item = Bedeutung (olimportanthigh) dann '' ttlcount = ttlcount +1 '' next' Entschuldigung, das ist ein wirklich grober Entwurf dessen, wie ich denke, dass es aussehen würde. – Jonboy89

Antwort

0

Outlook speichert Postsendungen, Kalendereinträge, Aufgaben und so weiter in Dateien nennt es Stores. Manchmal werden Postsendungen usw. in PST-Dateien gespeichert, was normalerweise der Fall ist. Alle PST-Dateien sind jedoch Speicher, aber nicht alle Speicher sind PST-Dateien.

Ich erinnere mich, als der Standardwert für Nachrichten war, die an eine Ihrer E-Mail-Adressen gesendet wurden, um in denselben Shop geladen zu werden. In dieser Situation war Set infldr = myNs.GetDefaultFolder(olFolderInbox) nützlich, da sich der standardmäßige Posteingang in diesem einen Geschäft befand.

Mit Outlook 2016 und vielleicht einigen anderen aktuellen Versionen ist der Standard ein separater Speicher für jede E-Mail-Adresse. Jeder dieser Speicher ist nach der E-Mail-Adresse benannt, zum Beispiel: "[email protected]" oder "[email protected]".

Kopieren Sie diesen Makro zu einem Outlook-Modul und führen Sie es:

Sub DsplUsernameOfDefaultStore() 

    Dim NS As Outlook.NameSpace 
    Dim DefaultInboxFldr As MAPIFolder 

    Set NS = CreateObject("Outlook.Application").GetNamespace("MAPI") 
    Set DefaultInboxFldr = NS.GetDefaultFolder(olFolderInbox) 

    Debug.Print DefaultInboxFldr.Parent.Name 

End Sub 

Auf meinem System, das Makro gibt „Outlook-Datendatei“. Dies war der Standardspeicher, der mit Outlook geliefert wurde, aber keine meiner E-Mails wurde darauf geladen.

Sie müssen so etwas wie:

Set infldr = Session.Folders("Xxxx").Folders("Inbox") 

wobei XXXX der Name des Ladens ist mit dem Posteingang Sie abfragen möchten.

Im Folgenden habe ich drei alternative Makros, die die Anzahl der wichtigen E-Mails in einem Posteingang zählen. Punkte der besonderen Anmerkung:

  • Version 1 verwendet eine For Each Schleife, wie ich in meinem Kommentar vorgeschlagen. Version 2 verwendet eine For IndexVariable-Schleife. Meines Wissens nach hat keiner der beiden Typen von For einen Vorteil gegenüber dem anderen. Ich benutze, je nachdem, was für die Aufgabe bequemer erscheint. Version 3 verwendet einen Filter. Ich habe den Outlook-Filter nicht oft genug benutzt, um Experte in seiner Verwendung zu werden, deshalb verwende ich normalerweise eine For-Schleife. olImportanceHigh ist eine Konstante mit einem Wert von 2. Es scheint, dass Sie keine Konstante innerhalb einer Restrict Zeichenfolge verwenden können, weshalb es [Importance] = 2 heißt.
  • Ich finde Debug.Print viel bequemer als MsgBox während der Entwicklung.

Komm zurück mit Fragen über meinen Code wie nötig.

Option Explicit 
Sub CountHighImportanceEmails1() 

    Dim FldrInbox As Folder 
    Dim MailItemCrnt As MailItem 
    Dim NumEmailsHighImport As Long 

    Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox") 

    NumEmailsHighImport = 0 
    For Each MailItemCrnt In FldrInbox.Items 
    If MailItemCrnt.Importance = olImportanceHigh Then 
     NumEmailsHighImport = NumEmailsHighImport + 1 
    End If 
    Next 

    Debug.Print "Number of high importance emails=" & NumEmailsHighImport 

End Sub 
Sub CountHighImportanceEmails2() 

    Dim FldrInbox As Folder 
    Dim InxMi As Long 
    Dim NumEmailsHighImport As Long 

    Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox") 

    NumEmailsHighImport = 0 
    With FldrInbox 
    For InxMi = 1 To .Items.Count 
     If .Items(InxMi).Importance = olImportanceHigh Then 
     NumEmailsHighImport = NumEmailsHighImport + 1 
     End If 
    Next 
    End With 

    Debug.Print "Number of high importance emails=" & NumEmailsHighImport 

End Sub 
Sub CountHighImportanceEmails3() 

    Dim FldrInbox As Folder 
    Dim MailItemsHighImport As Items 

    Set FldrInbox = Session.Folders("Xxxx").Folders("Inbox") 

    Set MailItemsHighImport = FldrInbox.Items.Restrict("[Importance] = 2") 

    Debug.Print "Number of high importance emails=" & MailItemsHighImport.Count 

End Sub 
+0

Danke für die verschiedenen Methoden Ich konnte dies mit etwas ähnlich wie Optionen 1 tun. Ist debug.print schneller als MsgBox? – Jonboy89

+1

Mit 'MsgBox' müssen Sie die Nachricht lesen und aufzeichnen, bevor Sie die Eingabetaste drücken. Mit 'Debug.Print' wird die Ausgabe in das Direktfenster geschrieben. Das Direktfenster enthält ungefähr 200 Zeilen, die nach Beendigung des Makros oder mit Hilfe von Haltepunkten untersucht werden können. Wenn 200 Zeilen nicht für alle erforderlichen Diagnoseinformationen ausreichen, schreibe ich in eine Textdatei. –

0

Beispiel würde

Option Explicit 
Public Sub Example() 
    Dim Inbox As Outlook.folder 
    Set Inbox = Application.Session.GetDefaultFolder(_ 
            olFolderInbox) 

    Dim Filter As String 
     Filter = "[Importance] = 2" 

    Dim Items As Outlook.Items 
    Set Items = Inbox.Items.Restrict(Filter) 

    Debug.Print Items.Count 
    MsgBox Items.Count & " High importance Items are in " & Inbox.Name 

End Sub