2017-04-20 1 views
0

Ceci est ma première question sur StackExchange jamais :-) Je suis en cours d'exécution le script suivant dans MS Outlook VBAComment puis-je faire mon script VBA d'Outlook plus efficace

Sub export() 

    On Error resume Next 

    Dim Ns As Outlook.NameSpace 
    Dim eitem 
    Dim oFile As Object 
    Dim fso As Object 

    Set Ns = Application.GetNamespace("MAPI") 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set oFile = fso.CreateTextFile("C:\Users\chakkalakka\Desktop\mails.txt") 

    'Code 
    For Each eitem In Ns.Session.Folders.Item(12).Items 
     oFile.WriteLine eitem.SenderName & "§" & eitem.SentOnBehalfOfName & "§" & eitem.ReceivedTime 
    Next 

    oFile.Close 
    Set Ns = Nothing 
    Set fso = Nothing 
    Set oFile = Nothing 

    Debug.Print "Completed!" 

End Sub 

Le script en général fonctionne bien et la sortie est correcte. Mon problème est le suivant: J'ai besoin d'exécuter ceci dans un dossier avec> 95000 articles et cela prend des âges.

Alors ma question est: Que puis-je faire pour améliorer les performances?

Merci d'avance pour votre aide

+0

Combien de temps cela prend-il réellement? Veuillez enlever la partie 'On Error resume Next' pour voir s'il y a des erreurs causant du retard. Si oui, publiez les messages d'erreur ici. –

+0

Affectez la collection 'Items' à une variable locale. Cela évite de réévaluer la chaîne d'objets complète dans la boucle 'For Each'. –

+0

On Error Resume Next ne doit être utilisé que s'il existe un but spécifique pour contourner une erreur, puis désactivé avec On Error GoTo 0. Voir http://stackoverflow.com/questions/31753201/vba-how-long-does- on-error-resume-next-work/31753321 # 31753321 et http://stackoverflow.com/questions/29390673/error-handling-in-vba-on-error-resume-next/29390944#29390944 – niton

Répondre

0

La ligne la plus inefficace du code est la suivante:

For Each eitem In Ns.Session.Folders.Item(12).Items 

Vous devez briser la chaîne des appels de méthode et de propriété et les déclarer sur des lignes distinctes. Ainsi, chaque propriété ou méthode sera déclarée sur une ligne de code distincte. Ainsi, vous serez en mesure de libérer instantanément les objets COM sous-jacents. Définissez une variable à Nothing en Visual Basic pour libérer la référence à l'objet.

L'écriture de tous les éléments dans le dossier est une tâche fastidieuse. Au lieu de cela, je suggère d'utiliser les méthodes Find/FindNext ou Restrict de la classe Items pour traiter les éléments qui correspondent à vos conditions. En savoir plus sur ces méthodes dans les articles suivants:

vous pouvez également envisager d'utiliser la méthode GetTable de la classe de dossier qui permet d'obtenir un objet Table qui contient des éléments filtrés par Filter. Si Filter est une chaîne vide ou que le paramètre Filter est omis, GetTable renvoie un Table avec des lignes représentant tous les éléments du dossier.