how to set user properties to a newly created appointment

savvaskef

New Member
Outlook version
Outlook 2010 32 bit
Email Account
Here, I am trying to clone recurring appointments to a new calendar which has additional userproperties
but I get a

Run-time error '-2147417848(80010108)':
Automation error
The object invoked has disconnected from its clients

error when
1)setting a user property
2)set the recurrencepattern


code follows:
Code:
Private Sub clonecalwithproperties()
Dim primarycalendar As Outlook.Folder
Dim destinationcalendar As Outlook.Folder
Dim sourcecalendar As Outlook.Folder
Dim sourceitems As Outlook.Items
Dim appt As Outlook.AppointmentItem
'Does this have a OOO/WFH custom property set? This is set by a macro on the Meeting Request form
'If Appt.MeetingStatus = olMeeting And Not (Appt.ItemProperties.Item("OOORequest") Is Nothing) Then
Set primarycalendar = Outlook.Application.Session.GetDefaultFolder(olFolderCalendar)
Set sourcecalendar = primarycalendar.Folders("subfolder1")
Set destinationcalendar = primarycalendar.Folders("¸subfolder")
Set sourceitems = sourcecalendar.Items
         For Each appt In sourceitems
        
         Dim new_appt As AppointmentItem
         
        
        'Create appointment for sender's calendar
         Set new_appt = destinationcalendar.Items.Add
         With new_appt
             .Subject = appt.Subject
             .BusyStatus = appt.BusyStatus
             .ReminderSet = appt.ReminderSet
             .Start = appt.Start
             .End = appt.End
             .AllDayEvent = appt.AllDayEvent
             .Body = appt.Body
             .UserProperties("customercat") = appt.UserProperties("customercat")
             .UserProperties("productcat") = appt.UserProperties("productcat")
            
             .Save
            
         End With
        
         'If recurring meeting, duplicate recurrence pattern for new appointment
         Dim RPOrig As RecurrencePattern
         Dim RPNew As RecurrencePattern
         If appt.IsRecurring Then
             Set RPOrig = appt.GetRecurrencePattern
             Set RPNew = new_appt.GetRecurrencePattern
             RPNew = RPOrig
             new_appt.Save
            
            
         End If
        Next

            
         'End If
         
        'Release resources
         Set new_appt = Nothing


End Sub
(for my purposes the 1st occurrence of the error (on .userproperties("prop")) is of more importance because I do not know how to handle the exceptions and thus I will clone all appointments (even recurring ones) as one-off appointments.If you do have a way to do as such please comprehend
 

Diane Poremsky

Senior Member
Outlook version
Outlook 2016 32 bit
Email Account
Office 365 Exchange
does it work if you don't copy the custom fields?

I think the problem is you need to add the custom field before setting the property
Dim objProp As Outlook.UserProperty
Set objProp = .UserProperties.Add("Friendly Field Name", olText, True)
objProp.Value = appt.UserProperties("customercat").value

you could try this first -
.UserProperties("customercat").value = appt.UserProperties("customercat").value
 

Diane Poremsky

Senior Member
Outlook version
Outlook 2016 32 bit
Email Account
Office 365 Exchange
Also, if nothing is changing, instead of
'Create appointment for sender's calendar
Set new_appt = destinationcalendar.Items.Add
With new_appt
..........

you could copy the apt and move it.
set new_appt = appt.copy
new_appt.Move destinationcalendar
 

savvaskef

New Member
Outlook version
Outlook 2010 32 bit
Email Account
thnx a lot diane,
Maybe my head is skipping properties of the outlook object model.What should I say?I am a bit spoiled by c# where types are explicit.thnx again
 

savvaskef

New Member
Outlook version
Outlook 2010 32 bit
Email Account
supposefully, if I wanted to copy recurrences (with any kind of rec.pattern and with all of their exceptions:some deleted, some with userproperties changed).is there a possible way to do such a thing?the error seems to be the same

(I do not want to copy or move appointments around since the form description is changed and they have the habbit to carry their own around to the new calendar even if its 9newly)assigned form template is set correct )
 

Diane Poremsky

Senior Member
Outlook version
Outlook 2016 32 bit
Email Account
Office 365 Exchange
This shows how to copy recurring events to individual appt. Copy Recurring Appointment Series to Appointments - that should get exceptions too, since it looks at the individual members of the collection. I'll have to look into copying the recurring pattern - i thought it worked, but either it doesn't or your code is missing a step (it looks good to me at 'first glance')
 

Diane Poremsky

Senior Member
Outlook version
Outlook 2016 32 bit
Email Account
Office 365 Exchange
i posted this in comments on slipstick website - this is to create a new appointment, but you might try putting your code into the with or remove the save from within the with and put it at the end.
Dim pattern As Outlook.RecurrencePattern

With olAppt
'the other appt fields here

Set pattern = .GetRecurrencePattern
pattern.RecurrenceType = olRecursYearly
pattern.StartDate = .start
pattern.NoEndDate = True

.Save
end with
 

Diane Poremsky

Senior Member
Outlook version
Outlook 2016 32 bit
Email Account
Office 365 Exchange
AFAIK, you can't copy the pattern, you need to copy each element of the pattern.

Code:
--snip--

         If appt.IsRecurring Then
         Dim RPOrig As RecurrencePattern
         Dim RPNew As RecurrencePattern
            Set RPOrig = appt.GetRecurrencePattern
            Set RPNew = .GetRecurrencePattern
          
RPNew.RecurrenceType = RPOrig.RecurrenceType
RPNew.PatternStartDate = RPOrig.PatternStartDate
RPNew.Occurrences = RPOrig.Occurrences
'RPNew.NoEndDate = RPOrig.NoEndDate
' for weekly appointments
RPNew.DayOfWeekMask = RPOrig.DayOfWeekMask

           
         End If
           
             .Save
           
         End With

you can copy the entire apt and keep the pattern intact - what I might do is copy it then edit the userprops as needed after it's copied, especially if they will different recurrencetypes.
RecurrencePattern.RecurrenceType Property (Outlook) has the valid fields for each pattern type.
 

savvaskef

New Member
Outlook version
Outlook 2010 32 bit
Email Account
thnx diane, the RecurrencePattern properties did the job for me. I just have to add a switch case statement for the different properties for each RecurrenceType. I do not know why I did not test that. I guess I was pessimistic by the different settings for each recurring appointment not knowing that recurrencetype defines which set of properties need to be set.
 

savvaskef

New Member
Outlook version
Outlook 2010 32 bit
Email Account
I thought it would be a good idea to post the select statement I implemented for fellow posters to see (in a nutshell you just forgot the interval property) but it is better for viewers to see the whole picture:

Set primarycalendar = Outlook.Application.Session.GetDefaultFolder(olFolderCalendar)
Set sourcecalendar = primarycalendar.Folders("sourcecalendar")
Set destinationcalendar = primarycalendar.Folders("destinationcalendar")
Set sourceitems = sourcecalendar.Items

sourceitems.IncludeRecurrences = False

For Each appt In sourceitems

'Create appointment for sender's calendar
Set new_appt = destinationcalendar.Items.Add
With new_appt
.Subject = appt.Subject
.BusyStatus = appt.BusyStatus
.ReminderSet = appt.ReminderSet
.ReminderMinutesBeforeStart = appt.ReminderMinutesBeforeStart
.Start = appt.Start
.End = appt.End
.AllDayEvent = appt.AllDayEvent
.Body = appt.Body
End With
Dim RPOrig As RecurrencePattern
Dim RPNew As RecurrencePattern
If appt.IsRecurring Then
Set RPOrig = appt.GetRecurrencePattern
Set RPNew = new_appt.GetRecurrencePattern
'can't RPNew = RPOrig
RPNew.RecurrenceType = RPOrig.RecurrenceType
RPNew.PatternStartDate = RPOrig.PatternStartDate
RPNew.Occurrences = RPOrig.Occurrences

If RPOrig.NoEndDate = True Then
RPNew.NoEndDate = True
Else
RPNew.NoEndDate = False
RPNew.Occurrences = RPOrig.Occurrences
End If


Select Case RPOrig.RecurrenceType
Case olRecursMonthly
RPNew.DayOfMonth = RPOrig.DayOfMonth
RPNew.Interval = RPOrig.Interval

Case olRecursMonthNth
RPNew.DayOfWeekMask = RPOrig.DayOfWeekMask
RPNew.Instance = RPOrig.Instance
RPNew.Interval = RPOrig.Interval



Case olRecursWeekly
RPNew.DayOfWeekMask = RPOrig.DayOfWeekMask
RPNew.Interval = RPOrig.Interval


Case olRecursYearly
RPNew.MonthOfYear = RPOrig.MonthOfYear
RPNew.Interval = RPOrig.Interval
RPNew.DayOfMonth = RPOrig.DayOfMonth
Case olRecursYearNth

RPNew.DayOfWeekMask = RPOrig.DayOfWeekMask
RPNew.Instance = RPOrig.Instance
RPNew.Interval = RPOrig.Interval
End Select


new_appt.Save
End If

Next
 

savvaskef

New Member
Outlook version
Outlook 2010 32 bit
Email Account
...but there's a but here:How can you handle exceptions?deleted,moved,updated? what can you do to copy these items?
 
Top