Dodanie Menu do Poczta/Nowy [VBA]

Pytania, problemy, uwagi związane ze starszymi wersjami Microsoft Outlook 2003, 2002 (XP), 2000, 98

Moderator: Moderatorzy

Dodanie Menu do Poczta/Nowy [VBA]

Postprzez Shon Oskar » Wt 16.01.2007 13:30

Michu może poradzisz.

Będę chciał dodawać do nowo utworzonego maila (Poczta/Nowy) nowe przyciski Menu z możliwością wykonania instrukcji z VbaProject

Podobnie dla elementów kalendarza (Spotkanie/wydarzenie) oraz dla kontaktu

możesz mi coś podpowiedzieć ?
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez michu » Wt 16.01.2007 14:23

Chodzi o nowe przyciski w pasku narzędzi, czy o nowe komendy w menu, ewentualnie o nowe menu?
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez Shon Oskar » Wt 16.01.2007 14:32

najlepiej było było dodać nowy pasek Menu (z nowymi przyciskami)
ponieważ komuś mogło by nie odpowiadać wyszukiwanie przycisków w Edit czy Format.

Tak to będzie można np. przenieść pasek (lub od razu zdefiniować) czy ma się on pojawić na dole czy np. po lewej stronie okna Nowej wiadomości
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez michu » Wt 16.01.2007 21:32

Wklej poniższy kod w module ThisOutlookSession. Tworzy nowe menu i dodaje przycisk do standardowego paska narzędzi w formularzach wyświetlanych podczas tworzenia nowej wiadomości.

Kod: Zaznacz cały
Dim WithEvents oInspectors As Inspectors
'obiekt nowego punktu w menu
Dim WithEvents oPopupButton As CommandBarButton
'obiekt nowego klawisza toolbara
Dim WithEvents oToolbarButton As CommandBarButton


Private Sub Application_Startup()
    Set oInspectors = Application.Inspectors
End Sub

'Funkcja sprawdza czy istnieje juz nasz popup i jesli nie to go dodaj
Sub AddNewPopup(oInspector As Inspector)
    Dim oMenuBar As CommandBar
    Set oMenuBar = oInspector.CommandBars.Item("Menu Bar")
 
    'Sprawdz czy menu juz istnieje
    Dim oControl As CommandBarControl
    For Each oControl In oMenuBar.Controls
        If "NoweMenu" = oControl.Caption Then Exit Sub
    Next
   
    Dim oPopup As CommandBarPopup
    Set oPopup = oMenuBar.Controls.Add(Type:=msoControlPopup, Temporary:=True)
    oPopup.Caption = "NoweMenu"
    oPopup.Visible = True
    Set oPopupButton = oPopup.Controls.Add(Type:=msoControlButton, Temporary:=True)
    oPopupButton.Style = msoButtonIconAndCaption
    oPopupButton.Caption = "Nowy punkt menu"
    oPopupButton.Visible = True
    oPopupButton.BuiltInFace = True
    oPopupButton.FaceId = 222
End Sub

'Funkcja sprawdza czy istnieje juz nasz klawisz na glownym toolbarze i jesli nie to go dodaje
Sub AddNewToolbarButton(oInspector As Inspector)
    Dim oMenuBar As CommandBar
    Set oMenuBar = oInspector.CommandBars.Item("Standard")
   
    'sprawdz czy klawisz juz istnieje
    Dim oControl As CommandBarControl
    For Each oControl In oMenuBar.Controls
        If "NowyKlawiszToolbara" = oControl.Caption Then Exit Sub
    Next
   
    Set oToolbarButton = oMenuBar.Controls.Add(Type:=msoControlButton, Temporary:=True)
    oToolbarButton.Style = msoButtonIconAndCaption
    oToolbarButton.Caption = "NowyKlawiszToolbara"
    oToolbarButton.Visible = True
    oToolbarButton.BuiltInFace = True
    oToolbarButton.FaceId = 320
End Sub

Private Sub oInspectors_NewInspector(ByVal Inspector As Inspector)
    On Error GoTo ErrorLabel
   
    'rozszerzamy tylko maile
    If Inspector.CurrentItem.MessageClass <> "IPM.Note" Then Exit Sub
   
       
    Call AddNewPopup(Inspector)
    Call AddNewToolbarButton(Inspector)
   
    Exit Sub
   
ErrorLabel:
    Debug.Print Err.Description
End Sub

Private Sub oPopupButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    MsgBox "Nacisnieto nowy klawisz w menu!"
End Sub

Private Sub oToolbarButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    MsgBox "Nacisnieto nowy klawisz na toolbarze!"
End Sub
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez Shon Oskar » Śr 17.01.2007 12:23

Bardzo dziekuje działa 8)
jestem w fazie przeróbek ;]
ale podwaliny wyśmienite poddane


Mam jeszcze jedno pytanko
jeżeli mam w pamieci adres email
jak do wkleić do otwartego nowego maila
Kod: Zaznacz cały
Set olApp = CreateObject("Outlook.Application")
 Set olMail = olApp.ActiveWindow(olMailItem) 
olMail.To = adres

:?: coś ni mie chce działać
jak odnieść sie do aktywnego maila ?
i np: pobrać jego adresy i dodać ten co mam w pamieci
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez michu » Śr 17.01.2007 12:56

W zdarzeniu oInspectors_NewInspector dostajesz w argumencie referencję do aktualnie otwartego okna.
Inpsector.CurrentItem
to element powiązany z tym oknem. Tam jest sprawdzanie, czy dany element jest e-mailem. Podobnie możesz dodać/usunąć sobie do niego odbiorców, używając kolekcji Recipients.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez Shon Oskar » Śr 17.01.2007 13:42

chmm
kurka nie wsadza mi adresów jakie mam w pamieci do aktywnego maila

Kod: Zaznacz cały
Set olApp = CreateObject("Outlook.Application")
Set Inspector = olApp.ActiveInspector
Inspector.CurrentItem.Recipients.Add = adresy
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez michu » Śr 17.01.2007 13:56

W wywołaniu funkcji Add powinien być jeden adres, nie adresy. Poza tym jeśli to ma działać w połączeniu ze wstawianiem nowego menu czy przycisku, to po co tworzyć nową aplikację? Poiwnieneś raczej wstawić ten kod w funkcji oInspectors_NewInspector.

A tak w ogóle, jeśli robisz to wszystko w zewnęrznej aplikacji, to możesz mieć problemy z ostrzeżeniami bezpieczeństwa. Wyświetlane są między innymi właśnie wtedy, gdy próbujesz dodać jakiś adres do wiadomości.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez Shon Oskar » Śr 17.01.2007 14:19

nie, nie jest to z zewnętrznej aplikacji

Pobieram te dane z XMLa poprzez kontrolkę w Outlooku
i generuje nowego maila na podstawie wybranych ludzi i przypisanych do nich adresów. (dziła znakomicie)

Obrazek

Teraz chce zrobić tak że jezeli już mam otwartego maila to do niego chce dodać zaznaczone adresy uruchamiając tą samą kontrolkę
np: przy zastosowaniu - odpisz do: nadawca
w polu Do jest nadawca(jako odbiorca) i uruchamiając kontrolkę wskazuje mu adresy, a makro do niego przypięte pobiera odbiorce maila i dokleja adresy z kontrolki zwracając wszystko z powrotem do pola TO.[do:]
(lub uzupełnia istaniejące pole Do: odbiorca, Adresy z kontrolki

p.s.
w jakiejś tam.. Recipients stosowałem w aplikacji Excelowej - do generowania poczty - ale zawsze była to nowa poczta a nie aktywny mail
Kod: Zaznacz cały
.Recipients = Array("a.b@veracomp.pl", "b.a@veracomp.pl", "a.a@veracomp.pl", "b.b@veracomp.pl")

teraz adresy mogę oczywiście pogrupować odpowiednio do formatu w nawiasach. tylko jak dostać sie do tego pola

jezlei możesz podaj mi instrukcje wlejenia czegoś do pola Do: na otwartej wiadomosci emai.
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez michu » Śr 17.01.2007 17:22

Taki prosty skrypt mi działa poprawnie pod Outlook 2003:
Kod: Zaznacz cały
Dim oMail As MailItem
Set oMail = Application.ActiveInspector.CurrentItem
oMail.Recipients.Add "info@outlook.pl"


Piszesz, że używasz "kontrolki" w Outlook'u. Nie bardzo wiem co masz na myśli. Czy to co widać na screenshocie, to formularz wykonany w VBA w Outlook'u?

Wcześniej przytaczałeś taki kawałek kodu:
Kod: Zaznacz cały
Set olApp = CreateObject("Outlook.Application")

Jeśli jest to rozwiązanie zrobione w całości w VBA Outlook'a, to nie powinieneś nigdzie tworzyć nowej instancji Outlook'a, wszędzie masz dostęp do wbudowanego obiektu Application.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez Shon Oskar » Śr 17.01.2007 17:51

Apropo kontrolki to miałem na myśli "Microsoft XML, v3.0" jaką używam w tym formularzu ;]

