2009-07-10 40 views
8

Tôi đang tìm cách xóa vĩnh viễn MailMessage khỏi Outlook 2000 bằng mã VBA. Tôi muốn làm điều này mà không cần phải làm một vòng lặp thứ hai để làm trống các khoản mục đã xóa.Xóa vĩnh viễn MailMessage trong Outlook bằng VBA?

Về cơ bản, tôi đang tìm mã tương đương với phương thức giao diện người dùng để nhấp vào một thư và nhấn SHIFT + DELETE.

Có điều gì không?

Trả lời

11

Hãy thử di chuyển nó lần đầu tiên sau đó xóa nó (chỉ hoạt động trên một số patchs năm 2000) hoặc sử dụng RDO hay CDO để làm công việc cho bạn (bạn sẽ phải cài đặt chúng)

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

CDO cách

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 

bạn cũng có thể đánh dấu các thông điệp đầu tiên trước khi bạn xóa nó và thứ e vòng lặp qua các thư mục các mục đã xóa và tìm thấy nó một cuộc gọi xóa một lần thứ hai. Đánh dấu nó bằng cách sử dụng Userproperty.

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

lặp qua bạn đã xóa mục tìm kiếm userprop rằng

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

Tôi không muốn dùng CDO hoặc RDO, vì toàn bộ vấn đề ở đây là giảm độ phức tạp của mã và tôi không muốn giới thiệu tất cả các phụ thuộc mới. Thứ hai là cơ bản những gì tôi đang làm bây giờ. Lần đầu tiên tôi làm (giả): cho mỗi thư trong hộp thư đến msg.delete '// di chuyển đến các mục đã xóa next cho mỗi thư trong deletedItems msg.xóa '// xóa vĩnh viễn tiếp theo trong khi những gì tôi muốn làm, là một cái gì đó như: cho mỗi msg trong hộp thư đến msg.delete (vĩnh viễn = true) tiếp theo – eidylon

+0

Không có phương pháp như vậy vào năm 2000. Bạn sẽ phải tạo ra chức năng của riêng bạn trong VBA. Điều gì là sai với di chuyển-xóa hoặc vòng lặp của bạn? nó có hiệu quả không? – 76mel

+0

Không có gì vốn có "sai" với nó, tôi chỉ đang tìm kiếm một cách để làm sạch hơn là dựa vào hai vòng lặp. Thanks anyway anyway. – eidylon

1

Bạn có thể sử dụng các phương pháp sau đây, về cơ bản bạn xóa tất cả các tin nhắn email của bạn khi bạn đang làm, sau đó gọi một dòng này để dọn sạch thư mục các mục đã xóa. Mã này là trong JScript, nhưng tôi có thể dịch nếu bạn thực sự cần tôi :)

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 nhưng tôi sẽ sử dụng ID FindControl để đảm bảo nó hoạt động trên các phiên bản Outlook không phải tiếng Anh. – JimmyPena

1

đơn giản nhất giải pháp của tất cả, tương tự như cách thứ nhất:

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

Làm điều đó hai lần và nó sẽ được đi cho tốt, và không có vòng lặp giết chết hiệu suất. (NameSpace có thể là một biến không gian tên cụ thể, nếu không có trong kho lưu trữ mặc định.) Lưu ý điều này chỉ hoạt động nếu bạn không xóa qua các cửa hàng, có thể thay đổi EntryID hoặc loại bỏ nó hoàn toàn.

+0

Điều này sẽ chỉ hoạt động đối với một cửa hàng PST nơi id mục tin nhắn không thay đổi khi nó được chuyển đến một thư mục khác. Nó sẽ không làm việc un Exchange cửa hàng (hoặc được lưu trữ hoặc trực tuyến). –

+0

Điều này có thay đổi gần đây không? Ban đầu tôi đã làm điều này cho các hộp thư Exchange 2007. – SilverbackNet

+0

Không, đó luôn là trường hợp với các cửa hàng PST và Exchange. –

1

Tôi biết đây là một chủ đề cũ, nhưng vì gần đây tôi đã có lý do để viết một macro thực hiện điều này, tôi nghĩ rằng tôi muốn chia sẻ. Tôi thấy rằng phương pháp Remove dường như là xóa vĩnh viễn. Tôi đang sử dụng đoạn mã này:

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

Tôi bắt đầu với danh sách các mục đã được lọc theo một số tiêu chí. Sau đó, tôi chỉ cần xóa từng cái một cho đến khi nó biến mất.

HTH

+0

Tuyệt vời! Tôi xác nhận rằng nó hoạt động cho tôi. Tôi sử dụng Application.ActiveExplorer.CurrentFolder.Items.Remove (1) trên một thư mục kiểm tra trong một vĩ mô VBA. –

Các vấn đề liên quan