2012-01-22 3 views
1

Windows 7에서 Outlook 2007을 사용합니다. 최근에 iCloud를 설치했는데, Google 캘린더 동기화는 기본 캘린더 만 동기화한다는 것을 알게되었습니다. 궁금 사람은 간단한 VBA 매크로 좀 도와 수 있다면 그 것Outlook 2007 매크로를 iCloud 캘린더에서 기본 캘린더로 약속을 복사합니다.

  1. 빈 모든 약속의 기본 일정
  2. 복사

많은 기본 일정으로 iCloud에 일정의 모든 약속 감사! 이 답변에

답변

3

건강 경고

모든 것이 실험에 의해 발견되었다. VB 도움말에서 시작하여 개체 모델에 액세스하기 위해 F2를 사용하고 효과가있을 때까지 실험했습니다. 나는 매우 추천 된 참고서를 사들 였지만 발견하지 못했던 것과 내가 발견 한 것을 많이 생략 한 것은 아무 것도 중요하지 않았다.

내가 얻은 지식의 핵심 기능은 다양한 설치를 기반으로한다는 것입니다. 마주 치게되는 문제 중 일부는 설치 실수로 인해 참조 서적 작성자가 그 이유를 알 수 없었던 이유를 설명합니다.

아래 아웃룩 2003에서 테스트 된 코드는 내가 즉시 창으로 Outlook과 기본 일정에서 약속의 2007 년

출력 선택 속성을 유사한 코드를 테스트 한

당신은보고 그 첫 번째 버전 이 루틴의 오류 : "런타임 오류 '-2147467259 (80004005)': 긍정적 인 기간을 입력해야합니다."

Google에서 발견 한 웹 사이트에 따르면 오류 80004005는 시스템 파일이 손상되었음을 의미합니다.

약속에는 Start (날짜 입력), End (유형 날짜) 및 Duration (긴 형식)의 세 가지 관련 항목이 있습니다. End 또는 Duration은 런타임에 파생됩니다. 내 생각에 Duration은 음수이거나 End는 Start보다 앞에 있습니다. 내 시스템에서이 매크로로 만든 약속 목록에서 하루 종일 이벤트의 속성이 AllDayEvent = False임을 알 수 있습니다. 약속을 작성한 후 나중에 AllDayEvent를 켜거나 끄면 불일치가 발생한다는 사실을 기억합니다.

이 문제점을 감지하려고 시도했지만 시스템에서이 오류가 발생하는 약속이 없기 때문에 테스트 할 수없는 코드를 추가했습니다. 이 매크로는 현재 약속 목록으로 시작할 수 있도록 만들어 졌으므로 작업을 수행 할 수 없다면 걱정하지 마십시오.

Sub ReviewCalendar() 

    Dim DateTimeEnd As Date 
    Dim DateTimeStart As Date 
    Dim Duration As Long 
    Dim ItemMine As Object 
    Dim ItemMineClass As Long 
    Dim FolderTgt As MAPIFolder 

    Set FolderTgt = CreateObject("Outlook.Application"). _ 
        GetNamespace("MAPI").GetDefaultFolder(olFolderCalendar) 

    ' I use this macro to list selected properties from the test calendar. 
    ' Add a quote to the statement above and remove the quote from the next 
    ' statement to do the same. 
    'Set FolderTgt = CreateObject("Outlook.Application"). _ 
        GetNamespace("MAPI").Folders("Test Folders"). _ 
        Folders("Calendar") 

    For Each ItemMine In FolderTgt.Items 

    With ItemMine 

     ' Occasionally I get syncronisation 
     ' errors. This code avoids them. 
     ItemMineClass = 0 
     On Error Resume Next 
     ItemMineClass = .Class 
     On Error GoTo 0 

     If ItemMineClass = olAppointment Then 
     Debug.Print "** Subject: " & .Subject 
     Debug.Print " Created: " & _ 
         Format(.CreationTime, "d mmm yy hh:mm:ss") 
     Debug.Print " Updated: " & _ 
         Format(.LastModificationTime, "d mmm yy hh:mm:ss") 
     Debug.Print " Time: "; 
     DateTimeStart = .Start 
     If .AllDayEvent Then 
      Debug.Print "All day " & Format(.Start, "d mmm yy") 
     Else 
      On Error Resume Next 
      DateTimeEnd = .End 
      Duration = .Duration 
      On Error GoTo 0 
      If Duration <= 0 Then 
      Debug.Print " ##### Invalid duration #####" 
      End If 
      Debug.Print Format(.Start, "h:mm") & " to " & _ 
         Format(.End, "h:mm") & "(" & .Duration & _ 
         " minutes) on " & Format(.Start, "d mmm yy") 
     End If 
     ' If you remove the quote from the following statement 
     ' it will delete the appointment. 
     ' .Delete  ' Delete appointment 
     End If 
    End With 
    Next 

