2009-07-10 25 views
8

Sto cercando un modo per eliminare definitivamente un MailMessage da Outlook 2000 con codice VBA. Mi piacerebbe farlo senza dover fare un secondo ciclo per svuotare gli elementi eliminati.Elimina definitivamente MailMessage in Outlook con VBA?

In sostanza, sto cercando un codice equivalente al metodo di interfaccia utente di fare clic su un messaggio e colpire SHIFT +DELETE.

Esiste una cosa del genere?

risposta

11

provare a spostarlo prima poi eliminarlo (funziona su alcuni patchs nel 2000) o utilizzare RDO o CDO per fare il lavoro per voi (si dovrà installarli)

Set objDeletedItem = objDeletedItem.Move(DeletedFolder) 
    objDeletedItem.Delete 

CDO modo

Set objCDOSession = CreateObject("MAPI.Session") 
objCDOSession.Logon "", "", False, False 
Set objMail = objCDOSession.GetMessage(objItem.EntryID, objItem.Parent.StoreID) 
objMail.Delete 

RDO

set objRDOSession = CreateObject("Redemption.RDOSession") 
objRDOSession.Logon 
set objMail = objRDOSession.GetMessageFromID(objItem.EntryID>) 
objMail.Delete 

si potrebbe anche segnare il primo messaggio prima di eliminarlo e tH Effettua un ciclo attraverso la cartella degli elementi eliminati e trova una chiamata cancellata una seconda volta. Contrassegnalo usando una Proprietà Utente.

objMail.UserProperties.Add "Deleted", olText 
objMail.Save 
objMail.Delete 

ciclo tra ti ha eliminato gli elementi cercano che userprop

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 
+0

Preferirei non andare CDO o RDO, perchè tutto il mio punto qui era quello di ridurre la complessità del codice, e io non preferirei andare introduzione di tutte le nuove dipendenze. Il secondo è fondamentalmente quello che sto facendo ora. Prima faccio (pseudo): per ogni messaggio nella posta in arrivo msg.delete '// si sposta su elementi cancellati successivo per ogni messaggio in item cancellati msg.Elimina '// è permanente prossimo mentre Quello che mi piacerebbe fare, è qualcosa di simile: per ogni msg in casella di posta msg.delete (permanente = true) prossimo – eidylon

+0

Non esiste metodo nel 2000. Dovrai creare la tua funzione in VBA. Cosa c'è di sbagliato con il move-delete o il tuo loop? è la prestazione? – 76mel

+0

Nulla di intrinsecamente "sbagliato" con esso, stavo solo cercando un modo per farlo in modo più pulito rispetto a fare affidamento su due cicli. Grazie comunque. – eidylon

1

È possibile utilizzare il seguente approccio, in sostanza si eliminano tutti i messaggi di posta elettronica, come si sta facendo, quindi chiamare questa una linea svuota la cartella degli elementi eliminati. Il codice è in JScript, ma posso tradurre se mi ha realmente bisogno di :)

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

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

+1 ma vorrei utilizzare l'ID FindControl per verificare che funzioni su versioni non inglesi di Outlook. – JimmyPena

1

soluzione più semplice di tutti, simile al primo modo:

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

farlo due volte e sarà essere andato per sempre, e nessun ciclo di uccisione delle prestazioni. (NameSpace può essere una particolare variabile dello spazio dei nomi, se non nell'archivio predefinito.) Nota: funziona solo se non si elimina tra negozi, il che può modificare il EntryID o rimuoverlo completamente.

+0

Funzionerà solo per un archivio PST in cui l'ID della voce del messaggio non viene modificato quando viene spostato in una cartella diversa. Non funzionerà un archivio di Exchange (memorizzato nella cache o online). –

+0

È cambiato di recente? Inizialmente l'ho fatto per le cassette postali di Exchange 2007. – SilverbackNet

+0

No, è sempre stato il caso con i negozi PST vs Exchange. –

1

So che questo è un thread vecchio, ma poiché recentemente ho avuto motivo di scrivere una macro che lo fa, ho pensato di condividerlo. Ho scoperto che il metodo Remove sembra essere una cancellazione permanente. Sto usando questo frammento:

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

Comincio con un elenco di elementi che sono stati filtrati da parte di alcuni criteri. Quindi, ne cancellerò uno alla volta finché non sarà scomparso.

HTH

+0

Ottimo! Confermo che funziona per me Uso Application.ActiveExplorer.CurrentFolder.Items.Remove (1) su una cartella di test in una macro VBA. –

Problemi correlati