10
votes

Supprimer définitivement MailMessage dans Outlook avec VBA?

Je cherche un moyen de supprimer définitivement un mailMessage à partir de Outlook 2000 avec le code VBA. Je voudrais faire cela sans avoir à faire une seconde boucle pour vider les objets supprimés.

Essentiellement, je cherche un code équivalent à la méthode UI de cliquer sur un message et de frapper shift + Supprimer . .

Y a-t-il une telle chose?


0 commentaires

5 Réponses :


14
votes

Essayez de le déplacer Tout d'abord, supprimez-le (fonctionne sur certains correctifs en 2000) ou utilisez RDO ou CDO pour effectuer le travail pour vous (vous devrez les installer)

 Set objDeletedFolder = myNameSpace.GetDefaultFolder(olFolderDeletedItems)
    For Each objItem In objDeletedFolder.Items
        Set objProperty = objItem.UserProperties.Find("Deleted")
        If TypeName(objProperty) <> "Nothing" Then
            objItem.Delete
        End If
    Next


4 commentaires

Je préférerais ne pas aller Cdo ou RDO, parce que tout mon point ici était de réduire la complexité du code et je préférerais ne pas continuer à présenter toutes les nouvelles dépendances. Le second est basicaly ce que je fais maintenant. Je suis d'abord (pseudo): pour chaque msg dans la boîte de réception msg.delete '// passe aux éléments supprimés suivant pour chaque msg dans deleteditems msg.delete' // supprime de manière permanente ensuite alors que je voudrais faire, c'est quelque chose comme: Pour chaque msg dans la boîte de réception msg.delete (permanent = vrai) suivant


Il n'y a pas de telle méthode en 2000. Vous devrez créer votre propre fonction dans VBA. Quel est le problème avec la suppression du geste ou votre boucle? est-ce la performance?


Rien de "faux" avec elle, je cherchais juste une façon de le faire plus proprement que de compter sur deux boucles. Merci quand même cependant.


Pour RDO, vous pouvez remplacer la ligne objrdosession.logon avec objrdosession.mapiObject = Application.SessionN.mapiObject



1
votes

Vous pouvez utiliser l'approche suivante, fondamentalement, vous supprimez tous vos e-mails comme vous le faites actuellement, puis appelez cette ligne pour vider le dossier Éléments supprimé. Le code est dans Jscript, mais je peux traduire si vous avez vraiment besoin de moi pour :)

var app = GetObject("", "Outlook.Application"); //use new ActiveXObject if fails

app.ActiveExplorer().CommandBars("Menu Bar").Controls("Tools").Controls('Empty "Deleted Items" Folder').Execute();


1 commentaires

+1 Mais j'utiliserais l'ID de FindControl pour vous assurer qu'il fonctionne sur des versions non-anglais d'Outlook.



2
votes

solution la plus simple de tous, semblable à la première voie:

  FindID = deleteme.EntryID
  deleteme.Delete
  set deleteme = NameSpace.GetItemFromID(FindID)
  deleteme.Delete


3 commentaires

Cela ne fonctionnera que pour un magasin PST uniquement où l'ID de saisie de message n'est pas modifié lorsqu'il est déplacé vers un dossier différent. Il ne fonctionnera pas le magasin d'échange UN ONU (mis en cache ou en ligne).


Cela a-t-il changé récemment? Je l'ai initialement fait pour les boîtes aux lettres Exchange 2007.


Non, c'est toujours le cas avec les magasins PST VS Exchange.



2
votes

Je sais que c'est un vieux fil, mais depuis que j'ai récemment eu raison d'écrire une macro qui fait cela, je pensais que je partageais. J'ai trouvé que la méthode Supprimer semble être une suppression permanente. J'utilise cet extrait:

While oFilteredItems.Count > 0
    Debug.Print "   " & oFilteredItems.GetFirst.Subject
    oFilteredItems.Remove 1
Wend


1 commentaires

Super! Je confirme que cela fonctionne pour moi. J'utilise application.activeexplorer.currentFolder.items.remove (1) sur un dossier de test dans une macro VBA.



1
votes

Récemment, je devais supprimer de manière permanente tous les contacts. Cela a fonctionné pour moi (Outlook 2016). Vous avez obtenu une nouvelle référence à l'élément du dossier corbeille, sinon il est indiqué "déjà supprimé" ou quelque chose comme ça. Allez-y de la fin et les articles récemment déplacés seront là. Ensuite, appeler Supprimer obtient la suppression permanente. Cet extrait peut être utilisé dans une boucle.

    myContacts(i).Move (trashFolder)
    trashCount = trashFolder.Items.Count
    For j = trashCount To 1 Step -1
        Set trashItem = trashFolder.Items(j)
        If trashItem.MessageClass = "IPM.Contact" Then
            trashItem.Delete
        Else
            Exit For
        End If
    Next


0 commentaires