End Sub 

약속

의 복사를 테스트하기 위해 준비 당신이 중요한 아무것도 초래하지 않고 매크로를 테스트 할 수 있도록 테스트 폴더를 만들 좋습니다.

  1. 도구 모음에서 파일, 새로 만들기, Outlook 데이터 파일, Office Outlook 개인 폴더 파일 (.pst)을 선택합니다.
  2. 기존 PST 파일을 나열하는 창이 나타납니다. 내 시스템에는 archive.pst, Outlook이 있습니다.pst 및 Test.pst.
  3. 맨 아래에 기본 파일 이름이 선택됩니다. "Test"또는 다른 이름을 입력하십시오.
  4. (1) Outlook 탐색기 창에서 새 개인 폴더에 사용되는 이름을 선택하고 (2) 암호화 수준을 선택할 수 있도록 다른 창이 나타납니다. "Test"또는 다른 이름을 입력하십시오. (아웃룩은 당신의 이름에 "Folders"를 추가 할 것입니다.) 나는 암호화하지 않았거나 내 시스템에서 메시지를 암호로 보호하지 못했지만 그것은 선택 사항입니다.
  5. 도구 모음에서 이동, 폴더 목록을 선택하십시오. 폴더 목록이 출력 탐색기 창 위치에 나타납니다.
  6. "캘린더"폴더를 마우스 오른쪽 버튼으로 클릭 한 다음 새 폴더를 선택하십시오. 새 폴더 창이 나타납니다.
  7. "캘린더"로 이름을 입력하고 테스트 폴더를 위치로 선택하십시오.

이제 캘린더를 선택하면 "테스트 폴더에서 캘린더"가 추가 선택 항목으로 제공됩니다. 기본 일정에서

복사 약속 일정

이 매크로는 기본 달력에있는 모든 약속의 시험 일정의 복사본을 생성 테스트합니다.
한번 실행 한 다음 Calandar를 선택하고 기본 달력과 테스트 달력을 모두 선택하십시오. 두 개의 캘린더는 동일해야합니다.

경고 : 매크로를 다시 실행하면 각 약속에 대해 두 개의 복사본이 종료됩니다.

Sub CopyCalendar() 

    Dim FolderDest As MAPIFolder 
    Dim ItemCopy As AppointmentItem 
    Dim ItemMine As Object 
    Dim ItemMineClass As Long 
    Dim NameSpaceMine As NameSpace 
    Dim FolderSrc As MAPIFolder 

    Set NameSpaceMine = _ 
      CreateObject("Outlook.Application").GetNamespace("MAPI") 

    With NameSpaceMine 
    Set FolderSrc = .GetDefaultFolder(olFolderCalendar) 
    Set FolderDest = .Folders("Test Folders").Folders("Calendar") 
    End With 

    Debug.Print FolderSrc.Items.Count 
    Debug.Print FolderDest.Items.Count 

    For Each ItemMine In FolderSrc.Items 

    With ItemMine 

     ' Occasionally I get syncronisation 
     ' errors. This code avoids them. 
     ItemMineClass = 0 
     On Error Resume Next 
     ItemMineClass = .Class 
     On Error GoTo 0 

     ' I have never found anything but appointments in 
     ' Calendar but test just in case 
     If ItemMineClass = olAppointment Then 
     Set ItemCopy = .Copy 
     ItemCopy.Move FolderDest 
     End If 

    End With 

    Next 

End Sub 

다음은 Set FolderDest 문은 계층 구조를 아래로 작업하여 partcular 폴더를 선택하는 방법을 보여줍니다