poradziłem sobie tak:

Kod: Zaznacz cały
If adresy <> "" Then
        Dim olMail As MailItem
        Set olMail = Application.ActiveInspector.CurrentItem
            olMail.Recipients.Add "" & Left$(adresy, Len(adresy) - 1) & ""
        Set olMail = Nothing
Else
    MsgBox "Brak możliwości wklejenia adresów do wiadomości e-mail!" & vbCr _
         & "z powodu braku zaznaczonych pozycji drzewa", vbExclamation, " Informacja o błędzie"
End If


Bardzo ci dziekuje za naprowadzenie.

jezeli chodzi o
Kod: Zaznacz cały
Set olApp = CreateObject("Outlook.Application")

to masz racje. Musze to powycinać - a mam tego troche (jakoś nie wpadło mi do głowy - bo wszystko chodzi cacy
W sumie w Outlooku programuje od 2 miesięcy. Przedtem dostawałem się do Outlooka z Excela lub z VB6 ;)

___________________________________________________
Jeszcze jedna prośba
jak dodać adresy do CC ??
przy tworzenieu nowej wiadomoci działa

Kod: Zaznacz cały
Set olMail = Application.CreateItem(olMailItem)
olMail.CC = Left$(adresy, Len(adresy) - 1)


jednakże w procedurze otwartej wiadomości już nie :(
Kod: Zaznacz cały
Set olMail = Application.ActiveInspector.CurrentItem
olMail.CC
olMail.Recipients.Add ("" & Left$(adresy, Len(adresy) - 1) & "")
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez OShon » Cz 18.01.2007 20:46

Da się wpisać na otwartej wiadomości w CC ?
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: 10274
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Cz 18.01.2007 20:55

Najpierw dodaje się odbiorcę, a potem zmienia jego typ:

Kod: Zaznacz cały
...
Dim oRecipient
Set oRecipient = oMail.Recipients.Add("info@outlook.pl")
oRecipient.Type = olCC
...
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » Cz 18.01.2007 21:12

robiłem podobnie:
Kod: Zaznacz cały
Set olMail = Application.ActiveInspector.CurrentItem
olMail.Recipients.Add ("" & Left$(adresy, Len(adresy) - 1) & "")
olMail.Type = olCC


analogicznie jak wiadomość Do
z dopiskiem .Type = olCC
i się tez nie powiodło

dzięki
spróbuje zrobić mu Seta deklarując
Kod: Zaznacz cały
Dim oRecipient
Set oRecipient = oMail.Recipients.Add("" & Left$(adresy, Len(adresy) - 1) & "")

jak podałeś ;)
_________________________________________
p.s.
dziwne tylko że jak coś się nie powiedzie w instrukcji
Kod: Zaznacz cały
oPopupButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)

to muszę resetować Outlooka bo 2gi raz instrukcja/procedura się nie wywoła :?:
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: 10274
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Pt 19.01.2007 10:47

