Tworzenie własnego programu - Lekcja 1. Usunięcie duplikatów (pl-PL)

Tworzenie własnego programu - Lekcja 1. Usunięcie duplikatów (pl-PL)

Aby dobrze poznać język VBA dobrym rozwiązaniem jest napisanie programu i poznanie jego działania.

Lekcja 1. Usunięcie duplikatów.

Jeśli zastanawiacie się jak wykonać prosty program, np. usuwający duplikaty poczty przychodzącej, to zapraszam do przeczytania poniższego artykułu.

Głównymi parametrami, jakie klasyfikują obiekty typu email są:
  • Data utworzenia wiadomości
  • Nadawca (Adres SMTP)
  • Rozmiar wiadomości (wraz z załącznikami)
  • Temat wiadomości
  • Nr EntryID (indywidualny nr obiektu, posłuży do usunięcia duplikatu)
Zestawienie tych wartości i porównanie ich z ze sobą wyłoni obiekty, które będą nadawały się do usunięcia. Aby przyspieszyć proces porównania, przydatne będzie ustawienie tych wartości w porządku alfabetycznym (np. rozpoczynając od daty).
Aby przystąpić do działania należy wpierw zaznajomić się z edytorem VBA, wbudowanym w Microsoft Outlook. Uruchamiamy go poprzez skrót klawiszowy Alt+F11. Więcej na ten temat można przeczytać w tym artykule.
 
Osadzamy formę wraz z kodem (do pobrania gotowa forma) przesuwając plik myszą o rozszerzeniu .frm na miejsce drzewa projektu. Interfejs/forma składa się z dwóch plików: Plik o rozszerzeniu .frx, w którym osadzone są kontrolki użyte w projekcie oraz ich położenie. Drugi plik posiada rozszerzenie .frm, w którym zapisany jest kod VBA.
 
Następnie tworzymy Moduł Menu/Insert/Module, w którym wpisujemy kod wywołania formy:
 
Option Explicit
Sub Wywolanie()
 Kill_Duplicate.Show
End Sub
 
Aby bardziej zautomatyzować proces uruchamiania można dodać do *** menu dodatkową ikonkę wywołującą program. Artykuł dotyczący tego procesu jest umieszczony pod tym linkiem.
 
Uruchomienie powyższej procedury, spowoduje wywołanie formy (Rys.1.) składającej się z: listy elementów, *** postępu (oba z pakietu biblioteki mscomctl.ocx), trzech przycisków, checkboxa oraz etykiety, głownie stosowanej do opisów elementów wstawionych w kształtkę formy.
 

Rys.1. Ekran programu zestawiający wiadomości do porównania.
 
Poniżej przedstawiony zbiór procedur znajduje się w kodzie formy:
 
Option Explicit
Dim oFolder As MAPIFolder
Dim item As Object, i&
Dim KillItem As MailItem

Private Sub Anuluj_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize()
Dim clmX As ColumnHeader
With Lista
    Set clmX = .ColumnHeaders.Add(, , "Utworzono", .Width / 6.02)
    Set clmX = .ColumnHeaders.Add(, , "Nadawca", .Width / 4)
    Set clmX = .ColumnHeaders.Add(, , "Rozmiar [kb]", .Width / 10)
    Set clmX = .ColumnHeaders.Add(, , "Temat", .Width / 2)
    Set clmX = .ColumnHeaders.Add(, , "EntryID", .Width / 2)
    Set clmX = Nothing
End With
With Application.ActiveExplorer.CurrentFolder
    Ilosc.Caption = "Ilość 0\" & .Items.Count
    Me.Caption = Me.Caption & " " & Chr(34) & .Name & Chr(34)
    Me.Height = 309
End With
End Sub

Private Sub Czytaj_Click()
Dim item As Object, itmX As ListItem, dodany&

Delete_d.Enabled = False
Anuluj.Enabled = False
Wielkosc.Enabled = False
Lista.ListItems.Clear
dodany = 0

Set oFolder = Application.ActiveExplorer.CurrentFolder
For Each item In oFolder.Items
DoEvents
    On Error Resume Next
    Set itmX = Lista.ListItems.Add(, , item.CreationTime)
        itmX.SubItems(1) = item.SenderEmailAddress
        itmX.SubItems(2) = Format(item.Size, "# ###")
        itmX.SubItems(3) = item.Subject
        itmX.SubItems(4) = item.EntryID
        dodany = dodany + 1
    On Error GoTo 0
Ilosc.Caption = "Ilość " & dodany & "\" & oFolder.Items.Count
Next item
Set itmX = Nothing
Delete_d.Enabled = True
Anuluj.Enabled = True
Wielkosc.Enabled = True
End Sub

