수색…


소개

이 자습서 파트 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 튜토리얼의이 부분에서 기억해야 할 사항

  • 기본 폴더 및이 기술의 가능한 제한 사항을 참조하는 방법.
  • 접근 가능한 저장소 내의 임의의 깊이에있는 단일 폴더를 참조하는 방법.
  • 참조 된 폴더의 전체 이름을 표시하는 방법
  • 서브 루틴과 함수의 기본 집합을 넘어서 기능을 제공하는 많은 라이브러리를 참조하는 방법.
  • 접근 가능한 모든 저장소 내의 모든 폴더 이름을 표시하는 방법.
  • 부모 폴더에서 다른 폴더로 폴더를 이동하는 방법.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow