VBATools

Przenoszenie wielkich maili do archiwum

by on Mar.19, 2011, under Outlook, Porady

Archiwizacja w MS Outlook ogranicza się jedynie do czasowego określenia zakresu przenoszonych obiektów (rys1), z możliwością wyłączenia obiektów, których nie chcemy archiwizować. Operacje ta można wykonać ręcznie, jak i automatycznie.

Przenoszenie-wielkich-maili-do-archiwum

Rys 1. Standardowa opcja archiwizacji.

W przypadku jednak, kiedy interesuje nas opróżnienie głównego pliku bazy: Outlook.PST bez utraty pomniejszych wiadomości należy odfiltrować te, które zajmują najwięcej miejsca. Można wymusić export wiadomości podpinając ręcznie repozytorium archiwalnych wiadomości, jednakże z uwagi na dość liczną ich ilość (dobrym narzędziem do tego są foldery wyszukania) oraz ich rozproszenie w strukturze folderów (chcemy zachować ich przyporządkowanie do nazw folderów) jest to dość uciążliwe.

Aby wykonać czynność przeniesienia wiadomości „za jednym zamachem” należy zastosować kod VBA. Wywołując makro określamy ich granicę minimalną w KB (rys 3). Przedtem jednak koniecznym krokiem jest podczepienie pliku Archiwe.PST, który będzie zawierał główny folder o nazwie „Foldery archiwum”.

Kod sprawdzi do trzeciego wskazanego folderu w głąb wszystkie obiekty i odwzoruje ich strukturę przenosząc wiadomości spełniające warunek pojemności.

Option Explicit

Sub Przenoszenie_wielkich_maili_do_archiwum()
'MVP OShon from VBATools.pl
Dim olApp As Outlook.Application
Dim olNs As Outlook.Namespace
Dim destFolder As Outlook.MAPIFolder
Dim OlFolder As Outlook.MAPIFolder
Dim myFolder As Outlook.MAPIFolder
Dim myNewFolder As Outlook.MAPIFolder
Dim newProjectName$, wielkosc$

Set olApp = New Outlook.Application
Set olNs = olApp.GetNamespace("MAPI")
Set OlFolder = olNs.PickFolder
 If OlFolder Is Nothing Then Exit Sub
 If OlFolder.DefaultItemType <> 0 Then
 MsgBox "Wpisanie inf do folderu " & Chr(34) & OlFolder.Name & Chr(34) & _
 " nie jest możliwe." & vbCr & "Wybierz folder poczty!", _
 vbExclamation, " Informacja o błędzie VBATools.pl": Exit Sub
 End If

 Dim olFolderUpper As Outlook.MAPIFolder
 Dim olFolderLower As Outlook.MAPIFolder
 Dim olFolderMoreLower As Outlook.MAPIFolder
 Dim olDocelowy As Outlook.MAPIFolder

 'Set olFolder = olNs.Folders("Foldery osobiste").Folders("Skrzynka odbiorcza").Folders("VBATools")
On Error GoTo brak_arch
 Set destFolder = olNs.Folders("Foldery archiwum") 'nazwa folderu archiwum
On Error GoTo 0

newProjectName = InputBox("Podaj nazwę nowego folderu w: " & vbCr & _
Chr(34) & destFolder.Name & Chr(34), "Tworzenie nowego folderu danych", "Beckup")
If Len(Trim(newProjectName)) = 0 Then
 MsgBox "Nie podano folderu synchronizacji." & vbCr & _
 "W nim będzie odtworzona struktura folderów z wiadomościami." & vbCr & vbCr & _
 "Operacja została przerwana!", vbExclamation, "Komunikat o błędzie VBATools.pl"
 Exit Sub
End If

wielkosc = InputBox("Podaj wielkość minimalną wagi wiadomości: " & vbCr & "Wielkość 1MB = 1024" & _
vbCr & "Po zaakceptowaniu poczekaj na komunikat potwierdzający zakończenie działania makra.", _
"Przenoszenie wiadomości", "1024")

If IsNumeric(Trim(wielkosc)) = False Then
 MsgBox "Wielkość wiadomości musi być wykazana w KB." & vbCr & _
 "Dla przykładu 1MB = 1024KB." & vbCr & vbCr & _
 "Operacja została przerwana!", vbExclamation, "Komunikat o błędzie VBATools.pl"
 Exit Sub
