尝试为Oulook365中的重复电子邮件运行VBA代码时出现运行时错误438



我正在尝试编写一个代码来查找重复的电子邮件。我在网上找到了一个片段,并尝试使用它。

它在一些Outlook文件夹上工作正常,在一些文件夹上它会给我运行时错误438。由于我不懂VBA,我无法解决这个问题。

我收到这条线上的错误:

strKey = objItem.Subject & "," & objItem.Body & "," & objItem.SentOn

你能就如何纠正这个错误给我建议吗?

这是代码:

Sub RemoveDuplicateItems()
Dim objFolder As Folder
Dim objDictionary As Object
Dim i As Long
Dim objItem As Object
Dim strKey As String
Set objDictionary = CreateObject("scripting.dictionary")
'Select a source folder
Set objFolder = Outlook.Application.Session.PickFolder
If Not (objFolder Is Nothing) Then
For i = objFolder.Items.Count To 1 Step -1
Set objItem = objFolder.Items.Item(i)
Select Case objFolder.DefaultItemType
'Check email subject, body and sent time
Case olMailItem
strKey = objItem.Subject & "," & objItem.Body & "," & objItem.SentOn
'Check appointment subject, start time, duration, location and body
Case olAppointmentItem
strKey = objItem.Subject & "," & objItem.Start & "," & objItem.Duration & "," & objItem.Location & "," & objItem.Body
'Check contact full name and email address
Case olContactItem
strKey = objItem.FullName & "," & objItem.Email1Address & "," & objItem.Email2Address & "," & objItem.Email3Address
'Check task subject, start date, due date and body
Case olTaskItem
strKey = objItem.Subject & "," & objItem.StartDate & "," & objItem.DueDate & "," & objItem.Body
End Select
strKey = Replace(strKey, ", ", Chr(32))
'Remove the duplicate items
If objDictionary.Exists(strKey) = True Then
objItem.Delete
Else
objDictionary.Add strKey, True
End If
Next i
End If
End Sub
Dim objItem As Object

对此objItem对象进行的任何成员调用都将被延迟绑定。也就是说,在运行时解决。也就是说,编译器不知道objItem.Whatever是否有效,也不在乎(yay late-binding!(。不幸的是,这也意味着它对您没有帮助,如果您在运行时调用VBA在该对象上找不到的成员,则会在何时以及如何引发错误438"找不到该成员"。

一种解决方案是仔细查看您在哪个Case分支中呼叫的成员。

另一种解决方案可能是,一旦您知道要处理的类型,就切换到早期绑定,并返回到编译时安全性-引用了Outlook类型库,编译器已经知道Outlook类型是什么。

此外,对于循环的每次迭代,Select Case objFolder.DefaultItemType都是常量,您需要更改它。使用TypeOf...Is,您可以根据编译时类型验证objItem对象的运行时类型:

Select Case True
Case TypeOf objItem Is Outlook.ContactItem
'...
Case TypeOf objItem Is Outlook.TaskItem
'...
Case TypeOf objItem Is Outlook.AppointmentItem
'...
Case TypeOf objItem Is Outlook.MailItem
Dim currentMailItem As Outlook.MailItem
Set currentMailItem = objItem '<~ cast the object to MailItem
strKey = currentMailItem.Subject & "," & currentMailItem.Body & "," & currentMailItem.SentOn

我对Outlook对象模型不是很熟悉,但看起来Task也是MailItem,所以子句的顺序可能很重要(首先测试更具体的类型,最后测试更广泛的包罗万象的类型(。

最新更新