使用vba从Access更新outlook任务
我正在尝试使用VBA从Access更新outlook任务。请参阅下面的代码。这是类中的一个过程。 我首先查找匹配两个条件的任务(这是有效的),然后我想更新任务字段 有人知道为什么这不起作用吗?有没有办法 代码正在运行,没有显示任何错误消息,但任务没有得到更新。我不希望删除该任务并创建一个类似的任务(我会丢失创建日期) 非常感谢使用vba从Access更新outlook任务,vba,outlook,task,Vba,Outlook,Task,我正在尝试使用VBA从Access更新outlook任务。请参阅下面的代码。这是类中的一个过程。 我首先查找匹配两个条件的任务(这是有效的),然后我想更新任务字段 有人知道为什么这不起作用吗?有没有办法 代码正在运行,没有显示任何错误消息,但任务没有得到更新。我不希望删除该任务并创建一个类似的任务(我会丢失创建日期) 非常感谢 Sub updateOutLooktask() Dim objItems As outlook.Items Dim ol As New outlook.Applicat
Sub updateOutLooktask()
Dim objItems As outlook.Items
Dim ol As New outlook.Application
Dim olns As outlook.NameSpace
Dim cf As outlook.MAPIFolder
Dim myRecipient As outlook.Recipient
Dim myNamespace As outlook.NameSpace
Dim var As Collection
Dim i As Integer
Dim iTasks As Integer
Set myRecipient = myNamespace.CreateRecipient(Me.strRecipient)
myRecipient.Resolve
Set myNamespace = ol.GetNamespace("MAPI")
Set olns = ol.GetNamespace("MAPI")
Set cf = olns.GetSharedDefaultFolder(myRecipient, olFolderTasks)
Set objItems = cf.Items
imax = objItems.Count
i = 1
Do While i <= imax
If objItems(i).ConversationID = Me.strConversationID And objItems(i).EntryID = Me.strEntryID Then
objItems(i).Subject = Me.strSubject
objItems(i).Body = Me.strBody
objItems(i).Importance = Me.intImportance
objItems(i).Owner = Me.strOwner
objItems(i).StartDate = Nz(Me.dtStartDate, #1/1/4501#)
objItems(i).DueDate = Nz(Me.dtDueDate, #1/1/4501#)
objItems(i).Status = Me.intStatus
objItems(i).PercentComplete = Me.intPercentComplete
objItems(i).Complete = Me.blComplete
objItems(i).TotalWork = Me.intTotalWork
objItems(i).ActualWork = Me.intActualwork
objItems(i).Categories = Me.strCategories
objItems(i).Save
Exit Do
End If
i = i + 1
Loop
End Sub
Sub updateOutLooktask()
将对象设置为outlook.Items
Dim ol作为新的outlook.Application
将olns设置为outlook.NameSpace
将cf设置为outlook.Mapi文件夹
将myRecipient设置为outlook。收件人
将myNamespace设置为outlook.NameSpace
作为集合的Dim var
作为整数的Dim i
将iTasks设置为整数
设置myRecipient=myNamespace.CreateRecipient(Me.strRecipient)
我的接受者。解决
设置myNamespace=ol.GetNamespace(“MAPI”)
设置olns=ol.GetNamespace(“MAPI”)
设置cf=olns.GetSharedDefaultFolder(myRecipient,olFolderTasks)
设置对象=参照项目
imax=objItems.Count
i=1
Do While i行objItems(i).Save
转换为objItems.Item(i).Save
。每个“.”都会给您一个全新的COM对象,您最终会对一个与您正在修改的对象不同的对象调用Save。另外,为什么要使用while
循环而不是for
for i = 1 to objItems.Count
set objItem = objItems(i)
If objItem.ConversationID = Me.strConversationID And objItem.EntryID = Me.strEntryID Then
objItem.Subject = Me.strSubject
objItem.Body = Me.strBody
objItem.Importance = Me.intImportance
objItem.Owner = Me.strOwner
objItem.StartDate = Nz(Me.dtStartDate, #1/1/4501#)
objItem.DueDate = Nz(Me.dtDueDate, #1/1/4501#)
objItem.Status = Me.intStatus
objItem.PercentComplete = Me.intPercentComplete
objItem.Complete = Me.blComplete
objItem.TotalWork = Me.intTotalWork
objItem.ActualWork = Me.intActualwork
objItem.Categories = Me.strCategories
objItem.Save
Exit for
End If
next
其次,如果您已经知道条目id,那么在文件夹中的所有项目上绝对没有点循环-只需使用Application.Session.GetItemFromID(Me.strEntryID)
谢谢您的帮助,使用您的代码就可以了。我真的不明白为什么,但我只是一个初学者,所以希望它很快就会有意义
正如您所提到的,我还使用了Application.Session.GetItemFromID(objItem)
,它确实简化了过程:
Sub updateOutLooktask()
Dim ol As New outlook.Application
Set objitem = ol.Session.GetItemFromID(Me.strEntryID)
objitem.Subject = Me.strSubject
objitem.Body = Me.strBody
objitem.Importance = Me.intImportance
objitem.Owner = Me.strOwner
objitem.StartDate = Nz(Me.dtStartDate, #1/1/4501#)
objitem.DueDate = Nz(Me.dtDueDate, #1/1/4501#)
objitem.Status = Me.intStatus
objitem.PercentComplete = Me.intPercentComplete
objitem.Complete = Me.blComplete
objitem.TotalWork = Me.intTotalWork
objitem.ActualWork = Me.intActualwork
objitem.Categories = Me.strCategories
objitem.Save
End Sub
再次感谢您的帮助为什么不在循环中执行“for Each objItem in objItems”,为什么需要额外的控制变量和设置过程?另外,您的意思是使用:Application.Session.GetItemFromID(Me.strEntryID)?如果要更改集合的项,请不要使用“for Each”。为什么?我能理解您是否在添加/删除,但只是在更改?收藏可以自由更改其顺序。