Makra - książka adresowa

Pytania, uwagi, problemy związane z Microsoft Office Outlook, wersje 2007, 2010, 2013 i 2016.

Moderator: Moderatorzy

Makra - książka adresowa

Postprzez Fen » Pt 16.01.2009 07:25

Witam ,

z uwagi na fakt pierwszego posta witam wszystkich forumowiczów. Mam kilka pytań do Was :

1.Czy jest możliwe stworzenie makra w VB , które by sprawdzało książkę adresową (ma ona w sobie już około 200 rekordów) pod kątem adresów z grupy : ... @abc.pl lub ... @abc.xyz.pl ?

2.Jeśli tak to czy to samo makro może zamieniać w/w domeny na podaną domene przez usera outlooka , a następnie wszystko ładnie zapisać w jego książce adresowej ?

Szukałem podobnego tematu na tym forum , ale nie znalazłem :/ wszystkie na jakie trafiłem dotyczyły folderów , a nie mam bladego pojęcia na temat pisania makr w Visualu.

Z góry dziękuje za pomoc.
Pozdrawiam
Fen
 
Posty: 4
Dołączył(a): Pt 16.01.2009 07:14

Re: Makra - książka adresowa

Postprzez OShon » Pt 16.01.2009 13:17

np tak

Kod: Zaznacz cały
Sub zamiana_domen()
Dim oContact As ContactItem
Dim oContactFolder As MAPIFolder
Dim x As Long, item As Object

'domyślny katalog folderów
Set oContactFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)

For x = 1 To oContactFolder.Items.Count
Set oContact = oContactFolder.Items(x)
        DoEvents
            If Not oContact Is Nothing Then
                With oContact
'zamiast "gmail" należy wpisać domene do zamiany
'zamiast "@abcdef.com" nalezy wpisać nowa domenę z małpą na początku
                    If .Email1Address Like "*gmail*" Then
                        .Email1Address = Split(.Email1Address, "@")(0) & "@abcdef.com"
                        Debug.Print .FullName & " -> adres zamieniamy z: "; .Email1Address & " -> na: " & _
                                    Split(.Email1Address, "@")(0) & "@abcdef.com"
                        .Save
                    End If
                End With
            End If
Next
Set oContact = Nothing
Set oContactFolder = Nothing
End Sub
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10272
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Re: Makra - książka adresowa

Postprzez Fen » Pt 16.01.2009 20:53

Witam ,

bardzo dziękuje za pomoc. Postaram się trochę jeszcze zmienić ten kod tak by user outlooka po uruchomieniu makra mógł podać szukana domenę w jednym okienku (tu chyba będzie trzeba zastosować InputBox-a ze stringiem , z tego co udało mi się wyszukać i zrozumieć) i w drugim okienku tą na , którą będzie zamieniać . Mam nadzieje , że mi się uda to zrobić z pomocą googlaki :P

Tak czy siak kod zostanie zamieszczony i poddany Waszej ocenie :D

Jeszcze raz dziękuje i pozdrawiam.
Fen
 
Posty: 4
Dołączył(a): Pt 16.01.2009 07:14

Re: Makra - książka adresowa

Postprzez OShon » Pt 16.01.2009 21:27

Jeśli chodzi o imputboxa, to help wbudowany w VBA jest wystarczający.
Ważne aby zadeklarować wszystkie zmienne i aby one w przypadku przekazania parametru nie odnosiły się do tej samej nazwy.

Możesz też pokusić się o zbudowanie formy, gdzie umieścisz obok siebie ładne okienka z opisami do pisania obu danych.
Pamiętaj jednak o tym aby do jednego ze stringów dodać znak @, bo on właśnie jest zapoznawany w podziale funkcją split()
(rys)

Nie zapomnij w obu przypadkach zbudować obsługę błędu, polegającą na tym aby uchronić użytkownika przed brakiem podania jakiejkolwiek wartości - jak i wartości bez kropki w domenie (i brakiem litery po kropce i przed kropką). Dość łatwo zrobić sobie kuku ... a tego nie chcemy.

Lubie własną inicjatywę - do dzieła ! :]
Załączniki
zamiana_domen.jpg
zamiana_domen.jpg (10.64 KiB) Przeglądane 5234 razy
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10272
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Re: Makra - książka adresowa

Postprzez Fen » Wt 10.02.2009 07:29

Witam ,

trochę czasu mi zajęło ogarnięcie tematu :D a w międzyczasie zmieniły się nieco wymagania co do makra i znów mam problem :( . Mam taki kod z kilkoma błędami których nie mogę przeskoczyć :

Kod: Zaznacz cały
Sub zamiana_adresow(j.kowalski@ulica.pl, j.kowalski@ad-res.pl)

Dim oContact As ContactItem
Dim oContactFolder As MAPIFolder

Dim x As Long, Item As Object

'domyślny katalog folderów
Set oContactFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)

