मेरे पास एक संग्रह है जिसका उपयोग मैं String -> MailItem
मानचित्र के लिए करता हूं। मैं नक्शा भरता हूं, और जब मुझे डुप्लिकेट कुंजी मिलती है तो मैं संग्रह में आइटम को पढ़ना चाहता हूं।मुझे संग्रह से कोई आइटम क्यों नहीं मिल सकता है और इसे एक चर में संग्रहीत किया जा सकता है?
यह इतना आसान लगता है, लेकिन मैंने यह पता लगाने की कोशिश में एक घंटे से अधिक समय बिताया कि मैं स्थानीय चर में संग्रह आइटम क्यों निर्दिष्ट नहीं कर सकता। (नीचे दिए गए कोड में 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
'संग्रह 'के बजाय' CreateObject ("Scripting.Dictionary")' का उपयोग करने का प्रयास करें। शब्दकोश में मूल 'Exists() 'विधि है, इसलिए आपको' फ़ंक्शन कंटेनर() 'की आवश्यकता नहीं होगी। – omegastripes
@omegastripes मुझे पता है, लेकिन वह हिस्सा ठीक काम करता है, अन्यथा यह 'समस्या' रेखा तक नहीं पहुंच जाएगा। मुझे अतिरिक्त निर्भरता नहीं चाहिए। – TWiStErRob
मुझे यकीन नहीं है कि मैं 'Scripting.Dictionary' को एक समस्याग्रस्त निर्भरता मानता हूं - इसके लिए लक्ष्य मशीन पर उपलब्ध नहीं होने के लिए * काम * की आवश्यकता होगी। – Comintern