Mam kolekcję, której używam, aby mieć mapę String -> MailItem
. Wypełniam mapę, a kiedy znajdę zduplikowany klucz, chcę przeczytać przedmiot w Kolekcji.Dlaczego nie mogę uzyskać elementu z kolekcji i zapisać go w zmiennej?
Wydaje się to łatwe, ale spędziłem ponad godzinę próbując dowiedzieć się, dlaczego nie mogę przypisać elementu kolekcji do zmiennej lokalnej. (Patrz PROBLEM
w kodzie poniżej)
oMailOther = cMails.Item(cMailKey)
"obiekt Zmienna lub zmienna bloku nie ustaw"
Set oMailOther = cMails.Item(cMailKey)
"Object required"
Drugi cMails(cMailKey)
forma daje ten sam błąd. Przenoszenie Dim wokół nie robi żadnej różnicy. cMails
musi być dostępny, ponieważ jest używany wcześniej w metodzie. Zwróć uwagę na linię Debug.Print
tuż przed tym stwierdzeniem, , która działa pod numerem. czego mi brakuje?
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
Próbowałem też powtórzyć podobny Add
i Item
połączenia gdzie indziej i działa.
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
Spróbuj użyć 'CreateObject (" Scripting.Dictionary ")' zamiast 'Collection'. Słownik ma natywną metodę '.Exists()', więc nie będziesz potrzebować 'funkcji zawiera()'. – omegastripes
@ Homegastripes Wiem, ale ta część działa dobrze, w przeciwnym razie nie dotarłaby do linii 'PROBLEM'. Nie chcę dodatkowych zależności. – TWiStErRob
Nie jestem pewien, czy uznałbym 'Scripting.Dictionary' za problematyczną zależność - wymagałoby to pracy * nie * by była dostępna na maszynie docelowej. – Comintern