Open ThisWorkbook.Path & "/moj_plik_z_adresami.txt" For Input As #1
   wiersz = 0

   Do While Not EOF(1)
       Line Input #1, Data

'szukany adres w książce | adres w pliku.txt na który bedziemy zamieniac
    zamiana_adresow(split(.Email1Address, "|")(0),split(.Email1Address, "|")(1))

       ActiveCell.Offset(wiersz, 0) = Data
       wiersz = wiersz + 1
   Loop

   Close #1


Owe makro miało wczytać plik txt z adresami email ( i niby tak robi ) , ale nie wiem jak napisać część kodu odpowiadającą za porównanie i zamianę adresów co są w *.txt z adresami w "książce adresowej" w Outlook-u. Porównanie odbywa się przez sprawdzenie pierwszej części adresu go znaku "@" , jeśli znajdzie sie odpowiednik w "książce adresowej" to makro ma zamienić ten adres na adres z pliku *.txt np. : w pliku *.txt jest 1) "j.kowalski@ad-res.pl" , a w "książce adresowej" 2) "j.kowalski@ulica.pl" i makro mi zamienia te adresy. Do zamiany jest około 30-40 adresów z różnych domen.

Będę bardzo wdzięczny za pomoc.
Pozdrawiam
Fen
 
Posty: 4
Dołączył(a): Pt 16.01.2009 07:14

Re: Makra - książka adresowa

Postprzez OShon » Wt 10.02.2009 11:11

No to już prostuje bo "wiele tego skakania" w nim jest.
  • Procedura nie może zaczynać się od
    Kod: Zaznacz cały
    Sub zamiana_adresow(j.kowalski@ulica.pl, j.kowalski@ad-res.pl)
    W nawiasach określa się parametry przekazane ro procedury lub w większości do funkcji.
    Nie można umieszczać w nim małp czy kropek, a "," określa następną zmienną parametru.
    Jeśli chcesz wstawić komentarz powinieneś zrobić wstawiając " ' " przed linią komentarzu.
    Kod: Zaznacz cały
    Sub zamiana_adresow() 'j.kowalski@ulica.pl, j.kowalski@ad-res.pl)
    Function zamiana_adresow(adres As String)

    Jeśli faktycznie chciałeś przekazać parametr to lepiej określić kod jako Funkcje a nie Procedurę (Function nie Sub) gdzie wcześnie określony parametr zmienną będzie wywoływał otwarcie pliku txt, przekazanie parametru i zwrócenie znalezionego odpowiednika dzielonego splitem.
  • Splitem dzieli się stringa (wyraz bądź kilka wyrazów) oddzielającym go kwantyfikatorem. Ty poza tym że wprowadzasz 2ie zamienne do "zamiana_adresow" co powinno być funkcją, jest niekonieczne. Powinieneś wprowadzić 1 zamienną a otrzymać zwrot innej zamiennej funkcją.
  • Wszystko pięknie jednakże co robi Obiekt Excela w Outlooku - i to jeszcze odnoszący się do pliku TXT
    Kod: Zaznacz cały
    ThisWorkbook.Path

    Jeśli chciałbyś określić ścieżkę to albo podajesz jej pełną treść
    Kod: Zaznacz cały
    Open "C:\moj_plik_z_adresami.txt" For Input As #1
    wstawiając slasch "\" a nie backslash "/", to nie jest bez znaczenia lub możesz użyć procedury wskazania pliku na dysku.
  • Aby pomóc sobie w znalezieniu nie określonych zmiennych na początku modułu umieść linijkę, wskazuje ona od razu miejsce błędu.
    Kod: Zaznacz cały
    Option Explicit

    Przypisanie rodzaju zmiennej pomaga w optymalizacji i efektywnemu działaniu kodu.
    np co to jest "wiersz" lub "Data", określ to !
  • linijka
    Kod: Zaznacz cały
    ActiveCell.Offset(wiersz, 0) = Data
    znowu odnosi się do aktywnej komórki ... ani Outlook ani w pliku TXT nie ma komórek.
    Nie importuj jak popadnie elementów z Excela!
  • Powiedz mi co robi ta pętla? coś powinna robić?
    Z tego co widzę jedynie co mogła by robić, to zliczać ilość linii w pliku txt, bo przekazywać parametrów nie przekazuje. Jeśli powinna zamieniać adresy w książce adresowej to się do nich nie odnosi. Oprócz określenia pod jaką zmienną ukrywa się domyślny katalog kontaktów procedura nic nie ma wspólnego z Outlookiem.