Private Sub Delete_d_Click()
Set oFolder = Application.ActiveExplorer.CurrentFolder
If oFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderDeletedItems) Then
Dim Pytanie
Pytanie = MsgBox("Znajdujesz się w folderze " & Chr(34) & _
        Application.ActiveExplorer.CurrentFolder.Name & Chr(34) & vbCr & _
       "Uruchomienie procedury permanentnie usunie elementy z tego folderu." & vbCr & _
       "Czy kontynuować?", vbQuestion + vbDefaultButton2 + vbYesNo, "VBATools.pl")
If Pytanie = vbNo Then Exit Sub
End If

If Lista.ListItems.Count < 1 Then MsgBox "Brak elementów do porównania", _
    vbInformation, "VBATools.pl": Exit Sub

With Progress
    .Top = 264
    .value = 0
    .max = Lista.ListItems.Count
    .Visible = True
End With

Delete_d.Visible = False
Czytaj.Visible = False
Anuluj.Visible = False
Ilosc.Visible = False
Wielkosc.Visible = False
Lista.Sorted = True
Dim ile&: ile = 0

For i = 1 To Lista.ListItems.Count - 1
DoEvents
Progress.value = i
If Wielkosc.value = True Then
    If Lista.ListItems(i) & Lista.ListItems(i).ListSubItems(1) & _
                            Lista.ListItems(i).ListSubItems(3) = _
       Lista.ListItems(i + 1) & Lista.ListItems(i + 1).ListSubItems(1) & _
                                Lista.ListItems(i + 1).ListSubItems(3) Then
       Call DeleteItem(Lista.ListItems(i).ListSubItems(4))
       ile = ile + 1
    End If
Else
    If Lista.ListItems(i) & Lista.ListItems(i).ListSubItems(1) & _
                            Lista.ListItems(i).ListSubItems(2) & _
                            Lista.ListItems(i).ListSubItems(3) = _
       Lista.ListItems(i + 1) & Lista.ListItems(i + 1).ListSubItems(1) & _
                                Lista.ListItems(i + 1).ListSubItems(2) & _
                                Lista.ListItems(i + 1).ListSubItems(3) Then
       Call DeleteItem(Lista.ListItems(i).ListSubItems(4))
       ile = ile + 1
    End If
End If
Next i

If ile > 0 Then
    MsgBox "Umieszczono w folderze " & Chr(34) & _
    Application.GetNamespace("MAPI").GetDefaultFolder(olFolderDeletedItems).Name & Chr(34) & _
    " " & ile & " wiadomości", vbExclamation, "VBATools.pl"
Else
    MsgBox "Nie znaleziono żadnych duplikatów w folderze " & oFolder.Name, _
        vbInformation, "VBATools.pl"
End If

Progress.Visible = False
Delete_d.Visible = True
Czytaj.Visible = True
Anuluj.Visible = True
Ilosc.Visible = True
Wielkosc.Visible = True
End Sub

Private Sub DeleteItem(ByVal targetItem$)
Set oFolder = Application.ActiveExplorer.CurrentFolder
    For Each item In oFolder.Items
    DoEvents
        If item.EntryID = targetItem Then item.Delete
    Next item
Set oFolder = Nothing
End Sub

Private Sub UserForm_Terminate()
Set KillItem = Nothing
Set oFolder = Nothing
End Sub
 
Proces usunięcia duplikatów poczty, umieszcza obiekty w folderze „Elementy usunięte”, skąd mogą być przeniesione na powrót do pierwotnego folderu (z wyłączeniem uruchomienia procedury w folderze „Elementy usunięte”).
 
W przypadku niedziałania kodu należy sprawdzić, czy w systemie operacyjnym posiadamy wymaganą i zarejestrowaną bibliotekę obiektów „Microsoft Windows Common Controls 6.0 (SP6)” Menu/Tools/References. Program został sprawdzony i jest kompatybilny z wersjami 2000-2007 MS Outlook.

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.
Oryginalny tekst jest zapisany pod tym adresem.
Leave a Comment
  • Please add 8 and 2 and type the answer here:
  • Post
Wiki - Revision Comment List(Revision Comment)
Sort by: Published Date | Most Recent | Most Useful
Comments
  • kam193 edited Revision 3. Comment: poprawiona literówka w tytule

Page 1 of 1 (1 items)
Wikis - Comment List
Sort by: Published Date | Most Recent | Most Useful
Posting comments is temporarily disabled until 10:00am PST on Saturday, December 14th. Thank you for your patience.
Comments
  • kam193 edited Revision 3. Comment: poprawiona literówka w tytule

Page 1 of 1 (1 items)