단계를 반복합니다. 다른 일반적인 기술이 있지만 이러한 방식으로 iClound 캘린더에 액세스 할 수 있으면 사용자 요구 사항에 충분해야합니다.

Set NameSpaceMine = _ 
      CreateObject("Outlook.Application").GetNamespace("MAPI") 

    With NameSpaceMine 
    Set FolderDest = .Folders("Test Folders").Folders("Calendar") 
    End With 

첫번째 매크로 일정마다 약속하고 다른 한 캘린더의 제 약속 사본을 삭제하기위한 코드를 포함한다.

이 코드를 결합하여 적용하면 단방향 동기화가 가능합니다. 즉, Calendar 2를 Calendar 1의 사본으로 만듭니다. 적절한가? iCloud Calendar를 기본 달력으로 덮어 쓰는 것이 적절합니까? 양방향 동기화는 더욱 복잡합니다. 필자는 여러 "엔터프라이즈"동기화 루틴을 경험했지만 아무도 바보가 아닙니다. 만약 당신이 "가격이 비싸고 품질이 떨어지는 소프트웨어"라는 학교에서라면, 놀라지 않을 것입니다. 그렇지 않으면 양방향 동기화가 어렵거나 두 진술이 모두 사실임에 동의 할 수 있습니다.

이슈는 다음과 같습니다 하나 달력

  1. 비 식별 속성이 변경 될 수 있습니다.
  2. 캘린더에 약속을 추가하거나 삭제할 수 있습니다.
  3. 어느 캘린더에서든 속성을 식별하는 것이 변경 될 수 있습니다. 일반적으로 제목 및/또는 시작 시간은 속성을 식별하지만 제목이 변경되고 약속이 이동 될 수 있습니다.

내 시스템에서는 CreationTime과 LastModificationTime이 변경되지 않은 채로 복사되므로 식별자로 사용할 수 있습니다. 모임 요청으로 인해 업데이트되는 일정의 CreationTime 및 LastModificationTime에 대한 영향을 테스트 할 수있는 방법이 없습니다.

나는이 문제를 고려하고 앞으로 어떻게 할 것인지 결정할 것입니다.

+0

대단히 감사합니다. Outlook에 매크로를 추가 할 수 있습니다. 나는 VBA를 Excel에서 간단히 다루었습니다. 사물을 통해 생각해 보면 매크로가 iCloud 캘린더를 기본 캘린더와 동기화하는 것이 가장 바람직합니다 (즉, 기본 캘린더에서 변경하고 매크로는 iCloud 캘린더와 변경 사항을 동기화합니다). iCloud 캘린더는 Outlook에서 액세스 할 수 있으며 "iCloud의 캘린더"라고합니다. 그러나 귀하의 매크로를 실행하면 오류 메시지가 나타납니다 : 런타임 오류 '-2147467259 (80004005)': 긍정적 인 기간을 입력해야합니다. –

+0

내일 자정이되어서 내일 좀 더 코드를 살펴 보겠습니다. 기간을 읽지 않아 약속 시간이 잘못되었음을 의미합니다. 마지막 Debug.Print 문에서'.Duration &'을 삭제하고 그 줄 아래에'Debug.Print ""& .Duration'을 추가하십시오. 그러면 오류를 나타내는 약속의 날짜와 제목을 알 수 있습니다. 'Debug.Print ""& .Duration'이 에러를 내면, 줄을 주석으로 만들고, F8을 한 번 누르고, 다시 인용 부호를 제거한 다음 F5를 누릅니다. 그러면 해당 약속의 기간이 지나고 매크로가 계속 될 수 있습니다. –

+0

이 오류를 제공하는 약속이나 약속에 특별한 것이 있습니까? 설치하는 동안 Outlook 탐색기는 최상위 폴더로 '개인 폴더'와 '보관 폴더'를 제공합니다. 이 아래에는받은 편지함과 같은 하위 폴더가 있습니다. 하위 폴더는 모든 하위 수준의 하위 하위 폴더를 가질 수 있습니다. 아래에 'iCloud의 캘린더'가있는 'iCloud'와 같은 이름의 최상위 폴더가 있다고 가정합니다. 그게 뭔가? –