我有一个收藏,我曾经有一张String -> MailItem
地图。我填写了地图,当我找到重复的钥匙时,我想阅读收藏中的物品。
这似乎很简单,但是我花了一个多小时试图弄清楚为什么我不能将Collection项分配给局部变量。(请参见PROBLEM
下面的代码)
oMailOther = cMails.Item(cMailKey)
“未设置对象变量或带块变量”
Set oMailOther = cMails.Item(cMailKey)
“所需对象”
另cMails(cMailKey)
一种形式给出相同的错误。调动暗淡没有任何区别。cMails
必须可用,因为它在方法的早期使用。请注意Debug.Print
此语句之前的那行有效。我想念什么?
Option Explicit
Option Compare Text
Public cMails As Collection
Public Sub GetOutlookAttachments()
Set cMails = New Collection
Dim oStore As Store
For Each oStore In Session.Stores
If oStore.DisplayName = "Outlook Data File" Then
ProcessFolder oStore.GetRootFolder()
End If
Next
End Sub
Private Sub ProcessFolder(oFolder As Folder)
Debug.Print oFolder.FolderPath
ProcessItems oFolder.Items
Dim oSubFolder As Folder
For Each oSubFolder In oFolder.Folders
ProcessFolder oSubFolder ' recurse
Next
End Sub
Private Sub ProcessItems(oItems As Items)
Dim oItem As Object
For Each oItem In oItems
DoEvents
If TypeOf oItem Is MailItem Then
Dim oMail As MailItem
Set oMail = oItem
Dim cMailKey As String
cMailKey = oMail.ConversationID & "-" & oMail.ConversationIndex
If Not Contains(cMails, cMailKey) Then
cMails.Add oMail.Subject, cMailKey
Else
Debug.Print cMails.Item(cMailKey)
Dim oMailOther As MailItem
PROBLEM oMailOther = cMails.Item(cMailKey)
Debug.Print cMailKey & ": " & oMailOther.Subject
End If
ElseIf TypeOf oItem Is MeetingItem Then
' ignore
Else
Debug.Print "oItem Is a " & TypeName(oItem)
End If
Next oItem
End Sub
Public Function Contains(col As Collection, key As Variant) As Boolean
Dim obj As Variant
On Error GoTo err
Contains = True
obj = col(key)
Exit Function
err:
Contains = False
End Function
我还尝试在其他地方复制类似内容Add
并进行Item
调用,并且可以正常工作。
Public Sub Test()
Set cMails = New Collection
Dim cMailKey As String
cMailKey = "hello"
cMails.Add Session.Stores.Item(1), cMailKey
Debug.Print cMails(cMailKey)
Dim oStore As Store
Set oStore = cMails(cMailKey)
Debug.Print oStore.DisplayName
End Sub
我复制了您的代码并运行了它。收集cMails
要创建的是一个集合Strings
,而不是邮件对象; 但是,oMailOther
被声明为Object
type MailItem
。
在没有Set
关键字的分配中,VB抱怨您要向对象(左侧)分配某些内容,因此应使用Set
关键字。现在,使用Set
关键字,VB抱怨右侧不是对象。
要cMails
合并邮件,请更改Add
语句,如下所示:
cMails.Add oMail, cMailKey
(即,您不添加oMail.Subject
而是整个oMail
对象。)
现在,使用Set
关键字in Set oMailOther = cMails.Item(cMailKey)
,一切正常。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句