outlook-vba
परिचय भाग 3: स्टोर और उनके सभी फ़ोल्डर
खोज…
परिचय
इस ट्यूटोरियल के भाग 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" शामिल हैं।
अधिकांश आउटलुक ऑब्जेक्ट में प्रॉपर्टी Parent
। GetFldrNames(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 आपको ट्यूटोरियल के इस भाग से क्या याद रखना चाहिए
- एक डिफ़ॉल्ट फ़ोल्डर और इस तकनीक की संभावित सीमाओं का संदर्भ कैसे लें।
- किसी भी सुलभ स्टोर में किसी भी फ़ोल्डर को किसी भी गहराई पर कैसे संदर्भित करें।
- संदर्भित फ़ोल्डर का पूरा नाम कैसे प्रदर्शित करें।
- कई, कई उपलब्ध पुस्तकालयों में से एक का संदर्भ कैसे दें, जो सबरूटीन्स और फ़ंक्शन के डिफ़ॉल्ट सेट से परे कार्यक्षमता प्रदान करते हैं।
- हर एक्सेस स्टोर के भीतर हर फ़ोल्डर का नाम कैसे प्रदर्शित करें।
- एक पैरेंट फोल्डर से दूसरे फोल्डर को कैसे मूव करें।