खोज…


परिचय

इस ट्यूटोरियल के भाग 2 में शुरू किए गए स्टोर और फोल्डर का परिचय पूरा करता है

अपेक्षित पूर्व ज्ञान : आपने इस ट्यूटोरियल के भाग 2 का अध्ययन किया है या पहले से ही इसकी सामग्री से परिचित हैं।

3. 0 सामग्री

  • किसी भी सुलभ फ़ोल्डर को कैसे देखें।
  • संदर्भित फ़ोल्डर का पूरा नाम कैसे प्राप्त करें।
  • एक रूटीन की एक जोड़ी जो हर सुलभ स्टोर के भीतर प्रत्येक फ़ोल्डर को सूचीबद्ध करेगी।
  • एक पैरेंट फ़ोल्डर से दूसरे फ़ोल्डर में जाने के लिए एक रूटीन।

3.1 फ़ंक्शन GetFldrNames () जो प्रदर्शन मैक्रो के कई के लिए आवश्यक है

इस हिस्से के भीतर कई प्रदर्शन मैक्रो को एक फ़ंक्शन की आवश्यकता होती है जिसे मैं बाद में समझाऊंगा। फिलहाल, कृपया GetFldrNames() को एक उपयुक्त मॉड्यूल पर कॉपी करें। मैं इस फ़ंक्शन का अक्सर उपयोग करता हूं और इसे रखता हूं, और अन्य इसे पसंद करते हैं जो मैं कई अलग-अलग मैक्रोज़ में उपयोग करता हूं, "ModGlobalOutlook" नामक एक मॉड्यूल में। आप ऐसा ही करना पसंद कर सकते हैं। वैकल्पिक रूप से, आप इस ट्यूटोरियल श्रृंखला के भीतर मैक्रो को अन्य सभी मैक्रो के साथ रखना पसंद कर सकते हैं; यदि आप अपना विचार बदलते हैं तो आप इसे बाद में स्थानांतरित कर सकते हैं।

Public Function GetFldrNames(ByRef Fldr As Folder) As String()

  ' * Fldr is a folder. It could be a store, the child of a store,
  '   the grandchild of a store or more deeply nested.
  ' * Return the name of that folder as a string array in the sequence:
  '    (0)=StoreName (1)=Level1FolderName (2)=Level2FolderName  ...
  
  ' 12Oct16  Coded
  ' 20Oct16  Renamed from GetFldrNameStr and amended to return a string array
  '          rather than a string
  
  Dim FldrCrnt As Folder
  Dim FldrNameCrnt As String
  Dim FldrNames() As String
  Dim FldrNamesRev() As String
  Dim FldrPrnt As Folder
  Dim InxFN As Long
  Dim InxFnR As Long

  Set FldrCrnt = Fldr
  FldrNameCrnt = FldrCrnt.Name
  ReDim FldrNamesRev(0 To 0)
  FldrNamesRev(0) = Fldr.Name
  ' Loop getting parents until FldrCrnt has no parent.
  ' Add names of Fldr and all its parents to FldrName as they are found
  Do While True
    Set FldrPrnt = Nothing
    On Error Resume Next
    Set FldrPrnt = Nothing   ' Ensure value is Nothing if following statement fails
    Set FldrPrnt = FldrCrnt.Parent
    On Error GoTo 0
    If FldrPrnt Is Nothing Then
      ' FldrCrnt has no parent
      Exit Do
    End If
    ReDim Preserve FldrNamesRev(0 To UBound(FldrNamesRev) + 1)
    FldrNamesRev(UBound(FldrNamesRev)) = FldrPrnt.Name
    Set FldrCrnt = FldrPrnt
  Loop

  ' Copy names to FldrNames in reverse sequence so they end up in the correct sequence
  ReDim FldrNames(0 To UBound(FldrNamesRev))
  InxFN = 0
  For InxFnR = UBound(FldrNamesRev) To 0 Step -1
    FldrNames(InxFN) = FldrNamesRev(InxFnR)
    InxFN = InxFN + 1
  Next

  GetFldrNames = FldrNames

End Function

3.2 एक डिफ़ॉल्ट फ़ोल्डर को संदर्भित करना

