删除 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 项目。例如,看看以下文章:
我已经和这个吵了几天了。我被要求创建一个 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 项目。例如,看看以下文章: