[VBA] Kolorki w Kalendarzu

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

Moderator: Moderatorzy

[VBA] Kolorki w Kalendarzu

Postprzez OShon » Śr 06.06.2007 20:31

W kalendarzu do 2007 można deklarować kolory spotkań.
Zauważyłem że w waszych programach do synchronizacji kalendarza również korzystacie z tej funkcji.

Jak dobrać sie do tego; jaką metodą można zadeklarować kolor opierając się na tworzeniu elementów w AppointmentItem
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Śr 06.06.2007 21:15

W Outlook 2007 kolor jest powiązany z kategorią. Więc wystarczy nadać terminowi kategorię i będzie wyświetlany w kolorze tej kategorii. W Outlook 2003 były osobno kategorie i kolory dla elementów kalendarza.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » Śr 06.06.2007 21:23

A sorki aby nie komplikować chodziło mi o O2k3

Kod: Zaznacz cały
Dim oCalendar As AppointmentItem
With oCalendar
    .Categories = "XXX"
     'a kolor jak?'
end with


i nie wiem jak zadeklarować kolor pod stworzoną kategorie
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Cz 07.06.2007 12:31

Ale chodzi o to, że jeśli używasz Outlook 2003, to kategorie nie mają nic wspólnego z kolorami. Osobno ustawia się kategorię a zupełnie osobno kolor - w żaden sposób nie są ze sobą powiązane. Koloru nie ustawisz przy pomocy Outlook API, trzeba to zrobić przez CDO. Nie wiem teraz, która właściwość jest odpowiedzialna za kolor. Musiałbym sprawdzić, jeśli Ci to potrzebne.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » Cz 07.06.2007 13:39

Ustawiam kolor w notatkach w zależności od ich kategorii. (dostępnych 5 kolorów)
To samo chciałem zrobić ze spotkaniami.

Użytkownik w ten sposób zyskał by klarowny podział spraw ważnych i mniej ważnych bez sortowania po nazwie kategorii i nazwie tematu tego spotkania.

tak w wolnej chwili...
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez OShon » Cz 07.06.2007 15:59

ok mam
znalazłem - muszę przetestować czy będzie działać również w O2k
na O2k3 jest ok

Kod: Zaznacz cały
Sub SetApptColorLabel(objAppt As Outlook.AppointmentItem, intColor As Integer)
    ' Dołączyć referencje Microsoft CDO 1.21'
    ' intColor to 1=Ważne, 2=Praca, 3=Osobiste etc..'
    Const CdoPropSetID1 = "0220060000000000C000000000000046"
    Const CdoAppt_Colors = "0x8214"
    Dim objCDO As MAPI.Session
    Dim objMsg As MAPI.Message
    Dim colFields As MAPI.Fields
    Dim objField As MAPI.Field
    On Error Resume Next
   
    Set objCDO = CreateObject("MAPI.Session")
    objCDO.Logon "", "", False, False
        Set objMsg = objCDO.GetMessage(objAppt.EntryID, objAppt.Parent.StoreID)
        Set colFields = objMsg.Fields
        Set objField = colFields.item(CdoAppt_Colors, CdoPropSetID1)
        If objField Is Nothing Then
            Err.Clear
            Set objField = colFields.Add(CdoAppt_Colors, vbLong, intColor, CdoPropSetID1)
        Else
            objField.Value = intColor
        End If
        objMsg.Update True, True
                     
    Set objMsg = Nothing
    Set colFields = Nothing
    Set objField = Nothing
    objCDO.Logoff
    Set objCDO = 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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Cz 07.06.2007 16:13

znalazłem - muszę przetestować czy będzie działać również w O2k

Nie będzie. W Outlook 2002 / 2002 nie ma kolorowania elementów w kalendarzu. Wprowadzono to w Outlook 2003. W Outlook 2007 też jest inaczej, jak już pisałem.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » So 09.06.2007 11:25

akurat nie mam pod ręką 02k
ale w sumie to chodziło mi o ominięcie procedury
Kod: Zaznacz cały
if val(applicatin.version) > 9 then ...


bo czasem to sie wywala na poziomie interpretacji.
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez OShon » Śr 13.06.2007 23:39

Michu a nie wiesz co jest odpowiedzialne za nazwy kolorków (Nazwy etykiet, które można ręcznie edytować) - ja chciałem je zastąpić na inne z poziomu VBA
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Cz 14.06.2007 08:33

Z poziomu VBA się nie da, ewentualnie możesz próbować robić to przez CDO. Etykiety są zapisane we właściwości MAPI o identyfikatorze 0x36DC0102, która znajduje się na folderze danego kalendarza. Jeśli etykiety są zmienione, to są zapisane binarnie w Unicode w tej właściwości. Jest ich zawsze 10 i są rozdzielone od siebie znakiem podwójnego NULL'a. Dokładniej możesz sprawdzić jak to wygląda, jeśli użyjesz jakiegoś edytora MAPI, np. OutlookSpy lub MAPI Editor.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » Cz 14.06.2007 23:40

Zainstalowałem sobie OutlookSpy,
jedakże jest on na razie dla mnie jaskinią zagadek

Z kolorkami już sobie poradziłem
Ze stosowaniem w ominięciu O2k też
jednakże nie mogę dojść do zamiany tekstu w Etykietach.

Jakbyś mógł przytocz mi przykład z CDO..
plizz
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Pt 15.06.2007 08:15

Robisz to podobnie, jak w kodzie, który napisałeś wyżej. Tam też używasz CDO. Tylko, że tutaj powinieneś odczytać właściwość 0x36DC0102 określonego foldera kalendarza. Żeby ta właściwość w ogóle pojawiła się na kalendarzu, musisz zmienić jakąś etykietę. Wartość tej właściwości zapisana jest binarnie w Unicode, więc będziesz musiał trochę powalczyć, żeby w VB ją odczytać.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez Shon Oskar » Pt 15.06.2007 08:30

je i jakoś nie szfunguje..... :(

Kod: Zaznacz cały
Sub Zaznaczam_spotkanie()
    Dim objItem As Object
    Dim thisAppt As AppointmentItem
   
    Set objItem = Application.ActiveExplorer.Selection(1)
    If objItem.Class = olAppointment Then
        Set thisAppt = objItem
        Call SetApptColorLabel(thisAppt, 1, "Nazwa labela")
    End If
   
    Set objItem = Nothing
    Set thisAppt = Nothing
End Sub
Sub SetApptColorLabel(objAppt As Outlook.AppointmentItem, intColor As Integer, intLabel As String)
    Const CdoPropSetID1 = "0220060000000000C000000000000046"
    Const CdoAppt_Colors = "0x8214"
    Const CdoAppt_Label = "0x36DC0102"
    Dim objCDO As MAPI.Session
    Dim objMsg As MAPI.Message
    Dim colFields As MAPI.fields
    Dim objField As MAPI.Field, objLabel As MAPI.Field
    On Error Resume Next
   
    Set objCDO = CreateObject("MAPI.Session")
    objCDO.Logon "", "", False, False
        Set objMsg = objCDO.GetMessage(objAppt.EntryID, objAppt.Parent.StoreID)
        Set colFields = objMsg.fields
        Set objField = colFields.item(CdoAppt_Colors, CdoPropSetID1)
        Set objLabel = colFields.item(CdoAppt_Label, CdoPropSetID1)
        If objField Is Nothing Then
            Err.Clear
            Set objField = colFields.Add(CdoAppt_Colors, vbLong, intColor, CdoPropSetID1)
            Set objLabel = colFields.Add(CdoAppt_Label, vbString, intLabel, CdoPropSetID1)
        Else
            objField.Value = intColor
            objLabel.Value = intLabel
        End If
        objMsg.Update True, True
                     
    Set objMsg = Nothing
    Set colFields = Nothing
    Set objField = Nothing
    Set objLabel = Nothing
    objCDO.Logoff
    Set objCDO = Nothing
End Sub
O'Shon
Shon Oskar
 
Posty: 182
Dołączył(a): Pn 16.10.2006 09:05
Lokalizacja: Veracomp S.A.

Postprzez michu » Pt 15.06.2007 16:53

Kod: Zaznacz cały
Set objLabel = colFields.item(CdoAppt_Label, CdoPropSetID1)

Właściwość 0x36DC0102 powinieneś odczytać z kolekcji Items foldera kalendarza, a Ty czytasz ją z elementu wiadomości (terminu). Poza tym nie używaj do czytania tej właściwości CdoPropSetID1. Zakładając, że zmienna Fields jest kolekcją pól kalendarza, kod powinien wyglądać tak:
Kod: Zaznacz cały
Set objLabel = Fields.item(CdoAppt_Label)
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » Pt 15.06.2007 18:11

Kurka wywala mnie na Fields w
Kod: Zaznacz cały
Set objLabel = Fields.item(CdoAppt_Label)

błąd wskazuje że zmienna nie została zdefiniowana.
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Pt 15.06.2007 18:30

Bo Fields to powinna być zmienna, pod którą będzie przypisana kolekcja pól foldera. Więc może tak będzie jaśniej:
Kod: Zaznacz cały
Set objLabel = oCalendarFolder.Fields.Item(CdoAppt_Label)
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » Pt 15.06.2007 19:12

deklaruje

Kod: Zaznacz cały
Dim oCalendarFolder As MAPI.Folder

następnie
Kod: Zaznacz cały
Set objLabel = oCalendarFolder.Fields.item(CdoAppt_Label)


i burak... Fields nie ma item
wiem ze tłumaczenie drogą naprowadzenia jest najbardziej kształcące, jednakże jakoś mi nie wychodzi.
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Pt 15.06.2007 20:12

Zmieniłes najpierw jakieś etykiety w kalendarzu, w którym próbujesz odczytać tę właściwość? Jeśli nie, to tej właściwości nie będzie.
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » Pt 15.06.2007 20:57

Żadna z etykiet sie nie zmieniła. :cry:
Kod zgłasza błąd

Poza tym w takim układzie nie wiem która z etykiet powinna zmienić swoją nazwę.
Jeśli ta której dotyczy nr intColor to efekt przy istniejącym kodzie jest żaden.
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: 10434
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » Pt 15.06.2007 21:19

Chyba się trochę rozjechaliśmy :) Co Ty dokładnie chcesz zrobić? Ustawić kolor etykiety na elemencie spotkania w Outlook 2003?
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Następna strona

Powrót do Microsoft Outlook

Kto przegląda forum

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