outlook-vba
소개 파트 3 : 상점 및 모든 폴더
수색…
소개
이 자습서 파트 2에서 시작된 상점 및 폴더에 대한 소개를 완료합니다.
예상되는 사전 지식 :이 자습서의 파트 2를 읽었거나 이미 내용을 잘 알고 있습니다.
3. 내용
- 접근 가능한 폴더를 참조하는 방법.
- 참조 된 폴더의 전체 이름을 얻는 방법.
- 액세스 가능한 모든 상점 내의 모든 폴더를 함게 나열하는 루틴 쌍.
- 하나의 상위 폴더에서 다른 폴더로 폴더를 이동하는 루틴.
3.1 Function 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
을 기본받은 편지함으로 설정 Fldr
. 상수 olFolderInbox
는 기본 폴더에 대한 액세스 권한을 부여하는 다른 값으로 대체 할 수 있습니다. 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
를 표시합니다. 필자는 GetFldrNames(Fldr)
를 사용하여 내가 참조한 폴더가 내가 원했던 폴더인지 확인했습니다. 기본받은 편지함에 액세스하여 비어있는 것으로 나타났습니다. Store "Output data file"은 기본 설치와 함께 제공되며 Outlook은 각 이메일 계정에 대한 저장소를 생성 했으므로 무시했습니다. Outlook이 내 전자 메일 계정 중 어떤 계정이 기본 계정으로 사용할 것인지 알 수있는 방법에 대해 생각한 빈 기본받은 편지함을 발견 한 후에였습니다. 표준 Outlook 폴더 중 기본값이 없거나 기본값이 "출력 데이터 파일"내에 있습니다. 어떤받은 편지함을 기본받은 편지함으로 변경할 수는 있지만 변경하지 않으면 내 이메일 계정 중 어떤 것이 기본값으로 설정 될지 알 수 없기 때문에 조사하지 않았습니다. 모든 캘린더 항목, 할 일 등은 "Outlook 데이터 파일"내에 있으며 보관 목록에 "Outlook.pst"를 포함해야합니다.
대부분의 Outlook 개체에는 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는 상점 이름입니다. A2는 A 내의 폴더 이름입니다. A21은 A2 내의 폴더 이름이고 A213은 A21 내의 폴더 이름입니다.
여기서 무슨 일이 일어나고있는거야?
Session
에는 액세스 할 수있는 모든 상점의 목록 인 Folders
가 있습니다.
Session.Folders(integer)
는이 튜토리얼의 Part 2에서 사용했는데, 이름을 알지 못하면 순차적으로 상점을 밟을 수 있습니다. Session.Folders("A")
사용하면 이름을 알면 폴더에 액세스 할 수 있습니다.
Session.Folders("A")
폴더이며 너무 속성이 Folders
.
Session.Folders("A").Folders("A2")
사용하면 저장소 "A"내의 폴더 "A2"에 액세스 할 수 있습니다.
모든 폴더에 도달하는 데 필요한만큼 많은 Folders("x")
를 연결할 수 있습니다. 체인이 한 줄에 너무 길면 내가 가지고있는 것처럼 여러 줄에 문장을 나눌 수 있습니다.
설치 내에서 가장 깊게 중첩 된 폴더를 찾고 A, A2, A21 및 A213을 저장소 및 폴더 이름으로 바꿉니다. 필요한 경우 체인의 폴더 수를 늘리거나 줄입니다.
TestFldrChain()
을 업데이트하고 실행하면 A, A2 등이 폴더 이름으로 바뀌는 것을 제외하고는 다음과 같이 출력됩니다.
A|A2|A21|A213
3.4 액세스 가능한 모든 저장소 내의 모든 폴더 이름 나열
파트 2에서는 모든 액세스 가능 스토어와 각 상점 내의 최상위 레벨 폴더를 나열하는 방법을 보여주었습니다. 이것은 상점을 통과하는 루프와 폴더를 통한 각 상점의 루프와 관련이 있습니다. 위에서 폴더 계층 내의 임의의 깊이에서 알려진 폴더를 참조하는 방법을 살펴 보았습니다. 이 작업에는 폴더에 도달하는 데 필요한만큼 많은 Folders("x")
함께 연결하는 작업이 포함되었습니다.
이제 모든 상점 내의 모든 폴더를 깊이있게 나열하고 싶습니다. 다양한 길이의 체인을 이동해야하는이 유형의 문제를 해결하는 가장 쉬운 코딩 기술은 재귀 입니다. 다른 언어 나 도구를 사용하는 심각한 프로그래머라면 이미 재귀에 대해 알고있을 것입니다. 심각한 프로그래머가 되려는 야망이 있다면, 결국 반드시 재귀를 이해해야 할 필요는있을 것이다. "재귀"는 많은 사람들이 처음에는 파악하기 어려운 개념 중 하나입니다. 좋아하는 검색 엔진에 "재귀"를 입력하고이 개념을 설명하는 다양한 시도를 읽을 수 있습니다. 또는 이러한 매크로 작업을 수락 할 수는 있지만 작동 방법은 걱정하지 않아도됩니다.
ListStoresAndAllFolders()
의 주석에 유의하십시오. 이러한 매크로에는 "Microsoft Scripting Runtime"에 대한 참조가 필요합니다. VB 편집기 창의 맨 위에있는 탭 막대에서 도구 를 클릭 한 다음 참조 를 클릭하십시오. 사용 가능한 모든 참조 (라이브러리) 목록이 표시됩니다. 상단의 일부는 이미 체크 표시됩니다. 나머지는 영문자 순서입니다. 목록을 아래로 스크롤하고 "Microsoft Scripting Runtime"왼쪽에있는 상자를 클릭하여 눈금을 얻으십시오. 그런 다음 확인을 클릭하십시오.
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
실행하면 DeskTop에 "ListStoresAndAllFolders.txt"라는 새 파일이 생기므로 약속 된 상점 및 폴더 목록이 포함됩니다.
3.5 하나의 상위 폴더에서 다른 상위 폴더로 폴더 이동
왜 폴더를 참조하고 싶습니까? 다음 부분에서는 참조 된 폴더 내의 전자 메일에 액세스하는 방법을 보여줍니다. 여기서는 폴더 이동 방법을 보여 드리겠습니다. 내받은 편지함에 "Test"라는 폴더를 만들었습니다. TestMoveFolder()
에서 "A"를받은 편지함이 들어있는 저장소의 이름으로 TestMoveFolder()
. TestMoveFolder()
실행 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 튜토리얼의이 부분에서 기억해야 할 사항
- 기본 폴더 및이 기술의 가능한 제한 사항을 참조하는 방법.
- 접근 가능한 저장소 내의 임의의 깊이에있는 단일 폴더를 참조하는 방법.
- 참조 된 폴더의 전체 이름을 표시하는 방법
- 서브 루틴과 함수의 기본 집합을 넘어서 기능을 제공하는 많은 라이브러리를 참조하는 방법.
- 접근 가능한 모든 저장소 내의 모든 폴더 이름을 표시하는 방법.
- 부모 폴더에서 다른 폴더로 폴더를 이동하는 방법.