Widzę że masz dobre chęci to też szczerze polecam literaturę lub naprawdę więcej własnej inicjatywy w zaangażowanie się śledzeniem tematów na forach coderscity. Odpowiedzi co do Outlooka tam nie otrzymasz, jednakże Tam znajdziesz odpowiedzi na elementarne pytania "Co to jest funkcja", "Jak deklarować zmienne", "Jak przekazać paramert", "Jak pisać obsługę błędu" itp.
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10272
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Re: Makra - książka adresowa

Postprzez Fen » Pn 23.02.2009 07:24

Witam ,

po uwzględnieniu Twoich rad i przebrnięciu przez forum CC ( prawie 160 stron :D ) oto moje "wypociny" :) :

Kod: Zaznacz cały
Sub zamiana_domen()

Dim oContact As ContactItem
Dim oContactFolder As MAPIFolder
Dim Dane As String
Dim z As Long, item As Object
   
'domyślny katalog folderów
Set oContactFolder = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderContacts)

'wczytanie pliku + zamiana adresów na te z wczytanego pliku
    Open "C:\adresy.txt" For Input As #1
        Do 'Until EOF(1)
            Line Input #1, Dane
                For z = 1 To oContactFolder.Items.Count
                Set oContact = oContactFolder.Items(z)
                    DoEvents
                        If Not oContact Is Nothing Then
                            With oContact
                                If .Email1Address Like Dane Then
                                    .Email1Address = split(.Email1Address, "|")(0) & Dane
                                        Debug.Print .FullName & " -> adres zamieniamy z: "; .Email1Address & " -> na: " & _
                                        split(.Email1Address, "|")(0) & Dane
                                    .Save
                                End If
                            End With
                        End If
                    Next
                Set oContact = Nothing
                Set oContactFolder = Nothing
        Loop Until EOF(1)
    Close #1

End Sub


Makro po debugowaniu nie zgłasza errora , ale nie działa prawidłowo :/ i nie wiem , gdzie jest problem. Ma ono wczytywać plik txt z adresami zapisanymi w takiej postaci :

Kod: Zaznacz cały
j.kowalski@stary.adres.pl|j.kowalski@nowy.adres.pl
a.nowak@inny.adres.pl|a.nowak@nowy.adres.pl
itd


Następnie ma sprawdzić książkę adresową Outlook'a czy znajduje się w niej adres z lewej strony i jeśli tak to ma go zamienić na ten adres po prawej stronie znaku "|".

Pozdrawiam.
Fen
 
Posty: 4
Dołączył(a): Pt 16.01.2009 07:14

Re: Makra - książka adresowa

Postprzez OShon » Pn 23.02.2009 11:40

Fen napisał(a):
Kod: Zaznacz cały
If .Email1Address Like Dane Then
    .Email1Address = split(.Email1Address, "|")(0) & Dane 'ma być (1)
    .Save
End If
Makro po debugowaniu nie zgłasza errora , ale nie działa prawidłowo :/ i nie wiem , gdzie jest problem. ...
Następnie ma sprawdzić książkę adresową Outlook'a czy znajduje się w niej adres z lewej strony i jeśli tak to ma go zamienić na ten adres po prawej stronie znaku "|".

Wszystko dlatego ze źle podstawiasz, tniesz.
Makro działa prawidłowo ale zamiast wstawiać za adres 1wszy 2gi to wstawia ci zamiast 1go 1wszy. (i efektu brak)

Uproszczona konstrukcja split działa następująco:
  • split(string, kwantyfikator)(0) = przed kwantyfikatorem
  • split(string, kwantyfikator)(1) = po kwantyfikatorze
    sam kwantyfikator zaś ulega utraceniu (w twoim przypadku znak pałki "|", faktycznie w tym przypadku do niczego nie potrzebny)

Poza tym sprawdź czy konstrukcja
Kod: Zaznacz cały
If .Email1Address Like Dane Then debug.print "ok"
zwróci "ok" (uważam że niekoniecznie pętla si wywołuje ten warunek) ponieważ ja wole nie przyrównywać operatorem like całego Stringa, ponieważ poprawnie jest albo użyć
Kod: Zaznacz cały
Dane & "*"
, bo w adresie email jest mniej znaków niż w linii "Dane" lub jak w przypadku wcześniej pokazanym (bardziej poprawnie)
Kod: Zaznacz cały
if  .Email1Address = split(.Email1Address, "|")(0) then '...
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10272
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl


Powrót do Microsoft Outlook 2007 / 2010 / 2013 / 2016

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 21 gości