2009-07-10 3 views
8

Я ищу способ окончательного удаления MailMessage из Outlook 2000 с кодом VBA. Я бы хотел сделать это, не выполняя второй цикл, чтобы очистить элементы Deleted.Постоянно удалять MailMessage в Outlook с помощью VBA?

По существу, я ищу код эквивалентной методы UI щелчка сообщения и нажав SHIFT + DELETE.

Есть ли такая вещь?

ответ

11

Попробуйте переместить его первым затем удалить его (работает на некоторых patchs в 2000 году) или использовать RDO или CDO, чтобы сделать работу для вас (вы должны будете установить их)

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

CDO стороннюю

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 

вы также можете пометить сообщение первым, прежде чем удалить его и ю e через папку удаленных элементов и найти второй вызов для удаления dthe. Отметьте его с помощью свойства User.

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

петля через вас удаленные элементы искать этот 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

Я предпочел бы не пойти CDO или RDO, Потому что вся моя точка здесь было уменьшить сложность кода, и я предпочел бы не пойти вводя все новые зависимости. Второй - это то, что я делаю сейчас. Я сначала делаю (псевдо): для каждого сообщения в папке «Входящие» msg.delete '// перемещается к удаленным элементам next для каждого сообщения в удаленных элементах .удаление «// удаляет постоянно следующее тогда, что я хотел бы сделать, это что-то вроде: для каждого сообща в почтовом ящике msg.delete (постоянном = ИСТИНЫ) рядом – eidylon

+0

Там нет такого метода в 2000 году. Вам нужно будет создать свою собственную функцию в VBA. Что не так с перемещением-удалением или вашим циклом? это производительность? – 76mel

+0

Ничего изначально «неправильно» с ним, я просто искал способ сделать это более чисто, чем полагаться на два цикла. Спасибо в любом случае. – eidylon

1

Вы можете использовать следующий подход, в основном удалить все сообщения электронной почты, как вы сейчас делаете, то назвать эту одну линию удалите папку удаленных элементов. Код находится в JScript, но я могу перевести, если вам действительно нужно мне :)

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, но я бы использовал идентификатор FindControl, чтобы убедиться, что он работает с неанглийскими версиями Outlook. – JimmyPena

1

Простейшее решение всех, аналогично первому способу:

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

сделать это дважды, и это будет уйти навсегда, и нет цикла убийства производительности. (NameSpace может быть определенной переменной пространства имен, если не в хранилище по умолчанию.) Обратите внимание, что это работает только в том случае, если вы не удаляете по магазинам, что может изменить идентификатор EntryID или полностью удалить его.

+0

Это будет работать только в хранилище PST, где идентификатор сообщения не изменяется, когда он перемещается в другую папку. Он не будет работать в хранилище Exchange (либо в кэше, либо в Интернете). –

+0

Это изменилось недавно? Я изначально сделал это для почтовых ящиков Exchange 2007. – SilverbackNet

+0

Нет, это всегда было в случае с магазинами PST и Exchange. –

1

Я знаю, что это старая тема, но поскольку у меня недавно появилась причина написать макрос, который делает это, я думал, что поделюсь. Я обнаружил, что метод Remove является постоянным удалением. Я использую этот фрагмент:

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

Начинаю со списка элементов, отфильтрованных по некоторым критериям. Затем я просто удаляю по одному, пока он не исчезнет.

НТН

+0

Отлично! Я подтверждаю, что это работает для меня. Я использую Application.ActiveExplorer.CurrentFolder.Items.Remove (1) в тестовой папке в макросе VBA. –