删除 Outlook 日历生日的插件 VB.net

Plugin to delete Outlook calendar birthdays VB.net

我已经和这个吵了几天了。我被要求创建一个 Outlook 插件(适用于 Outlook 2013),它将删除我们使用的 CRM 系统已同步到 Outlook 日历的所有生日。

在我的测试中,我让插件正常工作,因此它删除了一些生日,但不是全部。为了测试,我将 6 个联系人的生日添加到日历中,当我 运行 插件时,它似乎一次只能删除 4 个或更少。我需要重新启动 Outlook 并再次安装插件 运行,以便删除更多生日。启动时插件 运行s。我还用计时器测试过等待 60 秒然后尝试,但结果相同。我似乎无法删除主题中带有“生日”的所有约会。

请看下面我的代码。

Public Class ThisAddIn

    Private WithEvents _timer As New System.Windows.Forms.Timer()

    Dim objAppointment As Outlook.AppointmentItem
    Dim lngDeletedAppointements As Long
    Dim objCalFolder As Outlook.MAPIFolder
    Dim objNamespace As Outlook.NameSpace
    Dim strSubject As String



    Private Sub ThisAddIn_Startup() Handles Me.Startup        

        objNamespace = Application.GetNamespace("MAPI")
        objCalFolder = objNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
        Dim objCalItems As Outlook.Items = objCalFolder.Items


        '******************************** Set Criteria for DELETION here ********************************
        strSubject = "Birthday"

        '************************************************************************************************

        'Get first appointment item   and store in 'appitem'
        Dim apptItem As Outlook.AppointmentItem = objCalItems.GetFirst

        'While appitem has appointments stored, if an appointment's subject contains "Birthday" delete it.
        Do While apptItem IsNot Nothing
            If apptItem.Subject.Contains(strSubject) Then
                apptItem.Delete()
                lngDeletedAppointements = lngDeletedAppointements + 1
            End If

            apptItem = objCalItems.GetNext
        Loop

        'Display Messagebox informing how many birthdays were deleted
        System.Windows.Forms.MessageBox.Show(lngDeletedAppointements.ToString + " Birthdays deleted.", "DELETE Birthdays")

        'Cleanup
        objNamespace = Nothing
        objCalFolder = Nothing
        objCalItems = Nothing
        apptItem = Nothing
        lngDeletedAppointements = Nothing
        strSubject = Nothing
    End Sub

我在删除过程中使用 Do While 循环,因为我读过使用 For Each 循环会导致索引在集合中搞砸了,实际上只有集合中大约一半的项目会被删除(我也试过这个)。Do While 循环似乎提供相同的结果.我很困惑!

提前感谢您提出任何建议。我觉得这应该如此简单,但当然它从来没有!我对插件开发很陌生,而且还是一个非常初级的程序员。如果需要任何其他信息,请告诉我,我很乐意提供。

再次感谢!

您是否尝试过递减 'For' 循环,例如,

For value as Integer = objCalItems.Count to 0 Step -1
    apptItem = objCalItems(value)

    If apptItem.Subject.Contains(strSubject) Then
        apptItem.Delete()
        lngDeletedAppointements = lngDeletedAppointements + 1
    Else
        Marshal.ReleaseComObject(apptItem)
    End If

希望对您有所帮助。

不要遍历文件夹中的所有项目,而是使用项目 class 的 Find/FindNext or Restrict 方法来查找符合您条件的 Outlook 项目。例如,看看以下文章: