使用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

我正在尝试使用VBA从Access更新outlook任务。请参阅下面的代码。这是类中的一个过程。 我首先查找匹配两个条件的任务(这是有效的),然后我想更新任务字段

有人知道为什么这不起作用吗?有没有办法

代码正在运行,没有显示任何错误消息,但任务没有得到更新。我不希望删除该任务并创建一个类似的任务(我会丢失创建日期)

非常感谢

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”。为什么?我能理解您是否在添加/删除,但只是在更改?收藏可以自由更改其顺序。