TestDefaultFldr() मैंने Fldr को डिफ़ॉल्ट इनबॉक्स में सेट किया है। निरंतर olFolderInbox को किसी भी डिफ़ॉल्ट फ़ोल्डर तक पहुंच देने वाले अन्य मूल्यों द्वारा प्रतिस्थापित किया जा सकता है। यदि आप Set Fldr = Session.GetDefaultFolder( टाइप करते हैं Set Fldr = Session.GetDefaultFolder( , VB संपादक सभी संभावित मानों की एक ड्रॉप डाउन सूची प्रदर्शित करेगा।

Sub TestDefaultFldr()

  Dim Fldr As Folder

  Set Fldr = Session.GetDefaultFolder(olFolderInbox)

  Debug.Print Join(GetFldrNames(Fldr), "|")

End Sub

मेरे लैपटॉप पर, TestDefaultFldr() Outlook data file|Inbox प्रदर्शित करता है Outlook data file|Inbox जो एक आश्चर्य के रूप में आया था। मैंने GetFldrNames(Fldr) को यह सुनिश्चित करने के लिए लिखा था कि जिस फ़ोल्डर को मैंने संदर्भित किया था, वह वही था जो मैं चाहता था। मैंने डिफ़ॉल्ट इनबॉक्स एक्सेस किया था और पाया कि यह खाली था! स्टोर "आउटपुट डेटा फ़ाइल" डिफ़ॉल्ट स्थापना के साथ आया था और मैंने इसे अनदेखा कर दिया था क्योंकि आउटलुक ने मेरे प्रत्येक ईमेल खातों के लिए एक स्टोर बनाया था। मेरे खाली डिफॉल्ट इनबॉक्स की खोज के बाद ही मैंने सोचा था कि आउटलुक को कैसे पता चलेगा कि मेरे ईमेल खातों में से कौन सा वह खाता है जो मैं डिफ़ॉल्ट के रूप में चाहता हूं। मानक आउटलुक फ़ोल्डरों में, या तो कोई डिफ़ॉल्ट नहीं है या डिफ़ॉल्ट "आउटपुट डेटा फ़ाइल" के भीतर है। यह बदलना संभव हो सकता है कि कौन सा इनबॉक्स डिफॉल्ट इनबॉक्स है, लेकिन मैंने जांच नहीं की है क्योंकि मुझे यकीन नहीं है कि अगर मैंने बदलाव किया तो मैं अपने कौन से ईमेल खातों को डिफ़ॉल्ट बनाऊंगा। बस याद रखें कि आपके सभी कैलेंडर आइटम, कार्य इत्यादि "आउटलुक डेटा फ़ाइल" के भीतर हैं और सुनिश्चित करें कि आप अपने संग्रह सूची में "Outlook.pst" शामिल हैं।

अधिकांश आउटलुक ऑब्जेक्ट में प्रॉपर्टी ParentGetFldrNames(Fldr) अपने माता-पिता तक पहुंचने की कोशिश करने से पहले एक सरणी में फ़ोल्डर का नाम रिकॉर्ड करता है। यह स्टोर तक पहुंचने तक सरणी के अंत में नाम जोड़ने से लूप करता है। स्टोर में माता-पिता नहीं होते हैं इसलिए इसे एक्सेस करने का प्रयास विफल हो जाता है। सरणी में नामों का क्रम उलट है और फिर कॉल करने वाले पर वापस आ गया है। मैंने एक प्रदर्शन योग्य स्ट्रिंग में नामों की सरणी को चालू करने के लिए Join का उपयोग किया है।

3.3 किसी भी सुलभ स्टोर के भीतर किसी भी फ़ोल्डर को संदर्भित करना

TestFldrChain() दर्शाता है कि किसी भी सुलभ स्टोर के भीतर किसी भी फ़ोल्डर को कैसे संदर्भित किया जाए:

Sub TestFldrChain()

  Dim Fldr As Folder

  Set Fldr = Session.Folders("A").Folders("A2"). _
                           Folders("A21").Folders("A213")

  Debug.Print Join(GetFldrNames(Fldr), "|")

End Sub    

TestFldrChain() : A एक स्टोर का नाम है; ए 2 ए के भीतर एक फ़ोल्डर का नाम है; ए 21 ए 2 के भीतर एक फ़ोल्डर का नाम है और ए 21 ए के भीतर एक फ़ोल्डर का नाम है।

यहाँ क्या हो रहा है?

Session में एक संपत्ति Folders जो सभी सुलभ स्टोरों की एक सूची है।

Session.Folders(integer) , जिसका उपयोग मैंने इस ट्यूटोरियल के भाग 2 में किया था, मुझे स्टोर के माध्यम से अनुक्रम में कदम रखने की अनुमति देता है जब मुझे उनके नाम नहीं पता होते हैं। Session.Folders("A") मुझे एक फ़ोल्डर का उपयोग करने की अनुमति देता है जब मुझे इसका नाम पता होता है।

Session.Folders("A") एक फ़ोल्डर है और इसमें एक संपत्ति Folders भी है।

Session.Folders("A").Folders("A2") मुझे स्टोर "ए" के भीतर फ़ोल्डर "ए 2" तक पहुंच देता है।

मैं किसी भी फोल्डर तक पहुंचने के लिए कई Folders("x") को चेन कर सकता हूं। यदि श्रृंखला एक पंक्ति के लिए बहुत लंबी है, तो आप स्टेटमेंट को कई रेखाओं में विभाजित कर सकते हैं जैसा कि मेरे पास है।

अपने इंस्टॉलेशन के भीतर सबसे गहराई से नेस्टेड फ़ोल्डर देखें और अपने स्टोर और फ़ोल्डरों के नाम से A, A2, A21 और A213 को बदलें। आवश्यकतानुसार श्रृंखला में फ़ोल्डर की संख्या को बढ़ाएँ या घटाएँ।

यदि आप TestFldrChain() अपडेट करते हैं और चलाते हैं, तो यह ए, ए 2 को छोड़कर निम्नलिखित आउटपुट देगा और इसी तरह आपके फोल्डर के नाम बदल दिए जाएंगे:

A|A2|A21|A213 

३.४ हर सुलभ स्टोर के भीतर प्रत्येक फ़ोल्डर के नाम सूचीबद्ध करना

भाग 2 में, आपको दिखाया गया था कि हर सुलभ स्टोर और प्रत्येक स्टोर के शीर्ष स्तर के फ़ोल्डरों को कैसे सूचीबद्ध किया जाए। इसमें स्टोर के माध्यम से एक लूप शामिल होता है और फिर प्रत्येक फ़ोल्डर के लिए उसके फोल्डर के माध्यम से एक लूप होता है। ऊपर आपने देखा है कि फ़ोल्डरों के पदानुक्रम के भीतर किसी भी गहराई पर किसी ज्ञात फ़ोल्डर को कैसे संदर्भित किया जाए। इसमें Folders("x") तक पहुंचने के लिए आवश्यक कई Folders("x") को एक साथ जंजीर में डालना शामिल था।

मैं अब हर फ़ोल्डर को किसी भी गहराई पर, हर दुकान के भीतर सूचीबद्ध करना चाहता हूं। इस प्रकार की समस्या को हल करने के लिए सबसे आसान कोडिंग तकनीक जहां आपको अलग-अलग लंबाई की श्रृंखलाओं को स्थानांतरित करना होगा, पुनरावृत्ति है । यदि आप किसी अन्य भाषा या उपकरण में एक गंभीर प्रोग्रामर हैं, तो आप पहले से ही पुनरावृत्ति के बारे में जान सकते हैं। यदि आप एक गंभीर प्रोग्रामर होने की महत्वाकांक्षा रखते हैं, तो आपको अंततः पुनरावृत्ति को समझने की आवश्यकता होगी, लेकिन आज जरूरी नहीं है। "पुनरावृत्ति" उन अवधारणाओं में से एक है, जो कई लोगों को पहली बार में पकड़ना मुश्किल लगता है। आप अपने पसंदीदा खोज इंजन में "पुनरावर्तन" टाइप कर सकते हैं और इस अवधारणा को समझाने के विभिन्न प्रयासों को पढ़ सकते हैं। वैकल्पिक रूप से, आप इन स्थूल कार्यों को स्वीकार कर सकते हैं लेकिन चिंता न करें कि वे कैसे काम करते हैं।

ListStoresAndAllFolders() में टिप्पणी पर ध्यान दें: इन मैक्रोज़ को "Microsoft स्क्रिप्टिंग रनटाइम" के संदर्भ की आवश्यकता है। VB संपादक विंडो के शीर्ष पर टैब बार में टूल पर क्लिक करें और फिर संदर्भ पर क्लिक करें। आपको सभी उपलब्ध संदर्भों (पुस्तकालयों) की एक सूची मिलेगी। शीर्ष पर कुछ पहले से ही टिक जाएगा। शेष वर्णमाला के क्रम में हैं। सूची को नीचे स्क्रॉल करें और टिक पाने के लिए "Microsoft स्क्रिप्टिंग रनटाइम" के बाईं ओर स्थित बॉक्स पर क्लिक करें। फिर ओके पर क्लिक करें

 Sub ListStoresAndAllFolders()

  ' Displays the name of every accessible store
  ' Under each store, displays an indented list of all its folders

  ' Technique for locating desktop from answer by Kyle:
  ' http://stackoverflow.com/a/17551579/973283

  ' Needs reference to “Microsoft Scripting Runtime” if "TextStream"
  ' and "FileSystemObject" are to be recognised

  Dim FileOut As TextStream
  Dim FldrCrnt As Folder
  Dim Fso As FileSystemObject
  Dim InxFldrCrnt As Long
  Dim InxStoreCrnt As Long
  Dim Path As String
  Dim StoreCrnt As Folder

  Path = CreateObject("WScript.Shell").SpecialFolders("Desktop")
  
  Set Fso = CreateObject("Scripting.FileSystemObject")
  Set FileOut = Fso.CreateTextFile(Path & "\ListStoresAndAllFolders.txt", True)

  With Application.Session
    For InxStoreCrnt = 1 To .Folders.Count
      Set StoreCrnt = .Folders(InxStoreCrnt)
      With StoreCrnt
        FileOut.WriteLine .Name
        For InxFldrCrnt = .Folders.Count To 1 Step -1
          Set FldrCrnt = .Folders(InxFldrCrnt)
          Call ListAllFolders(FldrCrnt, 1, FileOut)
        Next
      End With
    Next
  End With

  FileOut.Close

End Sub
Sub ListAllFolders(ByRef Fldr As Folder, ByVal Level As Long, ByRef FileOut As TextStream)

  ' This routine:
  '  1. Output name of Fldr
  '  2. Calls itself for each child of Fldr
  ' It is designed to be called by ListStoresAndAllFolders()

  Dim InxFldrCrnt As Long

  With Fldr
    FileOut.WriteLine Space(Level * 2) & .Name
    For InxFldrCrnt = .Folders.Count To 1 Step -1
      Call ListAllFolders(.Folders(InxFldrCrnt), Level + 1, FileOut)
    Next
  End With

End Sub

आपके द्वारा ListStoresAndAllFolders चलाने के बाद, आपके ListStoresAndAllFolders पर एक नई फ़ाइल होगी, जिसका नाम "ListStoresAndAllFolders.txt" होगा, जिसमें स्टोर और फ़ोल्डर्स की वादा की गई सूची होगी।

3.5 एक पैरेंट फोल्डर से दूसरे फोल्डर को ले जाना

मुझे किसी फ़ोल्डर का संदर्भ क्यों देना है? अगले भाग में मैं आपको बताऊंगा कि संदर्भित फ़ोल्डर के भीतर ईमेल का उपयोग कैसे करें। यहां मैं आपको बताऊंगा कि फ़ोल्डर को कैसे स्थानांतरित किया जाए। मैंने अपने इनबॉक्स के भीतर "टेस्ट" नाम का एक फ़ोल्डर बनाया। TestMoveFolder() , मैंने "A" को अपने इनबॉक्स वाले स्टोर के नाम से बदल दिया। चल रहा है TestMoveFolder() "हटाए गए आइटम" के लिए "परीक्षण" ले जाया गया।

Sub TestMoveFolder()

  Dim FldrDest As Folder
  Dim FldrToMove As Folder

  Set FldrToMove = Session.Folders("A").Folders("Inbox").Folders("Test")
  Set FldrDest = Session.Folders("A").Folders("Deleted Items")
  
  FldrToMove.MoveTo FldrDest

End Sub

3.6 आपको ट्यूटोरियल के इस भाग से क्या याद रखना चाहिए

  • एक डिफ़ॉल्ट फ़ोल्डर और इस तकनीक की संभावित सीमाओं का संदर्भ कैसे लें।
  • किसी भी सुलभ स्टोर में किसी भी फ़ोल्डर को किसी भी गहराई पर कैसे संदर्भित करें।
  • संदर्भित फ़ोल्डर का पूरा नाम कैसे प्रदर्शित करें।
  • कई, कई उपलब्ध पुस्तकालयों में से एक का संदर्भ कैसे दें, जो सबरूटीन्स और फ़ंक्शन के डिफ़ॉल्ट सेट से परे कार्यक्षमता प्रदान करते हैं।
  • हर एक्सेस स्टोर के भीतर हर फ़ोल्डर का नाम कैसे प्रदर्शित करें।
  • एक पैरेंट फोल्डर से दूसरे फोल्डर को कैसे मूव करें।


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow