2015-06-20 3 views
5

मेरे पास एक संग्रह है जिसका उपयोग मैं 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 
+1

'संग्रह 'के बजाय' CreateObject ("Scripting.Dictionary")' का उपयोग करने का प्रयास करें। शब्दकोश में मूल 'Exists() 'विधि है, इसलिए आपको' फ़ंक्शन कंटेनर() 'की आवश्यकता नहीं होगी। – omegastripes

+0

@omegastripes मुझे पता है, लेकिन वह हिस्सा ठीक काम करता है, अन्यथा यह 'समस्या' रेखा तक नहीं पहुंच जाएगा। मुझे अतिरिक्त निर्भरता नहीं चाहिए। – TWiStErRob

+0

मुझे यकीन नहीं है कि मैं 'Scripting.Dictionary' को एक समस्याग्रस्त निर्भरता मानता हूं - इसके लिए लक्ष्य मशीन पर उपलब्ध नहीं होने के लिए * काम * की आवश्यकता होगी। – Comintern

उत्तर

6

मैं अपने कोड की नकल की और यह भाग गया। संग्रह cMails आप बना रहे हैं Strings का संग्रह, मेल ऑब्जेक्ट्स का नहीं; हालांकि, oMailOther को Object के प्रकार MailItem के रूप में घोषित किया गया है।

Set कीवर्ड के बिना आपके असाइनमेंट में, वीबी शिकायत करता है कि आप किसी ऑब्जेक्ट (बायीं तरफ) को कुछ असाइन करना चाहते हैं और Set कीवर्ड का उपयोग करना चाहिए। अब, Set कीवर्ड के साथ वीबी शिकायत है कि दाएँ हाथ की ओर एक वस्तु नहीं है ...

मेल मदों की एक colection में cMails बनाने के लिए, Add बयान बदलने के इस प्रकार है:

cMails.Add oMail, cMailKey 

(यानी आप oMail.Subject लेकिन पूरे oMail वस्तु नहीं जोड़ते।)

अब Set oMailOther = cMails.Item(cMailKey) में Set कीवर्ड का उपयोग करें और सब कुछ ठीक काम करता है।

+0

आपने यह कैसे देखा: "तारों का संग्रह है"? ('.dd' पर '.Subject' को ध्यान में रखते हुए)। – TWiStErRob

+0

मैंने 'ओमेल' पर एक वॉच सेट किया और आइटम (ओं) का निरीक्षण किया और देखा कि वे स्ट्रिंग थे, क्योंकि अन्य ने विश्लेषण के माध्यम से नोट किया था। –

+0

यह इतना अजीब बात है कि यह "मेलइटम आवश्यक" नहीं कह सकता है, जैसे कि अधिकांश सेन भाषाएं (अमान्यकास्टएक्सप्शन, क्लासकास्ट अपवाद)। – TWiStErRob

2

oMailOther एक MailItem है, तो एक प्रश्न के बिना आप Set यह एक चर करने के लिए बताए क्या उपयोग करना चाहिए:

Set oMailOther = cMails(cMailKey) 

हालांकि अपने cMails संग्रह एक MailItem वस्तु शामिल नहीं है। इसमें केवल वे विषय होते हैं (जो ऑब्जेक्ट्स के विपरीत तार होते हैं) जिन्हें आपने पहले के साथ जोड़ा था।

स्पष्ट रूप से आपका मतलब cMails.Add oMail, cMailKey था।

1

समस्या नहीं है कि कैसे आप आइटम को पुन: प्राप्त कर रहे हैं, यह कैसे आप जोड़ रहे हैं उन्हें बताया गया है:

If Not Contains(cMails, cMailKey) Then 
    cMails.Add oMail.Subject, cMailKey 
Else 

Collection.Add के पहले पैरामीटर क्या आप संग्रह में भंडारण कर रहे हैं है - में विषय इस मामले में। आप संग्रह यहाँ से आइटम को पुनः प्राप्त करने ...

Debug.Print cMails.Item(cMailKey) 
Dim oMailOther As MailItem 
MailOther = cMails.Item(cMailKey) 
Debug.Print cMailKey & ": " & oMailOther.Subject 

कोशिश कर रहे हैं जब ... आप वस्तु ही प्राप्त करने का प्रयास कर रहे हैं। Debug.Print काम करता है क्योंकि आपके पास स्ट्रिंग्स से भरा संग्रह है।

आप MailItem का एक संग्रह की जरूरत है, तो आप इसे इस भरने की जरूरत है:

cMails.Add oMail, cMailKey 
संबंधित मुद्दे

 संबंधित मुद्दे