End If

 Call Make_folder(destFolder, newProjectName)
 Call Make_folder(destFolder.Folders(newProjectName), OlFolder.Name)

 Set olDocelowy = destFolder.Folders(newProjectName).Folders(OlFolder.Name)
 Call Kopiuj_maile(OlFolder, CLng(wielkosc), olDocelowy)

 For Each olFolderUpper In OlFolder.Folders
 'Debug.Print olFolderUpper.FolderPath, olFolderUpper.Items.Count, olFolderUpper.Folders.Count
 Set olDocelowy = destFolder.Folders(newProjectName).Folders(OlFolder.Name)
 Call Make_folder(olDocelowy, olFolderUpper.Name)
 Call Kopiuj_maile(olFolderUpper, CLng(wielkosc), olDocelowy.Folders(olFolderUpper.Name))

 For Each olFolderLower In olFolderUpper.Folders
 'Debug.Print olFolderLower.FolderPath, olFolderLower.Items.Count
 Set olDocelowy = olDocelowy.Folders(olFolderUpper.Name)
 Call Make_folder(olDocelowy, olFolderLower.Name)
 Call Kopiuj_maile(olFolderLower, CLng(wielkosc), olDocelowy.Folders(olFolderLower.Name))

 For Each olFolderMoreLower In olFolderLower.Folders
 'Debug.Print olFolderMoreLower.FolderPath, olFolderMoreLower.Items.Count
 Set olDocelowy = olDocelowy.Folders(olFolderLower.Name)
 Call Make_folder(olDocelowy, olFolderMoreLower.Name)
 Call Kopiuj_maile(olFolderMoreLower, CLng(wielkosc), olDocelowy.Folders(olFolderMoreLower.Name))
 Next
 Next
 Next
 'Debug.Print destFolder.Name & "" & newProjectName

MsgBox "Wykonano proces exportu wiadomości do " & Chr(34) & destFolder.Name & Chr(34), _
 vbInformation, "VBATools.pl"
koniec:
 Set destFolder = Nothing
 Set OlFolder = Nothing
 Set olNs = Nothing
 Set olApp = Nothing
Exit Sub
brak_arch:
MsgBox "Brak podpiętego pliku " & Chr(34) & "Archive.PST" & Chr(34) & vbCr & _
 "Klikając prawym klawiszem myszy na strukturę folderów wywołaj opcję: " & Chr(34) & _
 "Otwórz plik danych.." & Chr(34) & " i ponownie uruchom procedurę.", _
 vbExclamation, "VBATools.pl"
Exit Sub
Blad:
MsgBox "Numer błędu: " & Err.Number & vbCr & _
 "Opis: " & Err.Description, vbExclamation, "VBATools.pl"
Resume koniec
End Sub

Private Sub Make_folder(parentFolder As MAPIFolder, newFolder$)
 Dim myNewFolder As MAPIFolder
 On Error GoTo dalej
 Set myNewFolder = parentFolder.Folders(newFolder)
 Exit Sub
dalej:
 On Error GoTo koniec
 Set myNewFolder = parentFolder.Folders.Add(newFolder)
 Exit Sub
koniec:
Debug.Print "Numer błędu: " & Err.Number & _
 "Opis: " & Err.Description
End Sub

Private Sub Kopiuj_maile(oFolder As MAPIFolder, oMailWaight&, destFolder As MAPIFolder)
'MVP OShon from VBATools.pl
Dim item As MailItem
Dim OlFolder As MAPIFolder
Dim OldestFolder As MAPIFolder

Set OlFolder = oFolder
Set OldestFolder = destFolder
 On Error Resume Next
 For Each item In OlFolder.Items
 'DoEvents 'przydatne podczas podpięcia paska postępu
 If item.Size > oMailWaight Then
 'Debug.Print item.Subject & " " & item.Size & " " & oMailWaight
 item.Move destFolder
 End If
 Next
Set OlFolder = Nothing
Set OldestFolder = Nothing
End Sub

Domyślnie podpowiadanym przez mechanizm folderem jest folder „Backup” (lub dowolnie podany w wywołanym przez makro oknie), jednakże, jeśli nie chcemy a był on wcale utworzony wystarczy w zapytanie wpisać nazwę: „Foldery archiwum”, a struktura folderów będzie tworzona w głównym folderze tej bazy.

Przenoszenie-wielkich-maili-do-archiwum1

Rys 2. Tworzenie folderu nadrzędnego struktury folderów wielkich plików.

Przenoszenie-wielkich-maili-do-archiwum2

Rys 3. Określenie minimalnej wielkości przenoszonych plików.

Po uruchomieniu procedury komunikat potwierdzający zakończenie umożliwia dalszą pracę z programem. Aby jednak zrealizować cel, jakim jest pomniejszenie bazy danych należy przystąpić jeszcze do minimalizacji jej objętości.

Obkurczenie pliku głównej bazy Outlooka i jednoczesne przywrócenie pierwotnej kondycji aplikacji jest jednak zależne od czynności zwanej, „kompaktowaniem”. Dostępna ona jest w we właściwościach folderu głównego:

Prawy klawisz na Foldery osobiste/Właściwości/Zaawansowane/Kompaktuj

Przenoszenie-wielkich-maili-do-archiwum3

Rys 4 Kompaktowanie bazy.

Z uwagi na brak możliwości zaprogramowania tej czynności, należy ją wykonać ręcznie, według opisanej powyżej procedury.

Makro zostało przetestowane w Outlooku 2007

 

(c) Shon Oskar – www.VBATools.pl

Wszelkie prawa zastrzeżone. Żadna część ani całość tego artykułu nie może być powielana ani publikowana bez zgody autora.
:, , , , ,

Leave a Reply