dziwne tylko że jak coś się nie powiedzie w instrukcji [...]
to muszę resetować Outlooka bo 2gi raz instrukcja/procedura się nie wywoła

No tak jest w VBA. Dlatego, jeśli wypuszczasz wersję "release" kodu dla użytkowników dobrze jest wstawić na samym początku każdej procedury instrukcję:
Kod: Zaznacz cały
On Error Resume Next

Wtedy wsystkie błędy będą pomijane i w razie wystąpienia błędu wykonywana będzie kolejna linia kodu. Nie powinieneś jednak używać tej instrukcji w czasie tworzenia i testowania aplikacji, bo nie będzie wiedział, gdzie i kiedy coś się wywala.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez Shon Oskar » Pt 19.01.2007 11:12

czywiście

On Error Resume Next
On Error goto Gdzieś
On Error goto 0

jest mi dobrze znane ;]

Jednak błąd pewnie polega na tym iż wywołana forma (wygodna w swojej obsłudze) jest vbModeless
I pewnie po przechodzieniu z nowiej wiadomości wywołaniu formy, przejsciu do okna Oudluka i wywołaniu następnej nowej
wiadomości i uruchomienie formy procedurka sie wali a błąd nie jest zgłaszany. (tylko reset aplikacji)
I oczywiście grzebanie w kodzie uruchamia procedury jednakże nie te z przycisków nowej wiadomości.

Ale może to taki urok MS

ok Michu zamykamy temat - bo sie dłuży
dziekuje ponownie za podpowiedzi.
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez bazylia » Pn 04.02.2008 19:25

Witam.
Dodaję w wyżej opisany sposób przycisk do toolbara. Jego wciśnięcie ma uruchomić makro. Niestety po wielokrotnym uruchomieniu makra przycisk przestaje działać. Jaka może być tego przyczyna?
Pozdrawiam.
bazylia
 
Posty: 9
Dołączył(a): So 03.11.2007 21:49
Lokalizacja: Wrocław

Postprzez OShon » Pn 04.02.2008 23:54

Może międzyczasie wchodzisz do projektu?
w tedy inspektor traci właściwość przekazania parametru...

najlepiej podziel się kodem a wszystko będzie jasne - czy to dziura w kodzie czy błąd użycia.
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: 10274
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez bazylia » Wt 05.02.2008 12:00

Kod do przycisku jest taki sam jak powyżej, zmienił się jedynie następujący fragment:
Kod: Zaznacz cały
Private Sub oToolbarButton_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
   Call SubjectEditor
End Sub

gdzie SubjectEditor to procedura wyświetlająca pewnien formularz, umożliwiający użytkownikowi pewną modyfikację tematu maila.
Kod: Zaznacz cały
Sub SubjectEditor()
   Form.Show
End Sub
Private Sub UserForm_Activate()
   Set oMail = Application.ActiveInspector.CurrentItem
   ...
End Sub

Problem z przyciskiem pojawia się, gdy w tym samym czasie otwartych jest kilka maili. Wtedy przycisk działa tylko dla jednego z nich. Dla pozostałych już przestaje działać, a po zamknięciu wszystkich maili nie działa już dla żadnego.
Pozdrawiam.
bazylia
 
Posty: 9
Dołączył(a): So 03.11.2007 21:49
Lokalizacja: Wrocław

Postprzez Shon Oskar » Wt 05.02.2008 16:37

popatrz ma jeden z ostatnich moich postów
http://www.outlook.pl/forum/viewtopic.php?t=2220

w kodzie masz tam pętelkę, odnosząca sie do każdego z zaznaczonych mail w danym folderze...

uwaga tylko jedna
Forme do której będziesz pobierał tematy musisz wyświetlać nie modalnie
no chyba ze będziesz również pobierał identyfikatory wiadomości. (bo jak ktoś zaznaczy ci inne wiadomości a okno pozostanie otwarte to nadpisanie tematów odniesie się do innych zaznaczonych wiadomości a potem sie wysypie... co ich liczba może być inna niż pierwotnie zaznaczonych)
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Następna strona

Powrót do Microsoft Outlook

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 5 gości